services: # ======================== # Backend Service # ======================== backend: build: context: ./backend dockerfile: Dockerfile container_name: picanalysis-backend restart: unless-stopped environment: NODE_ENV: production DATABASE_URL: file:./prod.db PORT: 13057 CORS_ORIGIN: http://localhost:13056 JWT_SECRET: ${JWT_SECRET} JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-24h} OCR_PROVIDER: ${OCR_PROVIDER:-tesseract} OCR_CONFIDENCE_THRESHOLD: ${OCR_CONFIDENCE_THRESHOLD:-0.3} BAIDU_OCR_API_KEY: ${BAIDU_OCR_API_KEY:-} BAIDU_OCR_SECRET_KEY: ${BAIDU_OCR_SECRET_KEY:-} GLM_API_KEY: ${GLM_API_KEY:-} GLM_API_URL: ${GLM_API_URL:-https://open.bigmodel.cn/api/paas/v4/chat/completions} GLM_MODEL: ${GLM_MODEL:-glm-4-flash} MINIMAX_API_KEY: ${MINIMAX_API_KEY:-} DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-} UPLOAD_MAX_SIZE: ${UPLOAD_MAX_SIZE:-10485760} UPLOAD_ALLOWED_TYPES: ${UPLOAD_ALLOWED_TYPES:-image/jpeg,image/png,image/webp} volumes: # Persist database and uploads - backend-data:/app/data - backend-uploads:/app/uploads networks: - picanalysis-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:13057/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # ======================== # Frontend Service # ======================== frontend: build: context: ./frontend dockerfile: Dockerfile container_name: picanalysis-frontend restart: unless-stopped ports: - "${FRONTEND_PORT:-13056}:80" networks: - picanalysis-network depends_on: - backend # ======================== # Volumes # ======================== volumes: backend-data: driver: local backend-uploads: driver: local # ======================== # Networks # ======================== networks: picanalysis-network: driver: bridge