5.4 KiB
5.4 KiB
🔍 1Panel 部署架構驗證報告
✅ 已修正的問題
1. 靜態文件路徑(Docker → 本地)
修正前(Docker 容器路徑)
# app.py
send_from_directory('/app/static', 'index.html') # ❌
# app/root.py
send_from_directory('/app/static', 'index.html') # ❌
修正後(相對路徑)
# app.py
static_dir = Path(__file__).parent / 'frontend' / 'dist' # ✅
send_from_directory(str(static_dir), 'index.html')
# app/root.py
project_root = Path(__file__).parent.parent
static_dir = project_root / 'frontend' / 'dist' # ✅
send_from_directory(str(static_dir), 'index.html')
影響:前端頁面現在可以正確載入
2. Gunicorn 啟動配置(wsgi.py → app.py)
修正前
# start.py
'wsgi:app' # ❌ wsgi.py 已刪除
修正後
# start.py
'app:app' # ✅ 直接使用 app.py
影響:生產環境 Gunicorn 可以正確啟動
✅ 架構驗證結果
1. 網路架構 ✓
用戶瀏覽器 (http://server-ip:12010)
↓
Gunicorn (4 Workers) + Flask (PORT=12010)
↓
Redis (localhost:6379) ← Celery Worker/Beat
↓
MySQL (mysql.theaken.com:33306)
- ✅ 無 Nginx(已完全移除)
- ✅ 無 Docker 容器(直接在 1Panel 環境運行)
- ✅ Gunicorn 直接對外提供服務
2. 端口配置一致性 ✓
服務 | 配置位置 | 端口 | 狀態 |
---|---|---|---|
Flask Web | .env → PORT |
12010 | ✅ 一致 |
Flask Web | app.py |
12010 (預設) | ✅ 一致 |
Flask Web | start.py |
12010 (預設) | ✅ 一致 |
Redis | .env → REDIS_URL |
6379 | ✅ 一致 |
Redis | config.py |
6379 (預設) | ✅ 一致 |
MySQL | .env → DATABASE_URL |
33306 | ✅ 一致 |
3. 環境變數引用 ✓
關鍵環境變數檢查
✅ PORT=12010 # Web 服務端口
✅ HOST=0.0.0.0 # 綁定所有網路介面
✅ REDIS_URL=redis://localhost:6379/0
✅ CELERY_BROKER_URL=redis://localhost:6379/0
✅ DATABASE_URL=mysql+pymysql://A060:...
✅ SECRET_KEY=production-secret-key-change-this-in-deployment
✅ JWT_SECRET_KEY=production-jwt-secret-change-this-in-deployment
所有環境變數在 .env
、config.py
、app.py
、start.py
中引用一致
4. 路徑配置檢查 ✓
上傳目錄
# config.py
UPLOAD_FOLDER = Path('uploads').absolute() # ✅ 相對路徑
日誌目錄
# config.py
LOG_FILE = Path('logs/app.log').absolute() # ✅ 相對路徑
API 配置檔案
# config.py
api_file = Path('api.txt') # ✅ 相對路徑
所有路徑都使用相對路徑,無 Docker 容器絕對路徑
5. Celery 配置 ✓
# .env
CELERY_BROKER_URL=redis://localhost:6379/0 # ✅
CELERY_RESULT_BACKEND=redis://localhost:6379/0 # ✅
CELERY_WORKER_CONCURRENCY=4 # ✅
# config.py
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL',
'redis://localhost:6379/0') # ✅
Celery 配置正確指向本地 Redis,無容器主機名
6. 前端靜態文件 ✓
frontend/dist/
├── index.html # ✅ 存在
├── css/ # ✅ 存在
├── js/ # ✅ 存在
└── panjit-logo.png # ✅ 存在
前端已編譯,檔案完整
✅ 啟動流程驗證
start.py 邏輯
1. 檢查環境 (Python 版本、必要檔案) # ✅
2. 讀取 PORT, HOST 環境變數 # ✅
3. 根據 FLASK_ENV 選擇啟動方式:
- production: gunicorn app:app # ✅
- development: python3 app.py # ✅
4. 啟動 Celery Worker (redis://localhost) # ✅
5. 啟動 Celery Beat # ✅
6. 監控所有進程 # ✅
⚠️ 剩餘注意事項
1. 環境準備
# IT 人員必須執行
sudo apt install redis-server # Redis 未預裝
sudo systemctl start redis
redis-cli ping # 確認返回 PONG
2. 環境變數修改
# 必須修改(安全性)
SECRET_KEY=<隨機生成>
JWT_SECRET_KEY=<隨機生成>
# 可選修改(端口)
PORT=12010 # 建議範圍 12010-12019
3. 端口可用性
# 確認端口未被佔用
netstat -tuln | grep 12010
✅ 部署檢查清單
- 刪除所有 Docker 相關檔案
- 修正靜態文件路徑(/app/static → 相對路徑)
- 修正 Gunicorn 啟動配置(wsgi:app → app:app)
- Redis URL 使用 localhost(非容器主機名)
- 所有路徑使用相對路徑
- 環境變數配置一致
- 端口配置文檔化
- 前端靜態文件完整
- Celery 配置正確
- 啟動腳本邏輯完整
📋 最終架構確認
無 Docker 架構
- ✅ 直接在 1Panel 虛擬環境運行
- ✅ Gunicorn 處理 HTTP 請求(無 Nginx)
- ✅ Redis 本地運行(端口 6379)
- ✅ MySQL 外部服務(mysql.theaken.com:33306)
服務通訊
- ✅ 所有服務使用 localhost 互相通訊
- ✅ 對外僅暴露端口 12010(可配置)
- ✅ 無容器網路,簡化架構
🎯 結論
所有已知的 Docker/Nginx 遺留問題已修正
系統現在完全適配 1Panel 部署環境:
- ✅ 無容器依賴
- ✅ 路徑正確
- ✅ 配置一致
- ✅ 架構簡化
可以安全部署到 1Panel 環境!