# ============================================ # 单体部署编排 # 中间件通过 profiles 按需启用: # --profile mysql → Docker MySQL # --profile redis → Docker Redis # --profile minio → Docker MinIO # --profile frontend → 前端 Nginx # 启动顺序由 deploy.sh 控制,app 不写 depends_on # ============================================ services: mysql: build: ../db image: ${APP_NAME}-mysql:latest container_name: ${APP_NAME}-mysql restart: unless-stopped ports: - "${MYSQL_PORT:-3306}:3306" environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_NAME} TZ: Asia/Shanghai command: --lower_case_table_names=1 volumes: - mysql-data:/var/lib/mysql healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 10s timeout: 5s retries: 10 start_period: 60s profiles: - mysql networks: - default redis: image: redis:7-alpine container_name: ${APP_NAME}-redis restart: unless-stopped ports: - "0.0.0.0:${REDIS_HOST_PORT:-6379}:6379" command: redis-server --appendonly yes ${REDIS_PASS:+--requirepass $REDIS_PASS} volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 profiles: - redis networks: - default # MinIO 文件存储(可选,通过 --profile minio 启用) minio: image: minio/minio:RELEASE.2025-04-08T15-41-24Z container_name: ${APP_NAME}-minio restart: unless-stopped ports: - "${MINIO_PORT:-9000}:9000" - "${MINIO_CONSOLE_PORT:-9001}:9001" environment: MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-minioadmin} command: server /data --console-address ":9001" volumes: - minio-data:/data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 10s retries: 3 profiles: - minio networks: - default app: build: context: .. dockerfile: Dockerfile image: ${APP_NAME}-backend:latest container_name: ${APP_NAME}-backend restart: unless-stopped ports: - "0.0.0.0:${APP_PORT}:8081" env_file: - .env environment: SPRING_PROFILES_ACTIVE: prod volumes: - ./config/application-prod.yml:/app/config/application-prod.yml:ro - /opt/upFiles:/opt/upFiles networks: - default # 前端(可选,通过 --profile frontend 启用) # 启用前需先在 ghb-frontend 目录执行 pnpm build 生成 dist/ frontend: build: context: ../../ghb-frontend dockerfile: deploy/Dockerfile image: ${APP_NAME}-frontend:latest container_name: ${APP_NAME}-frontend restart: unless-stopped ports: - "${FRONTEND_PORT:-80}:80" environment: BACKEND_PROXY: http://${APP_NAME}-backend:8081/ghb profiles: - frontend networks: - default volumes: mysql-data: redis-data: minio-data: networks: default: name: ${NETWORK_NAME:-ghb-net}