# TheBet365 全栈生产部署 # 一键启动: docker compose -f docker-compose.prod.yml up -d --build # 首次部署建议 SEED_DATABASE=true(见 .env.docker) 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: build: context: . dockerfile: docker/api/Dockerfile container_name: thebet365-api environment: DATABASE_URL: postgresql://thebet365:${POSTGRES_PASSWORD:-thebet365}@postgres:5432/thebet365 REDIS_URL: redis://redis:6379 JWT_SECRET: ${JWT_SECRET:-change-me-in-production-use-long-random-string} JWT_PLAYER_EXPIRES: ${JWT_PLAYER_EXPIRES:-24h} JWT_ADMIN_EXPIRES: ${JWT_ADMIN_EXPIRES:-2h} JWT_AGENT_EXPIRES: ${JWT_AGENT_EXPIRES:-8h} PORT: 3000 NODE_ENV: production UPLOAD_DIR: /app/uploads SEED_DATABASE: ${SEED_DATABASE:-false} CHUANGLAN_ACCOUNT: ${CHUANGLAN_ACCOUNT} CHUANGLAN_PASSWORD: ${CHUANGLAN_PASSWORD} CHUANGLAN_ENDPOINT: ${CHUANGLAN_ENDPOINT:-https://sgap.253.com/send/sms} CHUANGLAN_CONNECT_TIMEOUT_MS: ${CHUANGLAN_CONNECT_TIMEOUT_MS:-10000} CHUANGLAN_READ_TIMEOUT_MS: ${CHUANGLAN_READ_TIMEOUT_MS:-10000} SMS_CODE_TTL_SECONDS: ${SMS_CODE_TTL_SECONDS:-300} SMS_RATE_LIMIT_SECONDS: ${SMS_RATE_LIMIT_SECONDS:-60} volumes: - uploads_data:/app/uploads depends_on: postgres: condition: service_healthy redis: condition: service_healthy ports: - '${API_PORT:-3000}:3000' restart: unless-stopped networks: - thebet365 player: build: context: . dockerfile: docker/player/Dockerfile container_name: thebet365-player depends_on: - api ports: - '${PLAYER_PORT:-8082}:80' restart: unless-stopped networks: - thebet365 admin: build: context: . dockerfile: docker/admin/Dockerfile container_name: thebet365-admin depends_on: - api ports: - '${ADMIN_PORT:-8081}:80' restart: unless-stopped networks: - thebet365 networks: thebet365: name: thebet365 volumes: postgres_data: redis_data: uploads_data: