239 lines
5.4 KiB
Markdown
239 lines
5.4 KiB
Markdown
# 🔍 1Panel 部署架構驗證報告
|
||
|
||
## ✅ 已修正的問題
|
||
|
||
### 1. **靜態文件路徑(Docker → 本地)**
|
||
|
||
#### 修正前(Docker 容器路徑)
|
||
```python
|
||
# app.py
|
||
send_from_directory('/app/static', 'index.html') # ❌
|
||
|
||
# app/root.py
|
||
send_from_directory('/app/static', 'index.html') # ❌
|
||
```
|
||
|
||
#### 修正後(相對路徑)
|
||
```python
|
||
# 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)**
|
||
|
||
#### 修正前
|
||
```python
|
||
# start.py
|
||
'wsgi:app' # ❌ wsgi.py 已刪除
|
||
```
|
||
|
||
#### 修正後
|
||
```python
|
||
# 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. **環境變數引用** ✓
|
||
|
||
#### 關鍵環境變數檢查
|
||
```bash
|
||
✅ 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. **路徑配置檢查** ✓
|
||
|
||
#### 上傳目錄
|
||
```python
|
||
# config.py
|
||
UPLOAD_FOLDER = Path('uploads').absolute() # ✅ 相對路徑
|
||
```
|
||
|
||
#### 日誌目錄
|
||
```python
|
||
# config.py
|
||
LOG_FILE = Path('logs/app.log').absolute() # ✅ 相對路徑
|
||
```
|
||
|
||
#### API 配置檔案
|
||
```python
|
||
# config.py
|
||
api_file = Path('api.txt') # ✅ 相對路徑
|
||
```
|
||
|
||
所有路徑都使用相對路徑,無 Docker 容器絕對路徑
|
||
|
||
---
|
||
|
||
### 5. **Celery 配置** ✓
|
||
|
||
```python
|
||
# .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. **前端靜態文件** ✓
|
||
|
||
```bash
|
||
frontend/dist/
|
||
├── index.html # ✅ 存在
|
||
├── css/ # ✅ 存在
|
||
├── js/ # ✅ 存在
|
||
└── panjit-logo.png # ✅ 存在
|
||
```
|
||
|
||
前端已編譯,檔案完整
|
||
|
||
---
|
||
|
||
## ✅ 啟動流程驗證
|
||
|
||
### start.py 邏輯
|
||
```python
|
||
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. 環境準備
|
||
```bash
|
||
# IT 人員必須執行
|
||
sudo apt install redis-server # Redis 未預裝
|
||
sudo systemctl start redis
|
||
redis-cli ping # 確認返回 PONG
|
||
```
|
||
|
||
### 2. 環境變數修改
|
||
```bash
|
||
# 必須修改(安全性)
|
||
SECRET_KEY=<隨機生成>
|
||
JWT_SECRET_KEY=<隨機生成>
|
||
|
||
# 可選修改(端口)
|
||
PORT=12010 # 建議範圍 12010-12019
|
||
```
|
||
|
||
### 3. 端口可用性
|
||
```bash
|
||
# 確認端口未被佔用
|
||
netstat -tuln | grep 12010
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ 部署檢查清單
|
||
|
||
- [x] 刪除所有 Docker 相關檔案
|
||
- [x] 修正靜態文件路徑(/app/static → 相對路徑)
|
||
- [x] 修正 Gunicorn 啟動配置(wsgi:app → app:app)
|
||
- [x] Redis URL 使用 localhost(非容器主機名)
|
||
- [x] 所有路徑使用相對路徑
|
||
- [x] 環境變數配置一致
|
||
- [x] 端口配置文檔化
|
||
- [x] 前端靜態文件完整
|
||
- [x] Celery 配置正確
|
||
- [x] 啟動腳本邏輯完整
|
||
|
||
---
|
||
|
||
## 📋 最終架構確認
|
||
|
||
### 無 Docker 架構
|
||
- ✅ 直接在 1Panel 虛擬環境運行
|
||
- ✅ Gunicorn 處理 HTTP 請求(無 Nginx)
|
||
- ✅ Redis 本地運行(端口 6379)
|
||
- ✅ MySQL 外部服務(mysql.theaken.com:33306)
|
||
|
||
### 服務通訊
|
||
- ✅ 所有服務使用 localhost 互相通訊
|
||
- ✅ 對外僅暴露端口 12010(可配置)
|
||
- ✅ 無容器網路,簡化架構
|
||
|
||
---
|
||
|
||
## 🎯 結論
|
||
|
||
**所有已知的 Docker/Nginx 遺留問題已修正**
|
||
|
||
系統現在完全適配 1Panel 部署環境:
|
||
- ✅ 無容器依賴
|
||
- ✅ 路徑正確
|
||
- ✅ 配置一致
|
||
- ✅ 架構簡化
|
||
|
||
**可以安全部署到 1Panel 環境!**
|