version: '3.8' services: # 后端服务 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=${DB_NAME:-scoring_system} - DB_USER=${DB_USER:-postgres} - DB_PASSWORD=${DB_PASSWORD:-password} - DB_HOST=${DB_HOST:-localhost} - DB_PORT=${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} networks: - scoring_network healthcheck: test: ["CMD", "python", "-c", "import requests; requests.get('http://localhost:8000/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 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