# MOMO Pro System - 技術架構
> 最後更新:2026-01-29
---
## 🏗️ 整體架構
```mermaid
graph TB
subgraph "用戶端"
Browser[🌐 瀏覽器]
Telegram[📱 Telegram Bot]
LINE[📱 LINE Bot]
end
subgraph "入口層"
Nginx[🔒 Nginx
SSL + 反向代理]
end
subgraph "應用層 (K8s)"
Flask[🐍 Flask App]
Scheduler[⏰ 排程器]
end
subgraph "AI 服務"
Ollama[🦙 Ollama
llama3:70b]
Gemini[✨ Gemini API]
end
subgraph "資料層"
PostgreSQL[(🐘 PostgreSQL)]
Redis[(📦 Redis Cache)]
end
subgraph "外部服務"
GDrive[📁 Google Drive]
SMTP[📧 SMTP Server]
MOMO[🛒 MOMO 電商]
end
subgraph "監控層"
Prometheus[📊 Prometheus]
Grafana[📈 Grafana]
Alertmanager[🚨 Alertmanager]
end
Browser --> Nginx
Telegram --> Flask
LINE --> Flask
Nginx --> Flask
Flask --> PostgreSQL
Flask --> Redis
Flask --> Ollama
Flask --> Gemini
Flask --> GDrive
Flask --> SMTP
Scheduler --> MOMO
Scheduler --> PostgreSQL
Flask --> Prometheus
Prometheus --> Grafana
Prometheus --> Alertmanager
```
---
## 📚 技術棧總覽
| 層級 | 技術 | 版本 | 用途 |
|------|------|------|------|
| **後端框架** | Flask | 2.3+ | Web 應用框架 |
| **ORM** | SQLAlchemy | 2.0+ | 資料庫物件映射 |
| **資料庫** | PostgreSQL | 15 | 主資料庫 (生產環境) |
| **資料庫** | SQLite | 3 | 開發/本地環境 |
| **快取** | Redis | 7.0 | Session + 資料快取 |
| **前端框架** | Bootstrap | 5.3 | UI 元件庫 |
| **圖表** | Chart.js | 4.0 | 資料視覺化 |
| **模板引擎** | Jinja2 | 3.1 | HTML 模板渲染 |
| **容器** | Docker | 24.0 | 容器化部署 |
| **編排** | K3s | 1.34 | Kubernetes 輕量版 |
| **CI/CD** | GitLab CI | - | 持續整合部署 |
| **Registry** | Harbor | 2.10 | 容器映像倉庫 |
| **監控** | Prometheus | 2.51 | 指標收集 |
| **視覺化** | Grafana | 10.0 | 監控儀表板 |
| **日誌** | Loki | 2.9 | 日誌聚合 |
| **AI (本地)** | Ollama | 0.1+ | LLM 推理引擎 |
| **AI (雲端)** | Gemini | 1.5/2.5 | Google AI API |
| **自動化** | n8n | 1.30 | 低代碼工作流 |
| **爬蟲** | Selenium | 4.18 | 網頁自動化 |
| **爬蟲** | BeautifulSoup | 4.12 | HTML 解析 |
---
## 🐍 後端架構
### Flask 應用結構
```
Flask App
├── Blueprints (路由模組)
│ ├── dashboard_routes # 商品看板
│ ├── daily_sales_routes # 每日業績
│ ├── ai_routes # AI 文案
│ ├── user_routes # 用戶管理
│ └── ... # 17 個路由模組
│
├── Services (業務邏輯)
│ ├── AI Services # Ollama + Gemini
│ ├── Crawler Services # 爬蟲服務
│ ├── Notification # 通知服務
│ └── ... # 27 個服務模組
│
└── Database (資料層)
├── SQLAlchemy Models # ORM 模型
└── Database Manager # 連線管理
```
### 關鍵依賴 (requirements.txt)
```txt
Flask>=2.3.0
SQLAlchemy>=2.0.0
gunicorn>=21.0.0
psycopg2-binary>=2.9.0
selenium>=4.18.0
beautifulsoup4>=4.12.0
openpyxl>=3.1.0
google-api-python-client>=2.0.0
python-telegram-bot>=20.0
requests>=2.31.0
Pillow>=10.0.0
```
---
## 🎨 前端架構
### 技術選型
| 項目 | 技術 | 說明 |
|------|------|------|
| **CSS 框架** | Bootstrap 5.3 | 響應式 UI 元件 |
| **圖標** | Font Awesome 6 | 圖標庫 |
| **圖表** | Chart.js 4.0 | 折線圖、長條圖 |
| **表格** | DataTables | 分頁、搜尋表格 |
| **日期選擇** | Flatpickr | 日期/時間選擇器 |
| **通知** | Toastr | Toast 通知 |
| **模態框** | Bootstrap Modal | 彈窗對話框 |
### 頁面載入方式
```
Server-Side Rendering (SSR)
├── Jinja2 模板渲染
├── AJAX API 呼叫 (資料更新)
└── 無 SPA 框架
```
---
## 🗄️ 資料庫架構
### 雙資料庫策略
| 環境 | 資料庫 | 用途 |
|------|--------|------|
| 開發 | SQLite | 本地快速開發 |
| 生產 | PostgreSQL | UAT + 正式環境 |
### 連線管理
```python
# database/manager.py
- 支援 SQLite 和 PostgreSQL 切換
- 連線池管理
- Session 生命週期管理
```
### 資料庫備份
- **頻率**: 每日自動備份
- **保留**: 最近 7 天
- **工具**: pg_dump + cron
---
## 🚀 部署架構
### K3s Kubernetes 環境
```yaml
Namespace: momo
├── Deployment: momo-app (Flask)
│ ├── Replicas: 1
│ ├── Resources: 512Mi-4Gi / 200m-2000m
│ └── Image: harbor.wooo.work/wooo/momo-pro-system
│
├── Deployment: momo-scheduler (爬蟲)
│ ├── Replicas: 1
│ └── Resources: 256Mi-2Gi / 100m-1000m
│
├── StatefulSet: momo-postgres
│ ├── Storage: 10Gi PVC
│ └── Resources: 256Mi-1Gi / 100m-500m
│
└── Services
├── momo-app: ClusterIP
└── momo-postgres: ClusterIP
```
### 流量路徑
```
用戶 → mo.wooo.work:443
→ VM Nginx (SSL)
→ K8s ClusterIP 10.43.238.49:80
→ momo-app Pod
```
---
## 🔄 CI/CD 流程
```mermaid
graph LR
A[Git Push] --> B[GitLab CI]
B --> C{Test}
C -->|Pass| D[Build Image]
C -->|Fail| E[Auto Repair]
D --> F[Push to Harbor]
F --> G[K8s Rollout]
G --> H[Health Check]
E --> C
```
### Pipeline 階段
| 階段 | 動作 | 自動修復 |
|------|------|---------|
| test | pytest 單元測試 | 系統診斷 |
| build | Docker 映像構建 | Harbor 重啟、磁碟清理 |
| deploy | K8s 滾動更新 | Pod 重啟、Secret 重建 |
---
## 🤖 AI 服務架構
### 雙 AI 提供者
| 提供者 | 模型 | 用途 | 計費 |
|--------|------|------|------|
| **Ollama** | llama3:70b | 文案生成、推薦 | 免費 (自建) |
| **Gemini** | gemini-1.5-flash | 網路搜尋、產品分析 | 按 Token |
### AI 服務切換邏輯
```python
class AIProvider:
def generate(self, prompt):
if self.provider == 'ollama':
return self.ollama_service.generate(prompt)
else:
return self.gemini_service.generate(prompt)
```
### Ollama 伺服器
- **位置**: 192.168.0.188:11434
- **模型**: llama3:70b-instruct-q2_K
- **監控**: n8n 健康檢查 (每 5 分鐘)
---
## 📊 監控系統
### 監控堆疊
```
Prometheus (指標收集)
├── Node Exporter (主機指標)
├── cAdvisor (容器指標)
├── Postgres Exporter (DB 指標)
└── Blackbox Exporter (外部探測)
│
▼
Alertmanager (告警路由)
│
▼
Telegram / LINE (通知)
│
▼
Grafana (視覺化儀表板)
```
### 告警規則
| 規則 | 條件 | 動作 |
|------|------|------|
| Pod OOMKilled | Pod 記憶體不足 | Telegram 告警 |
| 高重啟率 | 5 分鐘內重啟 > 3 次 | Telegram 告警 |
| 磁碟空間 | 使用率 > 80% | 自動清理 |
| SSL 到期 | 30 天內到期 | 每日提醒 |
---
## 🔒 安全架構
### 認證與授權
| 項目 | 實作 |
|------|------|
| 用戶認證 | Flask-Login + Session |
| 密碼儲存 | bcrypt 雜湊 |
| CSRF 防護 | Flask-WTF Token |
| 權限控制 | RBAC (admin/manager/user) |
### 網路安全
| 項目 | 實作 |
|------|------|
| HTTPS | Let's Encrypt SSL |
| 端口限制 | 僅開放 22, 80, 443 |
| 內部服務 | 僅綁定 127.0.0.1 |
---
## 📁 外部整合
| 服務 | 用途 | 整合方式 |
|------|------|---------|
| **Google Drive** | 檔案匯入 | OAuth 2.0 API |
| **SMTP** | 郵件發送 | smtplib |
| **Telegram** | 通知 + Bot | Bot API |
| **LINE** | 通知 | Messaging API |
| **MOMO** | 商品爬蟲 | Selenium |
| **mybest** | 趨勢爬蟲 | BeautifulSoup |
---
## ⚙️ 環境變數
```bash
# 資料庫
DATABASE_URL=postgresql://user:pass@host:5432/db
SQLALCHEMY_DATABASE_URI=...
# AI 服務
OLLAMA_HOST=http://192.168.0.188:11434
OLLAMA_MODEL=llama3:70b-instruct-q2_K
GEMINI_API_KEY=AIzaSy...
# 通知
TELEGRAM_BOT_TOKEN=807564...
TELEGRAM_CHAT_ID=561907...
# Google
GOOGLE_DRIVE_FOLDER_ID=...
```