services: # 后端API服务 backend: build: context: ../backend dockerfile: Dockerfile container_name: h3c-onu-ms-backend ports: - "${BACKEND_PORT:-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} - CASDOOR_REDIRECT_URL=${CASDOOR_REDIRECT_URL:-} - CASDOOR_ISSUER=${CASDOOR_ISSUER:-} - SECRET_KEY=${SECRET_KEY} - CREDENTIAL_ENCRYPTION_KEY=${CREDENTIAL_ENCRYPTION_KEY} - DEBUG=${DEBUG:-false} - CORS_ORIGINS=${CORS_ORIGINS:-} - FRONTEND_URL=${FRONTEND_URL:-https://onu.dhdx.fun} - NTP_OLD_SERVER=${NTP_OLD_SERVER:-172.16.0.254} - NTP_NEW_SERVER=${NTP_NEW_SERVER:-172.16.1.252} - IMC_API_URL=${IMC_API_URL:-} - IMC_API_USERNAME=${IMC_API_USERNAME:-} - IMC_API_PASSWORD=${IMC_API_PASSWORD:-} - 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:-} 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} - CASDOOR_ISSUER=${CASDOOR_ISSUER:-} - SECRET_KEY=${SECRET_KEY} - CREDENTIAL_ENCRYPTION_KEY=${CREDENTIAL_ENCRYPTION_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} - CASDOOR_ISSUER=${CASDOOR_ISSUER:-} - SECRET_KEY=${SECRET_KEY} - CREDENTIAL_ENCRYPTION_KEY=${CREDENTIAL_ENCRYPTION_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 # 前端应用(生产模式:nginx 静态文件服务) frontend: build: context: ../frontend dockerfile: Dockerfile container_name: h3c-onu-ms-frontend ports: - "${FRONTEND_PORT:-18062}:80" depends_on: - backend restart: unless-stopped healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:80/health"] interval: 30s timeout: 10s retries: 3 networks: default: name: h3c-onu-ms-network