新增 SMS 验证码注册、8 国手机号选择与 Redis 频控;优化登录/注册 UI 及图形验证码样式。 Co-authored-by: Cursor <cursoragent@cursor.com>
108 lines
2.8 KiB
YAML
108 lines
2.8 KiB
YAML
# 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:
|