# Staging Docker Compose(预发环境,仅开发/测试) version: '3.8' services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: danyang_match_staging POSTGRES_USER: staging POSTGRES_PASSWORD: staging_dev_password_change_me ports: - "5433:5432" volumes: - postgres_staging_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U staging -d danyang_match_staging"] interval: 10s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6380:6379" command: redis-server --appendonly yes --requirepass staging-redis-pass-change-me volumes: - redis_staging_data:/data healthcheck: test: ["CMD", "redis-cli", "-a", "staging-redis-pass-change-me", "ping"] interval: 10s timeout: 5s retries: 5 seaweedfs: # 同 docker-compose.yml:对象存储已从 MinIO 换成 SeaweedFS(钉 4.47)。 # staging 与本地/生产保持同一实现,避免「只有预发用的是另一套存储」这类偏差。 image: chrislusf/seaweedfs:4.47 container_name: danyang-match-staging-seaweedfs # 必须覆盖 entrypoint:镜像 ENTRYPOINT 是 /usr/bin/weed,只写 command 会被追加成 # `weed sh -c ...` → `weed: unknown subcommand "sh"`(本地实测踩到)。 entrypoint: ["sh", "-c"] command: - | cat > /tmp/s3cfg.json < $$code" done restart: "no" backend: build: context: ../backend dockerfile: Dockerfile container_name: danyang-match-staging-backend depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: SPRING_PROFILES_ACTIVE: staging DB_HOST: postgres DB_PORT: 5432 DB_NAME: danyang_match_staging DB_USER: staging DB_PASSWORD: staging_dev_password_change_me REDIS_HOST: redis REDIS_PORT: 6379 REDIS_PASSWORD: staging-redis-pass-change-me MINIO_ENDPOINT: http://seaweedfs:8333 # 客户端直传 presigned URL 用:staging S3 网关 publish 到宿主 8334。 MINIO_PUBLIC_ENDPOINT: http://localhost:8334 MINIO_ACCESS_KEY: staging MINIO_SECRET_KEY: staging_dev_password JWT_ACCESS_SECRET: staging-access-secret-dev-only JWT_REFRESH_SECRET: staging-refresh-secret-dev-only CHECKIN_TOKEN_SECRET: staging-checkin-secret-dev-only ENCRYPTION_KEY: 32539f3d2fa8123dcec899cc3dbee7347034123a126ac22fcb4702e10c454d50 FEATURES_APPEAL_ENABLED: "true" ports: - "8081:8080" healthcheck: # 探针用 127.0.0.1 而非 localhost:busybox wget 解析 localhost 时可能优先取 ::1, # 而服务若只绑 IPv4 会导致探针假失败(本地栈的 nginx 已实测踩到)。 test: ["CMD-SHELL", "curl -f http://127.0.0.1:8080/api/v1/health/ready || exit 1"] interval: 30s timeout: 10s retries: 3 admin-web: build: context: ../admin-web dockerfile: Dockerfile container_name: danyang-match-staging-admin depends_on: - backend ports: # staging 与生产同机共存,全部端口按「生产 + 1」错开(5433/6380/8081/13521)。 # 生产管理端为 13520(admin-web/vite.config.ts + docker-compose.prod.yml), # 故此处为 13521 —— 与 tests/uat/run-uat.sh 的 UAT_ADMIN_URL 默认值一致, # 两处均由 ui-tests/ui-document-baseline-contracts.mjs 钉住。 # 管理端构建产物部署在 /admin/ 子路径下(见 admin-web/vite.config.ts 的 base), # 故直连访问地址为 http://localhost:13521/admin/ 。 - "13521:80" volumes: postgres_staging_data: redis_staging_data: seaweedfs_staging_data: