refactor(infra): 统一微服务基础设施为共享模式

- 将 presence-service 添加到主 docker-compose.yml(端口 3011,Redis DB 10)
- 更新 init-databases.sh 添加 rwa_admin 和 rwa_presence 数据库
- 重构 admin-service/deploy.sh 使用共享基础设施
- 重构 presence-service/deploy.sh 使用共享基础设施
- 添加 authorization-service 开发指南文档

解决多个微服务独立启动重复基础设施(PostgreSQL/Redis/Kafka)的问题

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Developer 2025-12-02 20:46:50 -08:00
parent d6227a574b
commit 893399e07f
3 changed files with 66 additions and 24 deletions

View File

@ -31,14 +31,14 @@ log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")" SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
# Load environment # Load environment from parent services directory (shared .env)
load_env() { load_env() {
if [ -f "$SCRIPT_DIR/.env" ]; then if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SCRIPT_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SCRIPT_DIR"
elif [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs) export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SERVICES_DIR" log_info "Loaded .env from $SERVICES_DIR"
elif [ -f "$SCRIPT_DIR/.env" ]; then
export $(cat "$SCRIPT_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SCRIPT_DIR"
fi fi
} }
@ -76,9 +76,9 @@ case "$1" in
start) start)
show_banner show_banner
load_env load_env
log_info "Starting $SERVICE_NAME..." log_info "Starting $SERVICE_NAME using shared infrastructure..."
cd "$SCRIPT_DIR" cd "$SERVICES_DIR"
docker compose up -d docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started" log_success "$SERVICE_NAME started"
log_info "Waiting for service to be healthy..." log_info "Waiting for service to be healthy..."
sleep 5 sleep 5
@ -88,8 +88,8 @@ case "$1" in
stop) stop)
show_banner show_banner
log_info "Stopping $SERVICE_NAME..." log_info "Stopping $SERVICE_NAME..."
cd "$SCRIPT_DIR" docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker compose down docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped" log_success "$SERVICE_NAME stopped"
;; ;;
@ -102,17 +102,17 @@ case "$1" in
up) up)
show_banner show_banner
load_env load_env
log_info "Starting all services (foreground)..." log_info "Starting $SERVICE_NAME in foreground..."
cd "$SCRIPT_DIR" cd "$SERVICES_DIR"
docker compose up docker compose up "$SERVICE_NAME"
;; ;;
down) down)
show_banner show_banner
log_info "Stopping and removing all containers..." log_info "Stopping $SERVICE_NAME container..."
cd "$SCRIPT_DIR" docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker compose down -v docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "All containers and volumes removed" log_success "$SERVICE_NAME container removed"
;; ;;
# ========================================================================= # =========================================================================
@ -127,8 +127,8 @@ case "$1" in
;; ;;
logs-all) logs-all)
cd "$SCRIPT_DIR" cd "$SERVICES_DIR"
docker compose logs -f docker compose logs -f "$SERVICE_NAME"
;; ;;
status) status)
@ -263,9 +263,10 @@ case "$1" in
clean-all) clean-all)
show_banner show_banner
log_warn "Cleaning $SERVICE_NAME (removing containers, volumes, and images)..." log_warn "Cleaning $SERVICE_NAME (removing container and image)..."
cd "$SCRIPT_DIR" docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker compose down -v --rmi local docker rm "$CONTAINER_NAME" 2>/dev/null || true
docker rmi "$IMAGE_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME fully cleaned" log_success "$SERVICE_NAME fully cleaned"
;; ;;

View File

@ -19,7 +19,7 @@ services:
environment: environment:
POSTGRES_USER: ${POSTGRES_USER:-rwa_user} POSTGRES_USER: ${POSTGRES_USER:-rwa_user}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-rwa_secure_password} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-rwa_secure_password}
POSTGRES_MULTIPLE_DATABASES: rwa_identity,rwa_wallet,rwa_mpc,rwa_backup,rwa_planting,rwa_referral,rwa_reward,rwa_leaderboard,rwa_reporting,rwa_authorization,rwa_admin POSTGRES_MULTIPLE_DATABASES: rwa_identity,rwa_wallet,rwa_mpc,rwa_backup,rwa_planting,rwa_referral,rwa_reward,rwa_leaderboard,rwa_reporting,rwa_authorization,rwa_admin,rwa_presence
ports: ports:
- "5432:5432" - "5432:5432"
volumes: volumes:
@ -493,6 +493,47 @@ services:
networks: networks:
- rwa-network - rwa-network
presence-service:
build:
context: ./presence-service
dockerfile: Dockerfile
container_name: rwa-presence-service
ports:
- "3011:3011"
environment:
- NODE_ENV=production
- APP_PORT=3011
- API_PREFIX=api/v1
- DATABASE_URL=postgresql://${POSTGRES_USER:-rwa_user}:${POSTGRES_PASSWORD:-rwa_secure_password}@postgres:5432/rwa_presence?schema=public
- JWT_SECRET=${JWT_SECRET}
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=${REDIS_PASSWORD:-}
- REDIS_DB=10
- KAFKA_ENABLED=true
- KAFKA_BROKERS=kafka:29092
- KAFKA_CLIENT_ID=presence-service
- KAFKA_GROUP_ID=presence-service-group
- PRESENCE_WINDOW_SECONDS=180
- SNAPSHOT_INTERVAL_SECONDS=60
- TZ=Asia/Shanghai
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
kafka:
condition: service_started
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3011/api/v1/health"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s
restart: unless-stopped
networks:
- rwa-network
# =========================================================================== # ===========================================================================
# Volumes # Volumes
# =========================================================================== # ===========================================================================

View File

@ -12,7 +12,7 @@ EOSQL
} }
# Create all required databases # Create all required databases
for db in rwa_identity rwa_wallet rwa_mpc rwa_backup rwa_planting rwa_referral rwa_reward rwa_leaderboard rwa_reporting rwa_authorization; do for db in rwa_identity rwa_wallet rwa_mpc rwa_backup rwa_planting rwa_referral rwa_reward rwa_leaderboard rwa_reporting rwa_authorization rwa_admin rwa_presence; do
create_database "$db" create_database "$db"
done done