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} 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} 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} 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