# TheBet365 全栈生产部署 # 首次部署: ./scripts/deploy-first.sh # 后续更新: ./scripts/deploy-update.sh services: postgres: image: postgres:16-alpine container_name: thebet365-postgres environment: POSTGRES_USER: thebet365 POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-thebet365} POSTGRES_DB: thebet365 volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ['CMD-SHELL', 'pg_isready -U thebet365'] interval: 5s timeout: 5s retries: 10 restart: unless-stopped networks: - thebet365 redis: image: redis:7-alpine container_name: thebet365-redis volumes: - redis_data:/data healthcheck: test: ['CMD', 'redis-cli', 'ping'] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - thebet365 api: image: thebet365-api:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/api/Dockerfile container_name: thebet365-api env_file: - path: .env.docker required: false environment: DATABASE_URL: postgresql://thebet365:${POSTGRES_PASSWORD:-thebet365}@postgres:5432/thebet365 REDIS_URL: redis://redis:6379 PORT: 3000 NODE_ENV: production UPLOAD_DIR: /app/uploads RUN_MIGRATIONS_ON_START: ${RUN_MIGRATIONS_ON_START:-false} volumes: - uploads_data:/app/uploads depends_on: postgres: condition: service_healthy redis: condition: service_healthy expose: - '3000' healthcheck: test: [ 'CMD-SHELL', "node -e \"fetch('http://127.0.0.1:3000/api/health/ready').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", ] interval: 10s timeout: 5s retries: 12 start_period: 20s restart: unless-stopped networks: - thebet365 player: image: thebet365-player:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/player/Dockerfile container_name: thebet365-player depends_on: api: condition: service_healthy ports: - '${BIND_ADDR:-127.0.0.1}:${PLAYER_PORT:-8082}:80' healthcheck: test: ['CMD-SHELL', 'wget -q -O /dev/null http://127.0.0.1/ || exit 1'] interval: 10s timeout: 5s retries: 6 start_period: 10s restart: unless-stopped networks: - thebet365 admin: image: thebet365-admin:${IMAGE_TAG:-latest} build: context: . dockerfile: docker/admin/Dockerfile container_name: thebet365-admin depends_on: api: condition: service_healthy ports: - '${BIND_ADDR:-127.0.0.1}:${ADMIN_PORT:-8081}:80' healthcheck: test: ['CMD-SHELL', 'wget -q -O /dev/null http://127.0.0.1/ || exit 1'] interval: 10s timeout: 5s retries: 6 start_period: 10s restart: unless-stopped networks: - thebet365 networks: thebet365: name: thebet365 volumes: postgres_data: redis_data: uploads_data: