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:
524
DOCKER_DEPLOYMENT.md
Normal file
524
DOCKER_DEPLOYMENT.md
Normal file
@@ -0,0 +1,524 @@
|
||||
# Tool_OCR Docker 部署指南
|
||||
|
||||
## 架構說明
|
||||
|
||||
Tool_OCR 使用統一容器架構,將前端和後端封裝在同一個容器中:
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Container (tool_ocr) │
|
||||
│ │
|
||||
│ ┌──────────────────────────────┐ │
|
||||
│ │ Nginx :12010 (External) │ │
|
||||
│ │ - Frontend Static Files │ │
|
||||
│ │ - Reverse Proxy for API │ │
|
||||
│ └─────────┬────────────────────┘ │
|
||||
│ │ proxy_pass │
|
||||
│ ▼ │
|
||||
│ ┌──────────────────────────────┐ │
|
||||
│ │ FastAPI :8000 (Internal) │ │
|
||||
│ │ - OCR Processing │ │
|
||||
│ │ - File Management │ │
|
||||
│ │ - Export Services │ │
|
||||
│ └──────────────────────────────┘ │
|
||||
│ │
|
||||
│ Supervisor manages both services │
|
||||
└─────────────────────────────────────┘
|
||||
│
|
||||
│ Port 12010 only!
|
||||
▼
|
||||
External Access
|
||||
```
|
||||
|
||||
### 優勢
|
||||
|
||||
1. **單一端口**: 只需要暴露一個端口 (12010)
|
||||
2. **簡化部署**: 一個容器包含完整應用
|
||||
3. **統一管理**: Supervisor 管理所有服務
|
||||
4. **生產就緒**: Nginx 提供高性能靜態文件服務和反向代理
|
||||
|
||||
## 快速開始
|
||||
|
||||
### 前置要求
|
||||
|
||||
- Docker Engine 20.10+
|
||||
- Docker Compose 2.0+
|
||||
- 至少 4GB 可用內存
|
||||
- 至少 10GB 可用磁碟空間
|
||||
|
||||
### 1. 準備環境配置
|
||||
|
||||
**複製環境配置範本:**
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
cp .env.docker .env
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
Copy-Item .env.docker .env
|
||||
```
|
||||
|
||||
**編輯 `.env` 文件,至少修改以下重要配置:**
|
||||
|
||||
```bash
|
||||
# 修改為安全的密鑰
|
||||
SECRET_KEY=your-very-secure-random-key-here
|
||||
|
||||
# 根據需要調整端口
|
||||
FRONTEND_PORT=12010
|
||||
|
||||
# 根據實際情況配置 CORS
|
||||
CORS_ORIGINS=http://your-domain.com:12010,http://localhost:12010
|
||||
```
|
||||
|
||||
### 2. 創建數據目錄
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
mkdir -p data/{uploads,storage,models,logs}
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
mkdir -p data/uploads, data/storage, data/models, data/logs
|
||||
```
|
||||
|
||||
或使用跨平台命令:
|
||||
```bash
|
||||
mkdir -p data/uploads data/storage data/models data/logs
|
||||
```
|
||||
|
||||
### 3. 構建並啟動容器
|
||||
|
||||
```bash
|
||||
# 構建映像
|
||||
docker compose build
|
||||
|
||||
# 啟動服務
|
||||
docker compose up -d
|
||||
|
||||
# 查看日誌
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
> 注意:舊版本 Docker 使用 `docker-compose`(帶連字符),新版本使用 `docker compose`(無連字符)。兩者都支持。
|
||||
|
||||
### 4. 驗證部署
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
# 檢查健康狀態
|
||||
curl http://localhost:12010/health
|
||||
|
||||
# 訪問 API 文檔
|
||||
open http://localhost:12010/docs
|
||||
|
||||
# 訪問前端界面
|
||||
open http://localhost:12010
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
# 檢查健康狀態
|
||||
curl http://localhost:12010/health
|
||||
|
||||
# 在瀏覽器中打開
|
||||
Start-Process "http://localhost:12010"
|
||||
Start-Process "http://localhost:12010/docs"
|
||||
```
|
||||
|
||||
## 管理命令
|
||||
|
||||
> 提示:以下命令在 Windows、Linux 和 Mac 上通用。如果您使用舊版 Docker,將 `docker compose` 替換為 `docker-compose`。
|
||||
|
||||
### 查看狀態
|
||||
|
||||
```bash
|
||||
# 查看容器狀態
|
||||
docker compose ps
|
||||
|
||||
# 查看實時日誌
|
||||
docker compose logs -f
|
||||
|
||||
# 查看特定服務日誌
|
||||
docker compose exec tool_ocr tail -f /var/log/nginx/tool_ocr_access.log
|
||||
docker compose exec tool_ocr tail -f /app/backend/logs/app.log
|
||||
```
|
||||
|
||||
### 重啟服務
|
||||
|
||||
```bash
|
||||
# 重啟容器
|
||||
docker compose restart
|
||||
|
||||
# 重啟 Nginx (容器內)
|
||||
docker compose exec tool_ocr supervisorctl restart nginx
|
||||
|
||||
# 重啟 Backend (容器內)
|
||||
docker compose exec tool_ocr supervisorctl restart backend
|
||||
```
|
||||
|
||||
### 停止和清理
|
||||
|
||||
```bash
|
||||
# 停止服務
|
||||
docker compose stop
|
||||
|
||||
# 停止並移除容器
|
||||
docker compose down
|
||||
|
||||
# 完全清理(包括數據卷)⚠️ 慎用
|
||||
docker compose down -v
|
||||
```
|
||||
|
||||
### 進入容器調試
|
||||
|
||||
```bash
|
||||
# 進入容器 shell
|
||||
docker compose exec tool_ocr bash
|
||||
|
||||
# 查看 Supervisor 狀態
|
||||
docker compose exec tool_ocr supervisorctl status
|
||||
|
||||
# 查看進程
|
||||
docker compose exec tool_ocr ps aux
|
||||
```
|
||||
|
||||
## 數據持久化
|
||||
|
||||
以下目錄會持久化到主機的 `./data/` 目錄:
|
||||
|
||||
| 容器內路徑 | 主機路徑 | 說明 |
|
||||
|-----------|---------|------|
|
||||
| `/app/backend/uploads` | `./data/uploads` | 上傳文件 |
|
||||
| `/app/backend/storage` | `./data/storage` | 處理結果 |
|
||||
| `/app/backend/models` | `./data/models` | OCR 模型 |
|
||||
| `/app/backend/logs` | `./data/logs` | 應用日誌 |
|
||||
|
||||
### 備份數據
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
# 備份所有數據
|
||||
tar -czf tool_ocr_backup_$(date +%Y%m%d).tar.gz data/
|
||||
|
||||
# 只備份重要數據
|
||||
tar -czf tool_ocr_data_$(date +%Y%m%d).tar.gz data/uploads data/storage
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
# 備份所有數據(需要安裝 7-Zip 或使用 Compress-Archive)
|
||||
$date = Get-Date -Format "yyyyMMdd"
|
||||
Compress-Archive -Path data -DestinationPath "tool_ocr_backup_$date.zip"
|
||||
|
||||
# 只備份重要數據
|
||||
Compress-Archive -Path data/uploads, data/storage -DestinationPath "tool_ocr_data_$date.zip"
|
||||
```
|
||||
|
||||
### 恢復數據
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
# 停止容器
|
||||
docker compose stop
|
||||
|
||||
# 恢復數據
|
||||
tar -xzf tool_ocr_backup_20250113.tar.gz
|
||||
|
||||
# 啟動容器
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
# 停止容器
|
||||
docker compose stop
|
||||
|
||||
# 恢復數據
|
||||
Expand-Archive -Path tool_ocr_backup_20250113.zip -DestinationPath . -Force
|
||||
|
||||
# 啟動容器
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 1Panel 部署指南
|
||||
|
||||
### 1. 準備項目文件
|
||||
|
||||
在 1Panel 的應用目錄中創建項目:
|
||||
|
||||
```bash
|
||||
cd /opt/1panel/apps
|
||||
mkdir -p tool_ocr
|
||||
cd tool_ocr
|
||||
|
||||
# 上傳項目文件
|
||||
# - Dockerfile
|
||||
# - docker-compose.yml
|
||||
# - docker/ 目錄
|
||||
# - backend/ 目錄
|
||||
# - frontend/ 目錄
|
||||
# - requirements.txt
|
||||
# - .env
|
||||
```
|
||||
|
||||
### 2. 在 1Panel 中創建應用
|
||||
|
||||
1. 登入 1Panel 管理面板
|
||||
2. 進入「應用商店」→「自定義應用」
|
||||
3. 選擇「Docker Compose」
|
||||
4. 上傳或粘貼 `docker-compose.yml` 內容
|
||||
5. 配置環境變量
|
||||
6. 點擊「創建」
|
||||
|
||||
### 3. 配置反向代理(可選)
|
||||
|
||||
如果需要通過域名訪問:
|
||||
|
||||
1. 在 1Panel 中創建網站
|
||||
2. 配置反向代理:
|
||||
- 目標地址: `http://127.0.0.1:12010`
|
||||
- 啟用 WebSocket 支援(如需要)
|
||||
|
||||
### 4. 配置 SSL 證書(可選)
|
||||
|
||||
1. 在 1Panel 網站設置中
|
||||
2. 申請或上傳 SSL 證書
|
||||
3. 啟用 HTTPS
|
||||
|
||||
## 更新部署
|
||||
|
||||
### 更新代碼
|
||||
|
||||
```bash
|
||||
# 停止容器
|
||||
docker compose stop
|
||||
|
||||
# 拉取最新代碼
|
||||
git pull
|
||||
|
||||
# 重新構建映像
|
||||
docker compose build --no-cache
|
||||
|
||||
# 啟動容器
|
||||
docker compose up -d
|
||||
|
||||
# 查看日誌確認啟動成功
|
||||
docker compose logs -f
|
||||
```
|
||||
|
||||
### 數據庫遷移
|
||||
|
||||
如果有數據庫結構變更:
|
||||
|
||||
```bash
|
||||
# 進入容器
|
||||
docker compose exec tool_ocr bash
|
||||
|
||||
# 運行遷移
|
||||
cd /app/backend
|
||||
alembic upgrade head
|
||||
|
||||
# 退出容器
|
||||
exit
|
||||
```
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 1. 容器無法啟動
|
||||
|
||||
```bash
|
||||
# 查看詳細錯誤
|
||||
docker compose logs
|
||||
```
|
||||
|
||||
檢查端口占用:
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
netstat -tuln | grep 12010
|
||||
# 或
|
||||
lsof -i :12010
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
netstat -ano | findstr 12010
|
||||
# 或
|
||||
Get-NetTCPConnection -LocalPort 12010
|
||||
```
|
||||
|
||||
檢查磁碟空間:
|
||||
|
||||
Linux/Mac:
|
||||
```bash
|
||||
df -h
|
||||
```
|
||||
|
||||
Windows (PowerShell):
|
||||
```powershell
|
||||
Get-PSDrive
|
||||
```
|
||||
|
||||
### 2. Nginx 無法啟動
|
||||
|
||||
```bash
|
||||
# 檢查 Nginx 配置語法
|
||||
docker compose exec tool_ocr nginx -t
|
||||
|
||||
# 查看 Nginx 錯誤日誌
|
||||
docker compose exec tool_ocr cat /var/log/nginx/error.log
|
||||
```
|
||||
|
||||
### 3. Backend API 無法訪問
|
||||
|
||||
```bash
|
||||
# 檢查 Backend 是否運行
|
||||
docker compose exec tool_ocr supervisorctl status backend
|
||||
|
||||
# 查看 Backend 日誌
|
||||
docker compose exec tool_ocr cat /app/backend/logs/app.log
|
||||
|
||||
# 重啟 Backend
|
||||
docker compose exec tool_ocr supervisorctl restart backend
|
||||
```
|
||||
|
||||
### 4. 數據庫連接失敗
|
||||
|
||||
```bash
|
||||
# 測試數據庫連接
|
||||
docker compose exec tool_ocr python -c "
|
||||
from app.core.database import engine
|
||||
try:
|
||||
with engine.connect() as conn:
|
||||
print('Database connection successful!')
|
||||
except Exception as e:
|
||||
print(f'Database connection failed: {e}')
|
||||
"
|
||||
```
|
||||
|
||||
### 5. OCR 處理失敗
|
||||
|
||||
```bash
|
||||
# 檢查 PaddleOCR 模型
|
||||
docker compose exec tool_ocr ls -la /app/backend/models/paddleocr/
|
||||
|
||||
# 測試 OCR 功能
|
||||
docker compose exec tool_ocr python -c "
|
||||
from paddleocr import PaddleOCR
|
||||
ocr = PaddleOCR(lang='ch')
|
||||
print('PaddleOCR initialized successfully!')
|
||||
"
|
||||
```
|
||||
|
||||
### 6. 前端頁面無法訪問
|
||||
|
||||
```bash
|
||||
# 檢查前端文件是否存在
|
||||
docker compose exec tool_ocr ls -la /app/frontend/dist/
|
||||
|
||||
# 檢查 Nginx 配置
|
||||
docker compose exec tool_ocr cat /etc/nginx/conf.d/default.conf
|
||||
```
|
||||
|
||||
## 性能優化
|
||||
|
||||
### 1. 調整 OCR 工作進程數
|
||||
|
||||
根據 CPU 核心數調整:
|
||||
|
||||
```bash
|
||||
# 在 .env 中設置
|
||||
MAX_OCR_WORKERS=8 # 建議設置為 CPU 核心數
|
||||
```
|
||||
|
||||
### 2. 調整 Nginx Worker 進程數
|
||||
|
||||
編輯 `docker/nginx.conf`:
|
||||
|
||||
```nginx
|
||||
worker_processes auto; # 自動根據 CPU 核心數
|
||||
```
|
||||
|
||||
### 3. 優化 Upload 大小限制
|
||||
|
||||
根據實際需求調整:
|
||||
|
||||
```bash
|
||||
# 在 .env 中設置(以字節為單位)
|
||||
MAX_UPLOAD_SIZE=104857600 # 100MB
|
||||
```
|
||||
|
||||
同時修改 `docker/nginx.conf`:
|
||||
|
||||
```nginx
|
||||
client_max_body_size 100M;
|
||||
```
|
||||
|
||||
## 監控和日誌
|
||||
|
||||
### 日誌位置
|
||||
|
||||
| 服務 | 容器內路徑 | 主機路徑 |
|
||||
|------|-----------|---------|
|
||||
| Nginx Access | `/var/log/nginx/tool_ocr_access.log` | - |
|
||||
| Nginx Error | `/var/log/nginx/tool_ocr_error.log` | - |
|
||||
| Backend | `/app/backend/logs/app.log` | `./data/logs/app.log` |
|
||||
| Supervisor | `/var/log/supervisor/supervisord.log` | - |
|
||||
|
||||
### 日誌輪轉
|
||||
|
||||
建議配置日誌輪轉以防止日誌文件過大:
|
||||
|
||||
```bash
|
||||
# 創建 logrotate 配置(主機上)
|
||||
cat > /etc/logrotate.d/tool_ocr << 'EOF'
|
||||
/path/to/tool_ocr/data/logs/*.log {
|
||||
daily
|
||||
rotate 7
|
||||
compress
|
||||
delaycompress
|
||||
notifempty
|
||||
create 0644 root root
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
## 安全建議
|
||||
|
||||
1. **修改默認密鑰**: 務必修改 `.env` 中的 `SECRET_KEY`
|
||||
2. **使用 HTTPS**: 在生產環境中啟用 SSL/TLS
|
||||
3. **限制 CORS**: 只允許可信的來源
|
||||
4. **定期更新**: 及時更新 Docker 映像和依賴
|
||||
5. **備份數據**: 定期備份重要數據
|
||||
6. **監控日誌**: 定期檢查日誌中的異常活動
|
||||
|
||||
## 常見問題
|
||||
|
||||
### Q: 如何修改對外端口?
|
||||
|
||||
A: 修改 `.env` 中的 `FRONTEND_PORT` 和 `docker-compose.yml` 中的端口映射。
|
||||
|
||||
### Q: 如何增加上傳文件大小限制?
|
||||
|
||||
A: 修改 `.env` 中的 `MAX_UPLOAD_SIZE` 和 `docker/nginx.conf` 中的 `client_max_body_size`。
|
||||
|
||||
### Q: 如何連接外部 MySQL 數據庫?
|
||||
|
||||
A: 在 `.env` 中配置正確的數據庫連接信息。
|
||||
|
||||
### Q: 如何查看詳細的錯誤信息?
|
||||
|
||||
A: 設置 `.env` 中的 `LOG_LEVEL=DEBUG` 並重啟容器。
|
||||
|
||||
## 聯繫支援
|
||||
|
||||
如果遇到問題,請:
|
||||
|
||||
1. 查看日誌: `docker-compose logs -f`
|
||||
2. 檢查配置: 確認 `.env` 文件正確
|
||||
3. 查看文檔: 參考本文檔的故障排除部分
|
||||
4. 提交 Issue: 在項目倉庫提交問題報告
|
||||
Reference in New Issue
Block a user