118 lines
3.2 KiB
YAML
118 lines
3.2 KiB
YAML
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}
|
|
# OCR Services URLs
|
|
RAPIDOCR_API_URL: ${RAPIDOCR_API_URL:-http://rapidocr:9004}
|
|
PADDLEOCR_API_URL: ${PADDLEOCR_API_URL:-http://paddleocr:8866}
|
|
volumes:
|
|
# Persist database and uploads
|
|
- backend-data:/app/data
|
|
- backend-uploads:/app/uploads
|
|
networks:
|
|
- picanalysis-network
|
|
depends_on:
|
|
- rapidocr
|
|
- paddleocr
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:13057/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
|
|
# ========================
|
|
# RapidOCR Service (本地快速 OCR)
|
|
# ========================
|
|
rapidocr:
|
|
image: volador/rapidocr:latest
|
|
container_name: picanalysis-rapidocr
|
|
restart: unless-stopped
|
|
ports:
|
|
- "13058:9004"
|
|
networks:
|
|
- picanalysis-network
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:9004"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 20s
|
|
|
|
# ========================
|
|
# PaddleOCR Service (本地高精度 OCR - 使用官方预构建镜像)
|
|
# ========================
|
|
paddleocr:
|
|
image: 987846/paddleocr:latest
|
|
container_name: picanalysis-paddleocr
|
|
restart: unless-stopped
|
|
ports:
|
|
- "13059:8866"
|
|
environment:
|
|
# 修复 protobuf 兼容性问题
|
|
PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION: python
|
|
networks:
|
|
- picanalysis-network
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8866/"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 60s
|
|
|
|
# ========================
|
|
# 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
|