services: # 后端API服务 backend: build: context: ../backend dockerfile: Dockerfile container_name: h3c-onu-ms-backend ports: - "8001:8000" environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - CASDOOR_ENDPOINT=${CASDOOR_ENDPOINT} - CASDOOR_CLIENT_ID=${CASDOOR_CLIENT_ID} - CASDOOR_CLIENT_SECRET=${CASDOOR_CLIENT_SECRET} - CASDOOR_CERTIFICATE=${CASDOOR_CERTIFICATE} - CASDOOR_ORG_NAME=${CASDOOR_ORG_NAME} - CASDOOR_APP_NAME=${CASDOOR_APP_NAME} - SECRET_KEY=${SECRET_KEY} - DEBUG=${DEBUG:-false} - WECHAT_CORPID=${WECHAT_CORPID:-} - WECHAT_CORPSECRET=${WECHAT_CORPSECRET:-} - WECHAT_AGENTID=${WECHAT_AGENTID:-} - WECHAT_TOKEN=${WECHAT_TOKEN:-} - WECHAT_ENCODING_AES_KEY=${WECHAT_ENCODING_AES_KEY:-} - WECHAT_USE_PROXY=${WECHAT_USE_PROXY:-True} - WECHAT_PROXY_API_URL=${WECHAT_PROXY_API_URL:-https://api.v6ole.top} volumes: - ../backend/logs:/app/logs - ../backend/static:/app/static restart: unless-stopped healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Celery Worker - 处理异步任务 celery-worker: build: context: ../backend dockerfile: Dockerfile container_name: h3c-onu-ms-celery-worker command: celery -A app.core.celery_app worker --loglevel=info --concurrency=4 environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - CASDOOR_ENDPOINT=${CASDOOR_ENDPOINT} - CASDOOR_CLIENT_ID=${CASDOOR_CLIENT_ID} - CASDOOR_CLIENT_SECRET=${CASDOOR_CLIENT_SECRET} - CASDOOR_CERTIFICATE=${CASDOOR_CERTIFICATE} - CASDOOR_ORG_NAME=${CASDOOR_ORG_NAME} - CASDOOR_APP_NAME=${CASDOOR_APP_NAME} - SECRET_KEY=${SECRET_KEY} - WECHAT_CORPID=${WECHAT_CORPID:-} - WECHAT_CORPSECRET=${WECHAT_CORPSECRET:-} - WECHAT_AGENTID=${WECHAT_AGENTID:-} - WECHAT_TOKEN=${WECHAT_TOKEN:-} - WECHAT_ENCODING_AES_KEY=${WECHAT_ENCODING_AES_KEY:-} - WECHAT_USE_PROXY=${WECHAT_USE_PROXY:-True} - WECHAT_PROXY_API_URL=${WECHAT_PROXY_API_URL:-https://api.v6ole.top} volumes: - ../backend/logs:/app/logs depends_on: - backend restart: unless-stopped # Celery Beat - 定时任务调度 celery-beat: build: context: ../backend dockerfile: Dockerfile container_name: h3c-onu-ms-celery-beat command: celery -A app.core.celery_app beat --loglevel=info environment: - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - CASDOOR_ENDPOINT=${CASDOOR_ENDPOINT} - CASDOOR_CLIENT_ID=${CASDOOR_CLIENT_ID} - CASDOOR_CLIENT_SECRET=${CASDOOR_CLIENT_SECRET} - CASDOOR_CERTIFICATE=${CASDOOR_CERTIFICATE} - CASDOOR_ORG_NAME=${CASDOOR_ORG_NAME} - CASDOOR_APP_NAME=${CASDOOR_APP_NAME} - SECRET_KEY=${SECRET_KEY} - WECHAT_CORPID=${WECHAT_CORPID:-} - WECHAT_CORPSECRET=${WECHAT_CORPSECRET:-} - WECHAT_AGENTID=${WECHAT_AGENTID:-} - WECHAT_TOKEN=${WECHAT_TOKEN:-} - WECHAT_ENCODING_AES_KEY=${WECHAT_ENCODING_AES_KEY:-} - WECHAT_USE_PROXY=${WECHAT_USE_PROXY:-True} - WECHAT_PROXY_API_URL=${WECHAT_PROXY_API_URL:-https://api.v6ole.top} volumes: - ../backend/logs:/app/logs depends_on: - backend restart: unless-stopped # 前端应用 frontend: build: context: ../frontend dockerfile: Dockerfile container_name: h3c-onu-ms-frontend ports: - "5173:5173" environment: - VITE_API_BASE_URL=${VITE_API_BASE_URL:-http://localhost:8001} - VITE_API_PROXY_TARGET=http://backend:8000 - VITE_CASDOOR_ENDPOINT=${VITE_CASDOOR_ENDPOINT} - VITE_CASDOOR_CLIENT_ID=${VITE_CASDOOR_CLIENT_ID} - VITE_CASDOOR_ORG_NAME=${VITE_CASDOOR_ORG_NAME} - VITE_CASDOOR_APP_NAME=${VITE_CASDOOR_APP_NAME} depends_on: - backend restart: unless-stopped healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:5173"] interval: 30s timeout: 10s retries: 3 networks: default: name: h3c-onu-ms-network