上一轮为让 CI 先跑通,minio 临时改用 quay.io 的 latest 滚动 tag,并在 e2e job 里 加了一步打印实际版本。该步骤的实测输出为: minio version RELEASE.2025-09-07T16-13-09Z (commit-id=07c3a429bfed…) 即 latest 当前正指向这个版本 —— 与本仓库原先在 Docker Hub 上钉的 tag 完全一致。 据此把三处 compose(本地 / staging / prod)统一钉死为 quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z,恢复「可复现」这一原则: 日后即使 quay 上的 latest 滚动到别的版本,本配置也不受影响。 保留 e2e 中「校验钉版镜像可拉取并打印版本」这一步 —— 镜像拉取失败在 compose up 里会埋进几十行输出,独立一步能在起栈前秒级暴露「上游镜像下架」这类外部依赖失效。 上一轮结果:7 个 job 全部 success,GitHub Actions 首次跑绿。
150 lines
4.7 KiB
YAML
150 lines
4.7 KiB
YAML
# 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 问题。
|
||
# 版本与本地/CI 保持一致,钉死为 CI 实测确认可用的 RELEASE.2025-09-07T16-13-09Z。
|
||
image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
|
||
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
|