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

View File

@ -19,7 +19,7 @@ services:
environment:
POSTGRES_USER: ${POSTGRES_USER:-rwa_user}
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:
- "5432:5432"
volumes:
@ -493,6 +493,47 @@ services:
networks:
- 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
# ===========================================================================

View File

@ -12,7 +12,7 @@ EOSQL
}
# 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"
done