feat(deploy): add Docker full-stack deployment and server pack scripts

Enable one-click production deploy via docker-compose.prod.yml, with deployment docs and zip packaging for Baota upload.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-08 16:24:06 +08:00
parent 0d761db70b
commit e52cac7444
16 changed files with 673 additions and 2 deletions

100
docker-compose.prod.yml Normal file
View File

@@ -0,0 +1,100 @@
# 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}
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:-8080}: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: