Files
danyang-match/infrastructure/docker-compose.prod.yml
T

149 lines
4.6 KiB
YAML
Raw Normal View History

# Production Docker Compose
# 生产环境配置,敏感信息通过 .env 文件注入,不进 Git
services:
postgres:
image: postgres:16-alpine
container_name: danyang-match-postgres
environment:
POSTGRES_DB: ${DB_NAME:-danyang_match}
POSTGRES_USER: ${DB_USER:-danyang}
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
ports:
- "127.0.0.1:5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./backups:/backups
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-danyang} -d ${DB_NAME:-danyang_match}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- danyang-net
secrets:
- db_password
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: danyang-match-redis
command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD:?请设置REDIS_PASSWORD}
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD:?请设置REDIS_PASSWORD}", "ping"]
interval: 10s
timeout: 5s
retries: 5
networks:
- danyang-net
restart: unless-stopped
minio:
# 同 docker-compose.yml 的 minio 条目:Docker Hub 上 minio/minio 仓库已被整体移除
# (MinIO 自 2025-10 起停止发布容器镜像,仅源码分发),生产环境同样拉不到。
# 改为仍在提供镜像的 quay.io —— 这是真实的部署阻塞,不只是 CI 问题。
image: quay.io/minio/minio:latest
container_name: danyang-match-minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:?请设置MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?请设置MINIO_SECRET_KEY}
volumes:
- minio_data:/data
networks:
- danyang-net
restart: unless-stopped
backend:
build:
context: ../backend
dockerfile: Dockerfile
container_name: danyang-match-backend
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
environment:
SPRING_PROFILES_ACTIVE: docker,production
SPRING_CONFIG_IMPORT: configtree:/run/secrets/
DB_HOST: postgres
DB_PORT: 5432
DB_NAME: ${DB_NAME:-danyang_match}
DB_USER: ${DB_USER:-danyang}
REDIS_HOST: redis
REDIS_PORT: 6379
REDIS_PASSWORD: ${REDIS_PASSWORD:?请设置REDIS_PASSWORD}
MINIO_ENDPOINT: http://minio:9000
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?请设置MINIO_ACCESS_KEY}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?请设置MINIO_SECRET_KEY}
JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET:?请设置JWT_ACCESS_SECRET}
JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET:?请设置JWT_REFRESH_SECRET}
CHECKIN_TOKEN_SECRET: ${CHECKIN_TOKEN_SECRET:?请设置CHECKIN_TOKEN_SECRET}
ENCRYPTION_KEY: ${ENCRYPTION_KEY:?请设置ENCRYPTION_KEY}
WECHAT_APP_ID: ${WECHAT_APP_ID:?请设置WECHAT_APP_ID}
WECHAT_APP_SECRET: ${WECHAT_APP_SECRET:?请设置WECHAT_APP_SECRET}
VERIFICATION_PROVIDER: ${VERIFICATION_PROVIDER:?请设置VERIFICATION_PROVIDER}
SPRING_SECURITY_FALLBACK_PASSWORD: ${SPRING_SECURITY_FALLBACK_PASSWORD:?请设置SPRING_SECURITY_FALLBACK_PASSWORD}
FEATURES_APPEAL_ENABLED: ${FEATURES_APPEAL_ENABLED:-false}
ports:
- "127.0.0.1:8080:8080"
networks:
- danyang-net
secrets:
- source: db_password
target: spring.datasource.password
restart: unless-stopped
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
admin-web:
build:
context: ../admin-web
dockerfile: Dockerfile
container_name: danyang-match-admin
depends_on:
- backend
ports:
# 管理端端口统一 13520(与 admin-web/vite.config.ts 的开发端口一致,
# 由 ui-tests/ui-document-baseline-contracts.mjs 钉住三处一致)。
# 仍绑定 127.0.0.1:对外访问走 nginx 的 80/443 + /admin/,此处仅供本机直连排查。
- "127.0.0.1:13520:80"
networks:
- danyang-net
restart: unless-stopped
nginx:
image: nginx:alpine
container_name: danyang-match-nginx
depends_on:
- backend
- admin-web
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx-production.conf:/etc/nginx/nginx.conf:ro
- ./certs:/etc/nginx/certs:ro
networks:
- danyang-net
restart: unless-stopped
volumes:
postgres_data:
redis_data:
minio_data:
networks:
danyang-net:
driver: bridge
secrets:
db_password:
file: ./secrets/db_password.txt