x-common-env: &common-env TZ: Asia/Shanghai LANG: zh_CN.UTF-8 services: # PostgreSQL数据库服务 postgres: image: postgres:15-alpine container_name: gym-postgres environment: <<: *common-env POSTGRES_DB: gym_system POSTGRES_USER: gym POSTGRES_PASSWORD: gym123 POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=zh_CN.UTF-8" ports: - "55432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./gym-manage-api/manage-db/src/main/resources/db/migration:/docker-entrypoint-initdb.d healthcheck: test: ["CMD-SHELL", "pg_isready -U gym -d gym_system"] interval: 10s timeout: 5s retries: 5 start_period: 30s networks: - gym-network restart: unless-stopped # 后端API服务 backend: build: context: ./gym-manage-api dockerfile: Dockerfile args: - BUILD_VERSION=${BUILD_VERSION:-latest} container_name: gym-backend environment: <<: *common-env SPRING_PROFILES_ACTIVE: docker SPRING_R2DBC_URL: r2dbc:postgresql://postgres:5432/gym_system SPRING_R2DBC_USERNAME: gym SPRING_R2DBC_PASSWORD: gym123 SPRING_JACKSON_TIME_ZONE: Asia/Shanghai MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: health,info,metrics ports: - "8084:8084" depends_on: postgres: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8084/actuator/health"] interval: 30s timeout: 10s retries: 3 start_period: 60s networks: - gym-network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" # 前端Web服务 frontend: build: context: ./gym-manage-web dockerfile: Dockerfile args: - BUILD_VERSION=${BUILD_VERSION:-latest} container_name: gym-frontend ports: - "3001:80" depends_on: backend: condition: service_healthy environment: <<: *common-env VITE_API_BASE_URL: http://backend:8084 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - gym-network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" # Redis缓存服务(可选) redis: image: redis:7-alpine container_name: gym-redis environment: <<: *common-env ports: - "6379:6379" command: redis-server --appendonly yes --requirepass gym123 volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 networks: - gym-network restart: unless-stopped volumes: postgres_data: driver: local redis_data: driver: local networks: gym-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16