version: '3.8' services: # PostgreSQL 数据库 scoring-db: image: postgres:15-alpine container_name: cywl-scoring-db restart: always environment: - POSTGRES_DB=scoring_system - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password volumes: - scoring_db_data:/var/lib/postgresql/data ports: - "5432:5432" networks: - scoring_network healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # 后端服务 scoring-backend: build: context: ./backend dockerfile: Dockerfile container_name: cywl-scoring-backend restart: always volumes: - ./backend/media:/app/media - ./backend/static:/app/static ports: - "8876:8876" environment: - DEBUG=False - SECRET_KEY=${SECRET_KEY:-your-secret-key-change-this} - DB_NAME=scoring_system - DB_USER=postgres - DB_PASSWORD=password - DB_HOST=scoring-db - DB_PORT=5432 - WECHAT_APPID=${WECHAT_APPID} - WECHAT_SECRET=${WECHAT_SECRET} - WECHAT_MCHID=${WECHAT_MCHID} - WECHAT_API_KEY=${WECHAT_API_KEY} - ALIYUN_ACCESS_KEY_ID=${ALIYUN_ACCESS_KEY_ID} - ALIYUN_ACCESS_KEY_SECRET=${ALIYUN_ACCESS_KEY_SECRET} - ALIYUN_OSS_ENDPOINT=${ALIYUN_OSS_ENDPOINT} - ALIYUN_OSS_BUCKET_NAME=${ALIYUN_OSS_BUCKET_NAME} - ALIYUN_TINGWU_APP_KEY=${ALIYUN_TINGWU_APP_KEY} - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY} depends_on: scoring-db: condition: service_healthy networks: - scoring_network healthcheck: test: ["CMD", "python", "-c", "import requests; requests.get('http://localhost:8876/api/health/')"] interval: 30s timeout: 10s retries: 3 start_period: 40s # 前端服务 (Nginx) scoring-frontend: build: context: ./frontend dockerfile: Dockerfile args: - VITE_API_URL=/api container_name: cywl-scoring-frontend restart: always ports: - "80:80" depends_on: scoring-backend: condition: service_healthy volumes: scoring_db_data: networks: - scoring_network healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 # Nginx 反向代理 (可选,用于负载均衡和 SSL) scoring-nginx: image: nginx:alpine container_name: cywl-scoring-nginx restart: always ports: - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro depends_on: - scoring-frontend - scoring-backend networks: - scoring_network profiles: - ssl # 只在需要 SSL 时启动 networks: scoring_network: driver: bridge