feat: Docker化部署 - 單容器架構轉換

將 Tool_OCR 從 macOS conda 環境轉換為 Docker 單容器部署方案。
前後端整合於同一容器,通過 Nginx 反向代理,僅對外暴露單一端口。

## 新增功能
- Docker 單容器架構(Frontend + Backend + Nginx)
- 多階段構建優化鏡像大小
- Supervisor 進程管理
- 健康檢查機制
- 完整部署文檔

## 技術細節
- 對外端口:12015(原 12010 已被佔用)
- 內部架構:Nginx(12015) → FastAPI(8000)
- 前端靜態文件由 Nginx 直接服務
- API 請求通過 Nginx 反向代理

## 系統依賴完善
- libmagic1:文件類型檢測
- LibreOffice:Office 文檔轉換
- paddlex[ocr]:PP-StructureV3 版面分析
- 中日韓字體支援

## 配置調整
- 環境變數路徑:macOS 路徑 → 容器絕對路徑
- 前端 API URL:修正為統一端口 12015
- Pip 安裝:延長超時至 600 秒,重試 5 次
- CRLF 轉換:自動處理 Windows 換行符

## 清理
- 移除臨時文檔(API_FIX_SUMMARY.md 等 7 個文檔)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
beabigegg
2025-11-13 13:12:59 +08:00
parent 57cf91271c
commit 0f81d5e70b
26 changed files with 1166 additions and 2985 deletions

97
docker-compose.yml Normal file
View File

@@ -0,0 +1,97 @@
services:
tool_ocr:
build:
context: .
dockerfile: Dockerfile
image: tool_ocr:latest
container_name: tool_ocr
restart: unless-stopped
ports:
- "12015:12015" # Only one port needed!
environment:
# Database Configuration
- MYSQL_HOST=${MYSQL_HOST:-mysql.theaken.com}
- MYSQL_PORT=${MYSQL_PORT:-33306}
- MYSQL_USER=${MYSQL_USER:-A060}
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-WLeSCi0yhtc7}
- MYSQL_DATABASE=${MYSQL_DATABASE:-db_A060}
# Application Configuration
- BACKEND_PORT=8000 # Internal backend port
- FRONTEND_PORT=12015 # External port
- SECRET_KEY=${SECRET_KEY:-your-secret-key-here-please-change-this}
- ALGORITHM=${ALGORITHM:-HS256}
- ACCESS_TOKEN_EXPIRE_MINUTES=${ACCESS_TOKEN_EXPIRE_MINUTES:-1440}
# OCR Configuration
- PADDLEOCR_MODEL_DIR=/app/backend/models/paddleocr
- OCR_LANGUAGES=${OCR_LANGUAGES:-ch,en,japan,korean}
- OCR_CONFIDENCE_THRESHOLD=${OCR_CONFIDENCE_THRESHOLD:-0.5}
- MAX_OCR_WORKERS=${MAX_OCR_WORKERS:-4}
# File Upload Configuration
- MAX_UPLOAD_SIZE=${MAX_UPLOAD_SIZE:-52428800}
- ALLOWED_EXTENSIONS=${ALLOWED_EXTENSIONS:-png,jpg,jpeg,pdf,bmp,tiff,doc,docx,ppt,pptx}
- UPLOAD_DIR=/app/backend/uploads
- TEMP_DIR=/app/backend/uploads/temp
- PROCESSED_DIR=/app/backend/uploads/processed
- IMAGES_DIR=/app/backend/uploads/images
# Export Configuration
- STORAGE_DIR=/app/backend/storage
- MARKDOWN_DIR=/app/backend/storage/markdown
- JSON_DIR=/app/backend/storage/json
- EXPORTS_DIR=/app/backend/storage/exports
# PDF Generation Configuration
- PANDOC_PATH=/usr/bin/pandoc
- FONT_DIR=/usr/share/fonts
- PDF_PAGE_SIZE=${PDF_PAGE_SIZE:-A4}
- PDF_MARGIN_TOP=${PDF_MARGIN_TOP:-20}
- PDF_MARGIN_BOTTOM=${PDF_MARGIN_BOTTOM:-20}
- PDF_MARGIN_LEFT=${PDF_MARGIN_LEFT:-20}
- PDF_MARGIN_RIGHT=${PDF_MARGIN_RIGHT:-20}
# Translation Configuration (Reserved)
- ENABLE_TRANSLATION=${ENABLE_TRANSLATION:-false}
- TRANSLATION_ENGINE=${TRANSLATION_ENGINE:-offline}
- ARGOSTRANSLATE_MODELS_DIR=/app/backend/models/argostranslate
# Background Tasks Configuration
- TASK_QUEUE_TYPE=${TASK_QUEUE_TYPE:-memory}
# CORS Configuration
- CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:12015,http://127.0.0.1:12015}
# Logging Configuration
- LOG_LEVEL=${LOG_LEVEL:-INFO}
- LOG_FILE=/app/backend/logs/app.log
volumes:
# Persist data directories
- ./data/uploads:/app/backend/uploads
- ./data/storage:/app/backend/storage
- ./data/models:/app/backend/models
- ./data/logs:/app/backend/logs
networks:
- tool_ocr_network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:12010/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
tool_ocr_network:
driver: bridge
volumes:
uploads:
storage:
models:
logs: