feat: EwoooC 初始化 — 完整專案推版至 Gitea
Some checks failed
CD Pipeline / deploy (push) Failing after 59s

- 建立 Gitea Actions CD pipeline (.gitea/workflows/cd.yaml)
- 部署模式: rsync Python 檔案至 188 → docker restart (volume mount)
- Dockerfile/requirements 變動時自動重建 Docker image
- 部署通知: Telegram (開始/成功/失敗)
- 健康檢查: https://mo.wooo.work/health (最多 5 次重試)
- 同步最新 CLAUDE.md / ADR-008 / memory (2026-04-19)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ogt
2026-04-19 01:21:13 +08:00
commit 1b4f3a7bbe
504 changed files with 387725 additions and 0 deletions

239
deploy/QUICK_START.md Normal file
View File

@@ -0,0 +1,239 @@
# MOMO Pro System - 快速部署指南
> 在全新主機上完成環境安裝 + 應用部署的完整流程
> 最後更新: 2026-02-06
---
## 🚀 一鍵完整部署(推薦)
### 步驟 1: 複製專案到新主機
```bash
# 從本地複製到新主機
scp -r /path/to/momo-pro-system root@新主機IP:/opt/
# 或使用 Git clone
ssh root@新主機IP
git clone http://192.168.0.110:8929/root/momo-pro-system.git /opt/momo-pro-system
```
### 步驟 2: 執行完整部署
```bash
ssh root@新主機IP
cd /opt/momo-pro-system
# 完整部署(環境 + 應用 + SSL
sudo ./deploy/scripts/full-deploy.sh --domain mo.example.com --ssl
```
**一個命令完成全部工作!**
---
## 📦 自動安裝的套件清單
| 分類 | 套件 | 說明 |
|------|------|------|
| **基礎工具** | curl, wget, git | 檔案下載與版本控制 |
| | vim, htop, iotop | 編輯器與系統監控 |
| | jq, rsync, unzip | JSON 處理、檔案同步 |
| **Python** | python3, pip, venv | Python 執行環境 |
| **容器** | Docker CE | 容器運行環境 |
| | Docker Compose | 多容器編排 |
| **Kubernetes** | K3s | 輕量級 Kubernetes |
| | Helm | K8s 套件管理 |
| **Web 伺服器** | Nginx | 反向代理 + 負載均衡 |
| **SSL** | Certbot | Let's Encrypt 自動證書 |
| **資料庫** | PostgreSQL Client | 資料庫客戶端工具 |
| **安全** | Fail2Ban | 防暴力破解 |
| | UFW | 防火牆 |
| **監控** | Node Exporter | 主機指標收集 |
| | Prometheus | 指標儲存與查詢 |
| | Grafana | 監控儀表板 |
---
## 🔧 部署腳本說明
### 1. 環境安裝腳本 (`setup-environment.sh`)
只安裝環境,不部署應用:
```bash
sudo ./deploy/scripts/setup-environment.sh [選項]
選項:
--user <name> 部署用戶(預設: wooo
--domain <domain> 域名
--no-docker 不安裝 Docker
--no-k3s 不安裝 K3s
--no-nginx 不安裝 Nginx
--no-firewall 不設定防火牆
```
### 2. 完整部署腳本 (`full-deploy.sh`)
環境安裝 + 應用部署:
```bash
sudo ./deploy/scripts/full-deploy.sh [選項]
選項:
--user <name> 部署用戶(預設: wooo
--domain <domain> 域名
--ssl 設定 SSL 證書
--skip-env 跳過環境安裝
```
### 3. 快速部署腳本 (`build-and-deploy.sh`)
日常更新用(環境已準備好):
```bash
./scripts/deploy/build-and-deploy.sh
```
---
## 📋 部署流程圖
```
執行 full-deploy.sh
╔═══════════════════════════════════════╗
║ Phase 1: 環境安裝 ║
║ • 檢測 OS (Ubuntu/Debian) ║
║ • 安裝基礎套件 ║
║ • 安裝 Docker + K3s ║
║ • 安裝 Nginx + Certbot ║
║ • 設定防火牆 + Fail2Ban ║
╚═══════════════════════════════════════╝
╔═══════════════════════════════════════╗
║ Phase 2: K8s 配置 ║
║ • 建立 momo namespace ║
║ • 部署 Secrets/ConfigMap ║
║ • 部署 PostgreSQL ║
║ • 部署 momo-app + scheduler ║
╚═══════════════════════════════════════╝
╔═══════════════════════════════════════╗
║ Phase 3: 映像建置 ║
║ • docker build ║
║ • k3s ctr images import ║
║ • kubectl rollout restart ║
╚═══════════════════════════════════════╝
╔═══════════════════════════════════════╗
║ Phase 4-5: Nginx + SSL ║
║ • 配置反向代理 ║
║ • Let's Encrypt 證書 ║
╚═══════════════════════════════════════╝
╔═══════════════════════════════════════╗
║ Phase 6: 監控系統 ║
║ • Prometheus + Grafana (Helm) ║
╚═══════════════════════════════════════╝
╔═══════════════════════════════════════╗
║ Phase 7-8: 自動啟動 + 健康檢查 ║
║ • systemd 服務設定 ║
║ • Telegram 通知 ║
╚═══════════════════════════════════════╝
```
---
## 💻 系統需求
| 項目 | 最低需求 | 建議配置 |
|------|----------|----------|
| **CPU** | 2 核心 | 4+ 核心 |
| **RAM** | 4 GB | 8+ GB |
| **硬碟** | 30 GB | 50+ GB SSD |
| **作業系統** | Ubuntu 22.04 | Ubuntu 24.04 |
| **網路** | 開放 80, 443 | 靜態 IP |
---
## 🔒 安全配置
### 防火牆規則 (自動設定)
| 端口 | 服務 | 存取範圍 |
|------|------|---------|
| 22 | SSH | 公開 |
| 80 | HTTP | 公開 |
| 443 | HTTPS | 公開 |
| 6443 | K3s API | 僅內網 |
### Fail2Ban 規則
- SSH: 3 次失敗封鎖 1 小時
- Nginx: 5 次失敗封鎖 1 小時
---
## 🔄 日常更新流程
環境已安裝後,日常更新只需:
```bash
# 方法 1: 使用快速部署腳本
./scripts/deploy/build-and-deploy.sh
# 方法 2: 手動步驟
docker build -t momo-pro-system:local .
docker save momo-pro-system:local | sudo k3s ctr images import -
kubectl rollout restart deployment/momo-app deployment/momo-scheduler -n momo
```
---
## ❓ 常見問題
### Q: 部署中斷後如何繼續?
```bash
# 跳過環境安裝,只部署應用
sudo ./deploy/scripts/full-deploy.sh --skip-env
```
### Q: 如何只更新應用不重裝環境?
```bash
./scripts/deploy/build-and-deploy.sh
```
### Q: 如何查看部署日誌?
```bash
# K8s Pod 日誌
kubectl logs -f deployment/momo-app -n momo
# 系統啟動日誌
journalctl -u momo-startup-complete.service
```
### Q: SSL 證書申請失敗?
```bash
# 手動申請
sudo certbot --nginx -d your-domain.com
```
---
## 📞 聯絡資訊
- **Telegram 告警**: Bot `@wooowooowooobot`
- **GitLab**: http://192.168.0.110:8929
- **正式網址**: https://mo.wooo.work

579
deploy/README.md Normal file
View File

@@ -0,0 +1,579 @@
# MOMO Pro System - 一鍵部署指南 v2.0
> 將 MOMO Pro System 完整部署到新的 VM 環境
> 支援 Docker Compose、Kubernetes、Harbor Registry、監控堆疊
## 目錄
- [快速開始](#快速開始)
- [部署模式](#部署模式)
- [K8s 部署](#k8s-部署)
- [Harbor 管理](#harbor-管理)
- [監控堆疊](#監控堆疊)
- [Systemd 服務](#systemd-服務)
- [環境需求](#環境需求)
- [配置說明](#配置說明)
- [備份與還原](#備份與還原)
- [SSL 憑證](#ssl-憑證)
- [故障排除](#故障排除)
---
## 快速開始
### Docker Compose 部署(最簡單)
```bash
# 1. 進入部署目錄
cd deploy
# 2. 執行部署腳本
chmod +x deploy.sh
./deploy.sh deploy
# 3. 依照提示完成配置
```
### Kubernetes 部署
```bash
# 部署到 K8s含 Harbor 映像推送)
./deploy.sh --k8s deploy
# 或分步驟執行
./deploy.sh harbor-push # 建構並推送映像
./deploy.sh k8s-deploy # 部署到 K8s
```
### 完整部署流程(生產環境)
```bash
# 1. 環境檢查
./deploy.sh check
# 2. 部署應用 + 設定開機自動啟動
./deploy.sh --with-systemd deploy
# 3. 設定 SSL 憑證
./deploy.sh -d mo.wooo.work ssl
# 4. 部署監控堆疊
./deploy.sh monitoring-deploy
# 5. 健康檢查
./deploy.sh health
```
---
## 部署模式
### 模式 A: Docker Compose 本地部署
```bash
./deploy.sh deploy
# 或
./deploy.sh --local deploy
```
**適用場景:**
- 開發/測試環境
- 單機部署
### 模式 B: Kubernetes 部署
```bash
./deploy.sh --k8s deploy
```
**適用場景:**
- 生產環境
- 需要高可用性
- 需要自動擴展
### 模式 C: SSH 遠端部署
```bash
./deploy.sh --ssh \
-h 192.168.1.100 \
-u wooo \
-p /opt/momo-pro-system \
deploy
```
**前置需求:**
- SSH 金鑰已設定(無密碼登入)
- 遠端主機已安裝 Docker
### 模式 D: 匯出部署包
```bash
# 不含資料
./deploy.sh --export
# 含資料庫備份
./deploy.sh --export --with-data
```
**輸出檔案:**
```
momo-pro-system_20260129_143000.tar.gz
```
---
## K8s 部署
### K8s 命令
| 命令 | 說明 |
|------|------|
| `./deploy.sh k8s-deploy` | 部署到 Kubernetes |
| `./deploy.sh k8s-status` | 查看部署狀態 |
| `./deploy.sh k8s-logs` | 查看應用日誌 |
| `./deploy.sh k8s-rollback` | 回滾到上一版本 |
| `./deploy.sh k8s-cleanup` | 清理所有 K8s 資源 |
### K8s 選項
| 選項 | 說明 |
|------|------|
| `-n, --namespace` | K8s 命名空間(預設: momo |
### K8s 部署流程
```bash
# 1. 建構並推送映像
./deploy.sh harbor-push
# 2. 部署到 K8s
./deploy.sh -n momo k8s-deploy
# 3. 查看狀態
./deploy.sh k8s-status
# 4. 查看日誌
./deploy.sh k8s-logs
```
### K8s 回滾
```bash
# 回滾 momo-app
./deploy.sh k8s-rollback
# 回滾特定 deployment
kubectl rollout undo deployment/momo-scheduler -n momo
```
---
## Harbor 管理
### Harbor 命令
| 命令 | 說明 |
|------|------|
| `./deploy.sh harbor-install` | 安裝 Harbor Registry |
| `./deploy.sh harbor-push` | 建構並推送映像 |
| `./deploy.sh harbor-scan` | 執行容器安全掃描 |
| `./deploy.sh harbor-health` | 檢查 Harbor 健康狀態 |
### Harbor 選項
| 選項 | 說明 |
|------|------|
| `--registry` | Harbor URL預設: harbor.wooo.work |
| `--harbor-user` | Harbor 用戶名(預設: admin |
| `--harbor-pass` | Harbor 密碼 |
### 使用 Harbor
```bash
# 登入 Harbor
docker login harbor.wooo.work -u admin
# 建構並推送映像
./deploy.sh harbor-push
# 安全掃描
./deploy.sh harbor-scan
```
---
## 監控堆疊
### 監控命令
| 命令 | 說明 |
|------|------|
| `./deploy.sh monitoring-deploy` | 部署監控堆疊 |
| `./deploy.sh monitoring-status` | 查看監控狀態 |
### 監控組件
| 組件 | 端口 | 用途 |
|------|------|------|
| Prometheus | 9090 | 指標收集 |
| Grafana | 3000 | 視覺化儀表板 |
| Alertmanager | 9093 | 告警管理 |
| Node Exporter | 9100 | 主機監控 |
| cAdvisor | 8080 | 容器監控 |
| Loki | 3100 | 日誌收集 |
### 部署監控
```bash
# Docker 環境
./deploy.sh monitoring-deploy
# K8s 環境(使用 Helm
./deploy.sh --k8s monitoring-deploy
```
### 存取監控
| 服務 | URL | 帳號 |
|------|-----|------|
| Grafana | http://localhost:3000 | admin / Wooo_Grafana_2026 |
| Prometheus | http://localhost:9090 | - |
---
## Systemd 服務
### Systemd 命令
| 命令 | 說明 |
|------|------|
| `./deploy.sh systemd-setup` | 設定開機自動啟動 |
| `./deploy.sh systemd-status` | 查看服務狀態 |
### 設定開機啟動
```bash
# 方法一:部署時設定
./deploy.sh --with-systemd deploy
# 方法二:單獨設定
./deploy.sh systemd-setup
```
### 服務管理
```bash
# 查看服務狀態
systemctl status momo-pro-system
# 重啟服務
sudo systemctl restart momo-pro-system
# 停止服務
sudo systemctl stop momo-pro-system
```
### 建立的 Systemd 服務
| 服務 | 說明 |
|------|------|
| `momo-pro-system.service` | 主應用程式 |
| `harbor.service` | Harbor Registry |
| `gitlab.service` | GitLab CE |
| `n8n.service` | n8n 自動化 |
| `momo-monitoring.service` | 監控堆疊 |
| `momo-health-check.timer` | 健康監控定時器 |
---
## 環境需求
### 硬體需求
| 項目 | 最低需求 | 建議配置 |
|------|----------|----------|
| CPU | 4 核心 | 8 核心 |
| RAM | 8 GB | 16 GB |
| 硬碟 | 50 GB SSD | 100 GB SSD |
### 軟體需求
| 軟體 | 版本 | 說明 |
|------|------|------|
| Docker | 20.10+ | 容器運行環境 |
| Docker Compose | v2.0+ | 容器編排 |
| kubectl | 1.28+ | K8s 客戶端K8s 模式) |
| Helm | 3.0+ | K8s 套件管理(監控用) |
| curl | - | HTTP 請求 |
### 端口需求
| 端口 | 服務 | 必要 |
|------|------|------|
| 80/443 | Nginx | ✓ |
| 5001 | Flask App | ✓Docker 模式) |
| 5432 | PostgreSQL | ✓ |
| 3000 | Grafana | 選填 |
| 9090 | Prometheus | 選填 |
| 5678 | n8n | 選填 |
| 5050 | Harbor | 選填 |
---
## 配置說明
### 互動式配置
部署時會提示輸入以下配置:
```
資料庫配置
──────────────────────────────────
PostgreSQL 用戶名 [momo]:
PostgreSQL 密碼 [自動生成]:
應用程式配置
──────────────────────────────────
Flask Secret Key [自動生成]:
Ollama AI 配置
──────────────────────────────────
Ollama Host [http://192.168.0.188:11434]:
通知服務配置
──────────────────────────────────
Telegram Bot Token []:
Telegram Chat ID []:
```
### 使用預設配置
```bash
./deploy.sh -y deploy
```
### 使用自訂配置檔
```bash
# 複製模板
cp deploy/configs/.env.template .env
# 編輯配置
nano .env
# 使用自訂配置部署
./deploy.sh -e .env deploy
```
---
## 備份與還原
### 完整備份
```bash
./deploy.sh backup
```
**備份內容:**
- PostgreSQL 完整資料庫SQL 格式)
- 所有資料表的 CSV 匯出
- 配置檔案(.env, docker-compose.yml
- n8n 工作流程
**輸出位置:**
```
backups/momo_backup_20260129_143000.tar.gz
```
### 從備份還原
```bash
./deploy.sh -b backups/momo_backup_20260129.tar.gz restore
```
### 定時備份
```bash
# 每天凌晨 2 點備份
0 2 * * * cd /opt/momo-pro-system && ./deploy/deploy.sh -y backup
```
---
## SSL 憑證
### 申請 Let's Encrypt 憑證
```bash
./deploy.sh -d momo.example.com ssl
```
**前置需求:**
1. 域名已解析到此伺服器
2. 端口 80 可被外部存取
### 手動續期
```bash
certbot renew --force-renewal
docker restart momo-nginx
```
---
## 命令參考
### 基本命令
| 命令 | 說明 |
|------|------|
| `deploy` | 執行完整部署 |
| `backup` | 備份現有環境 |
| `restore` | 從備份還原 |
| `check` | 環境檢查 |
| `health` | 健康檢查 |
| `ssl` | 設定 SSL 憑證 |
| `export` | 匯出部署包 |
### K8s 命令
| 命令 | 說明 |
|------|------|
| `k8s-deploy` | 部署到 K8s |
| `k8s-status` | 查看 K8s 狀態 |
| `k8s-logs` | 查看 K8s 日誌 |
| `k8s-rollback` | 回滾 K8s 部署 |
| `k8s-cleanup` | 清理 K8s 資源 |
### Harbor 命令
| 命令 | 說明 |
|------|------|
| `harbor-install` | 安裝 Harbor |
| `harbor-push` | 推送映像 |
| `harbor-scan` | 安全掃描 |
| `harbor-health` | 健康檢查 |
### 監控命令
| 命令 | 說明 |
|------|------|
| `monitoring-deploy` | 部署監控 |
| `monitoring-status` | 監控狀態 |
### Systemd 命令
| 命令 | 說明 |
|------|------|
| `systemd-setup` | 設定服務 |
| `systemd-status` | 服務狀態 |
---
## 選項參考
| 選項 | 說明 |
|------|------|
| `--local` | Docker Compose 部署 |
| `--k8s` | Kubernetes 部署 |
| `--ssh` | SSH 遠端部署 |
| `--export` | 匯出部署包 |
| `-h, --host` | SSH 目標主機 |
| `-u, --user` | SSH 用戶名 |
| `-p, --path` | 遠端路徑 |
| `-n, --namespace` | K8s 命名空間 |
| `--registry` | Harbor URL |
| `-e, --env-file` | 環境變數檔案 |
| `-d, --domain` | 域名 |
| `-b, --backup` | 備份檔案路徑 |
| `--no-monitoring` | 不部署監控 |
| `--with-data` | 包含資料 |
| `--with-systemd` | 設定開機啟動 |
| `-y, --yes` | 跳過確認 |
---
## 故障排除
### Docker 連線失敗
```bash
sudo systemctl restart docker
```
### K8s 部署失敗
```bash
# 查看 Pod 狀態
kubectl get pods -n momo
# 查看詳細事件
kubectl describe pod <pod-name> -n momo
# 查看日誌
kubectl logs deployment/momo-app -n momo
```
### Harbor 登入失敗
```bash
# 確認 Harbor 運行中
docker ps | grep harbor
# 重啟 Harbor
cd /home/wooo/devops/harbor/harbor
docker compose restart
```
### 服務無法啟動
```bash
# 查看容器日誌
docker compose logs
# 查看 systemd 日誌
journalctl -u momo-pro-system -f
```
---
## 目錄結構
```
deploy/
├── deploy.sh # 主入口腳本 v2.0
├── README.md # 本文件
├── lib/
│ ├── common.sh # 通用函數
│ ├── check.sh # 環境檢查
│ ├── config.sh # 配置生成
│ ├── docker.sh # Docker 操作
│ ├── database.sh # 資料庫備份/還原
│ ├── ssl.sh # SSL 憑證
│ ├── health.sh # 健康檢查
│ ├── k8s.sh # K8s 部署(新增)
│ ├── harbor.sh # Harbor 管理(新增)
│ ├── monitoring.sh # 監控堆疊(新增)
│ └── systemd.sh # Systemd 服務(新增)
└── configs/
└── .env.template # 環境變數模板
```
---
## 更新記錄
- **2026-01-29**: v2.0.0
- 新增 Kubernetes 部署支援
- 新增 Harbor Registry 整合
- 新增監控堆疊部署 (Prometheus/Grafana/Loki)
- 新增 Systemd 服務管理
- 新增容器安全掃描功能
- 增強健康監控和自動修復
- **2026-01-26**: v1.0.0
- 初始版本
- 支援本地、SSH、匯出三種部署模式
- 完整資料庫備份/還原
- Let's Encrypt SSL 自動化

862
deploy/deploy.sh Executable file
View File

@@ -0,0 +1,862 @@
#!/bin/bash
# =============================================================================
# MOMO Pro System - 一鍵部署腳本
# =============================================================================
# 用途:將 MOMO Pro System 完整部署到新的 VM 環境
# 支援Docker Compose 部署、K8s 部署、SSH 遠端部署、匯出部署包
# 版本2.0.0
# 更新2026-01-29
# =============================================================================
set -e
# 腳本目錄
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# 載入函數庫
source "$SCRIPT_DIR/lib/common.sh"
source "$SCRIPT_DIR/lib/check.sh"
source "$SCRIPT_DIR/lib/config.sh"
source "$SCRIPT_DIR/lib/docker.sh"
source "$SCRIPT_DIR/lib/database.sh"
source "$SCRIPT_DIR/lib/ssl.sh"
source "$SCRIPT_DIR/lib/health.sh"
# 載入新增模組
[[ -f "$SCRIPT_DIR/lib/k8s.sh" ]] && source "$SCRIPT_DIR/lib/k8s.sh"
[[ -f "$SCRIPT_DIR/lib/monitoring.sh" ]] && source "$SCRIPT_DIR/lib/monitoring.sh"
[[ -f "$SCRIPT_DIR/lib/systemd.sh" ]] && source "$SCRIPT_DIR/lib/systemd.sh"
[[ -f "$SCRIPT_DIR/lib/harbor.sh" ]] && source "$SCRIPT_DIR/lib/harbor.sh"
# =============================================================================
# 預設值
# =============================================================================
DEPLOY_MODE="local" # local | ssh | export | k8s
TARGET_HOST="" # SSH 目標主機
TARGET_USER="root" # SSH 用戶
TARGET_PATH="/opt/momo-pro-system" # 遠端部署路徑
ENV_FILE="" # 自訂環境變數檔案
INCLUDE_MONITORING="true" # 是否包含監控服務
INCLUDE_DATA="false" # 是否包含資料庫備份
DOMAIN="" # 域名(用於 SSL
SKIP_CONFIRM="false" # 跳過確認提示
BACKUP_PATH="" # 備份檔案路徑(用於還原)
DEPLOY_TYPE="docker" # docker | k8s
SETUP_SYSTEMD="false" # 是否設定 systemd 服務
K8S_NAMESPACE="momo" # K8s 命名空間
# Harbor 設定
HARBOR_REGISTRY="${HARBOR_REGISTRY:-harbor.wooo.work}"
HARBOR_USERNAME="${HARBOR_USERNAME:-admin}"
HARBOR_PASSWORD="${HARBOR_PASSWORD:-Wooo_Harbor_2026}"
HARBOR_PROJECT="${HARBOR_PROJECT:-wooo}"
# Telegram 設定
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-8075645931:AAH-EGKMo8ZC4QJs-Nc1_0s92xHrGdQvdpg}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-5619078117}"
# =============================================================================
# 顯示使用說明
# =============================================================================
show_help() {
cat << EOF
${CYAN}═══════════════════════════════════════════════════════════════════════════════${NC}
${BOLD}MOMO Pro System - 一鍵部署腳本 v2.0.0${NC}
${CYAN}═══════════════════════════════════════════════════════════════════════════════${NC}
${YELLOW}用法:${NC}
./deploy.sh [選項] [命令]
${YELLOW}基本命令:${NC}
deploy 執行完整部署(預設)
backup 備份現有環境(資料庫 + 配置)
restore 從備份還原
check 僅執行環境檢查
export 匯出部署包(不執行部署)
ssl 設定/更新 SSL 憑證
health 執行健康檢查
${YELLOW}K8s 命令:${NC}
k8s-deploy 部署到 Kubernetes 叢集
k8s-status 查看 K8s 部署狀態
k8s-logs 查看 K8s 應用日誌
k8s-rollback 回滾到上一個版本
k8s-cleanup 清理 K8s 資源
${YELLOW}Harbor 命令:${NC}
harbor-install 安裝 Harbor Registry
harbor-push 建構並推送映像到 Harbor
harbor-scan 觸發容器安全掃描
harbor-health 檢查 Harbor 健康狀態
${YELLOW}監控命令:${NC}
monitoring-deploy 部署監控堆疊 (Prometheus/Grafana)
monitoring-status 查看監控服務狀態
${YELLOW}系統命令:${NC}
systemd-setup 設定開機自動啟動服務
systemd-status 查看 systemd 服務狀態
${YELLOW}部署模式選項:${NC}
--local 本地 Docker Compose 部署(預設)
--k8s Kubernetes 部署
--ssh SSH 遠端部署
--export 匯出部署包
${YELLOW}SSH 選項:${NC}
-h, --host 目標主機 IP 或域名
-u, --user SSH 用戶名(預設: root
-p, --path 遠端部署路徑(預設: /opt/momo-pro-system
${YELLOW}K8s 選項:${NC}
-n, --namespace K8s 命名空間(預設: momo
${YELLOW}Harbor 選項:${NC}
--registry Harbor Registry URL
--harbor-user Harbor 用戶名
--harbor-pass Harbor 密碼
${YELLOW}配置選項:${NC}
-e, --env-file 使用自訂環境變數檔案
-d, --domain 設定域名(用於 SSL 憑證)
--no-monitoring 不部署監控服務
--with-data 包含資料庫備份(匯出/遠端部署時)
--with-systemd 設定 systemd 開機自動啟動
${YELLOW}備份/還原選項:${NC}
-b, --backup 指定備份檔案路徑(還原時使用)
${YELLOW}其他選項:${NC}
-y, --yes 跳過所有確認提示
--help 顯示此說明
${YELLOW}基本範例:${NC}
# 本地 Docker 部署(互動式配置)
./deploy.sh deploy
# SSH 遠端部署
./deploy.sh --ssh -h 192.168.1.100 -u wooo deploy
# 匯出部署包(含資料)
./deploy.sh --export --with-data
${YELLOW}K8s 範例:${NC}
# 部署到 K8s
./deploy.sh --k8s deploy
# 建構映像並推送到 Harbor然後部署到 K8s
./deploy.sh harbor-push && ./deploy.sh --k8s deploy
# 查看 K8s 狀態
./deploy.sh k8s-status
# 回滾 K8s 部署
./deploy.sh k8s-rollback
${YELLOW}監控範例:${NC}
# 部署完整監控堆疊
./deploy.sh monitoring-deploy
# 查看監控狀態
./deploy.sh monitoring-status
${YELLOW}完整部署流程:${NC}
# 1. 環境檢查
./deploy.sh check
# 2. 部署應用(含 systemd 設定)
./deploy.sh --with-systemd deploy
# 3. 設定 SSL
./deploy.sh -d mo.wooo.work ssl
# 4. 部署監控
./deploy.sh monitoring-deploy
# 5. 健康檢查
./deploy.sh health
${CYAN}═══════════════════════════════════════════════════════════════════════════════${NC}
EOF
}
# =============================================================================
# 解析命令行參數
# =============================================================================
parse_args() {
COMMAND="deploy" # 預設命令
while [[ $# -gt 0 ]]; do
case $1 in
# 基本命令
deploy|backup|restore|check|export|ssl|health)
COMMAND="$1"
shift
;;
# K8s 命令
k8s-deploy|k8s-status|k8s-logs|k8s-rollback|k8s-cleanup)
COMMAND="$1"
DEPLOY_TYPE="k8s"
shift
;;
# Harbor 命令
harbor-install|harbor-push|harbor-scan|harbor-health)
COMMAND="$1"
shift
;;
# 監控命令
monitoring-deploy|monitoring-status)
COMMAND="$1"
shift
;;
# systemd 命令
systemd-setup|systemd-status)
COMMAND="$1"
shift
;;
# 部署模式
--local)
DEPLOY_MODE="local"
DEPLOY_TYPE="docker"
shift
;;
--k8s)
DEPLOY_MODE="local"
DEPLOY_TYPE="k8s"
shift
;;
--ssh)
DEPLOY_MODE="ssh"
shift
;;
--export)
DEPLOY_MODE="export"
shift
;;
# SSH 選項
-h|--host)
TARGET_HOST="$2"
shift 2
;;
-u|--user)
TARGET_USER="$2"
shift 2
;;
-p|--path)
TARGET_PATH="$2"
shift 2
;;
# K8s 選項
-n|--namespace)
K8S_NAMESPACE="$2"
shift 2
;;
# Harbor 選項
--registry)
HARBOR_REGISTRY="$2"
shift 2
;;
--harbor-user)
HARBOR_USERNAME="$2"
shift 2
;;
--harbor-pass)
HARBOR_PASSWORD="$2"
shift 2
;;
# 配置選項
-e|--env-file)
ENV_FILE="$2"
shift 2
;;
-d|--domain)
DOMAIN="$2"
shift 2
;;
-b|--backup)
BACKUP_PATH="$2"
shift 2
;;
--no-monitoring)
INCLUDE_MONITORING="false"
shift
;;
--with-data)
INCLUDE_DATA="true"
shift
;;
--with-systemd)
SETUP_SYSTEMD="true"
shift
;;
-y|--yes)
SKIP_CONFIRM="true"
shift
;;
--help)
show_help
exit 0
;;
*)
log_error "未知選項: $1"
show_help
exit 1
;;
esac
done
# 驗證 SSH 模式參數
if [[ "$DEPLOY_MODE" == "ssh" && -z "$TARGET_HOST" ]]; then
log_error "SSH 模式需要指定目標主機 (-h/--host)"
exit 1
fi
# 驗證還原命令參數
if [[ "$COMMAND" == "restore" && -z "$BACKUP_PATH" ]]; then
log_error "還原命令需要指定備份檔案路徑 (-b/--backup)"
exit 1
fi
# 匯出環境變數供子模組使用
export HARBOR_REGISTRY HARBOR_USERNAME HARBOR_PASSWORD HARBOR_PROJECT
export K8S_NAMESPACE
export TELEGRAM_BOT_TOKEN TELEGRAM_CHAT_ID
export PROJECT_ROOT SKIP_CONFIRM
}
# =============================================================================
# 顯示部署摘要
# =============================================================================
show_summary() {
echo ""
log_section "部署摘要"
echo ""
echo " ${BOLD}命令:${NC} $COMMAND"
echo " ${BOLD}部署類型:${NC} $DEPLOY_TYPE"
echo " ${BOLD}部署模式:${NC} $DEPLOY_MODE"
if [[ "$DEPLOY_MODE" == "ssh" ]]; then
echo " ${BOLD}目標主機:${NC} ${TARGET_USER}@${TARGET_HOST}"
echo " ${BOLD}遠端路徑:${NC} $TARGET_PATH"
fi
if [[ "$DEPLOY_TYPE" == "k8s" ]]; then
echo " ${BOLD}K8s 命名空間:${NC} $K8S_NAMESPACE"
echo " ${BOLD}Harbor:${NC} $HARBOR_REGISTRY"
fi
if [[ -n "$ENV_FILE" ]]; then
echo " ${BOLD}環境變數:${NC} $ENV_FILE"
fi
if [[ -n "$DOMAIN" ]]; then
echo " ${BOLD}域名:${NC} $DOMAIN"
fi
echo " ${BOLD}監控服務:${NC} $([ "$INCLUDE_MONITORING" == "true" ] && echo "✓ 包含" || echo "✗ 不包含")"
echo " ${BOLD}資料備份:${NC} $([ "$INCLUDE_DATA" == "true" ] && echo "✓ 包含" || echo "✗ 不包含")"
echo " ${BOLD}Systemd:${NC} $([ "$SETUP_SYSTEMD" == "true" ] && echo "✓ 設定開機啟動" || echo "✗ 不設定")"
echo ""
if [[ "$SKIP_CONFIRM" != "true" ]]; then
read -p " 確認繼續? [y/N]: " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
log_info "已取消操作"
exit 0
fi
fi
}
# =============================================================================
# 執行部署
# =============================================================================
do_deploy() {
log_section "開始部署 MOMO Pro System"
# Step 1: 環境檢查
log_step 1 8 "環境檢查"
check_prerequisites
# Step 2: 準備配置
log_step 2 8 "準備配置"
if [[ -n "$ENV_FILE" ]]; then
validate_env_file "$ENV_FILE"
else
generate_env_interactive
fi
# Step 3: 根據模式執行不同的部署
case $DEPLOY_MODE in
local)
do_local_deploy
;;
ssh)
do_ssh_deploy
;;
export)
do_export_package
;;
esac
}
# =============================================================================
# 本地部署
# =============================================================================
do_local_deploy() {
log_step 3 8 "拉取 Docker 映像"
docker_pull_images
log_step 4 8 "啟動核心服務"
docker_start_core
if [[ "$INCLUDE_MONITORING" == "true" ]]; then
log_step 5 8 "啟動監控服務"
docker_start_monitoring
else
log_step 5 8 "跳過監控服務"
fi
log_step 6 8 "等待服務啟動"
wait_for_services
log_step 7 8 "匯入 n8n 工作流程"
import_n8n_workflows
log_step 8 8 "健康檢查"
health_check_all
log_success "本地部署完成!"
show_access_info "localhost"
}
# =============================================================================
# SSH 遠端部署
# =============================================================================
do_ssh_deploy() {
log_step 3 8 "測試 SSH 連線"
test_ssh_connection "$TARGET_HOST" "$TARGET_USER"
log_step 4 8 "同步檔案到遠端"
sync_files_to_remote "$TARGET_HOST" "$TARGET_USER" "$TARGET_PATH"
log_step 5 8 "遠端執行部署"
ssh_execute_deploy "$TARGET_HOST" "$TARGET_USER" "$TARGET_PATH" "$INCLUDE_MONITORING"
log_step 6 8 "等待遠端服務啟動"
ssh_wait_for_services "$TARGET_HOST" "$TARGET_USER"
log_step 7 8 "匯入 n8n 工作流程"
ssh_import_n8n_workflows "$TARGET_HOST" "$TARGET_USER"
log_step 8 8 "遠端健康檢查"
ssh_health_check "$TARGET_HOST"
log_success "SSH 遠端部署完成!"
show_access_info "$TARGET_HOST"
}
# =============================================================================
# 匯出部署包
# =============================================================================
do_export_package() {
log_step 3 5 "準備匯出目錄"
EXPORT_DIR="${PROJECT_ROOT}/export_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$EXPORT_DIR"
log_step 4 5 "複製必要檔案"
copy_deploy_files "$EXPORT_DIR"
if [[ "$INCLUDE_DATA" == "true" ]]; then
log_info "備份資料庫..."
backup_database "$EXPORT_DIR/backup"
fi
log_step 5 5 "建立壓縮包"
PACKAGE_NAME="momo-pro-system_$(date +%Y%m%d_%H%M%S).tar.gz"
tar -czf "${PROJECT_ROOT}/${PACKAGE_NAME}" -C "$(dirname "$EXPORT_DIR")" "$(basename "$EXPORT_DIR")"
rm -rf "$EXPORT_DIR"
log_success "部署包已匯出: ${PROJECT_ROOT}/${PACKAGE_NAME}"
echo ""
echo " 大小: $(du -h "${PROJECT_ROOT}/${PACKAGE_NAME}" | cut -f1)"
echo ""
echo " 使用方式:"
echo " 1. 將檔案複製到目標主機"
echo " 2. 解壓縮: tar -xzf ${PACKAGE_NAME}"
echo " 3. 進入目錄: cd momo-pro-system"
echo " 4. 執行部署: ./deploy/deploy.sh deploy"
}
# =============================================================================
# 備份
# =============================================================================
do_backup() {
log_section "備份現有環境"
BACKUP_DIR="${PROJECT_ROOT}/backups"
mkdir -p "$BACKUP_DIR"
BACKUP_NAME="momo_backup_$(date +%Y%m%d_%H%M%S)"
BACKUP_FULL_PATH="${BACKUP_DIR}/${BACKUP_NAME}"
mkdir -p "$BACKUP_FULL_PATH"
log_step 1 4 "備份資料庫"
backup_database "$BACKUP_FULL_PATH"
log_step 2 4 "備份配置檔案"
backup_configs "$BACKUP_FULL_PATH"
log_step 3 4 "備份 n8n 工作流程"
backup_n8n_workflows "$BACKUP_FULL_PATH"
log_step 4 4 "建立壓縮包"
tar -czf "${BACKUP_FULL_PATH}.tar.gz" -C "$BACKUP_DIR" "$BACKUP_NAME"
rm -rf "$BACKUP_FULL_PATH"
log_success "備份完成: ${BACKUP_FULL_PATH}.tar.gz"
echo " 大小: $(du -h "${BACKUP_FULL_PATH}.tar.gz" | cut -f1)"
}
# =============================================================================
# 還原
# =============================================================================
do_restore() {
log_section "從備份還原"
if [[ ! -f "$BACKUP_PATH" ]]; then
log_error "備份檔案不存在: $BACKUP_PATH"
exit 1
fi
log_step 1 4 "解壓縮備份"
RESTORE_DIR=$(mktemp -d)
tar -xzf "$BACKUP_PATH" -C "$RESTORE_DIR"
BACKUP_CONTENT=$(ls "$RESTORE_DIR")
log_step 2 4 "停止現有服務"
docker_stop_all
log_step 3 4 "還原資料庫"
restore_database "${RESTORE_DIR}/${BACKUP_CONTENT}"
log_step 4 4 "還原配置檔案"
restore_configs "${RESTORE_DIR}/${BACKUP_CONTENT}"
rm -rf "$RESTORE_DIR"
log_success "還原完成!請執行 ./deploy.sh deploy 重新啟動服務"
}
# =============================================================================
# SSL 設定
# =============================================================================
do_ssl() {
if [[ -z "$DOMAIN" ]]; then
log_error "需要指定域名 (-d/--domain)"
exit 1
fi
log_section "設定 SSL 憑證: $DOMAIN"
setup_ssl_certificate "$DOMAIN"
log_success "SSL 憑證設定完成!"
}
# =============================================================================
# 健康檢查
# =============================================================================
do_health() {
log_section "執行健康檢查"
if [[ "$DEPLOY_MODE" == "ssh" && -n "$TARGET_HOST" ]]; then
ssh_health_check "$TARGET_HOST"
else
health_check_all
fi
}
# =============================================================================
# 環境檢查
# =============================================================================
do_check() {
log_section "環境檢查"
check_prerequisites
log_success "環境檢查通過!"
}
# =============================================================================
# K8s 命令處理
# =============================================================================
do_k8s_deploy() {
log_section "部署到 Kubernetes"
# 檢查 K8s 環境
check_k8s_prerequisites || exit 1
# 建構並推送映像
if [[ "$SKIP_CONFIRM" != "true" ]]; then
read -p " 是否先建構並推送映像到 Harbor? [y/N]: " build_first
if [[ "$build_first" =~ ^[Yy]$ ]]; then
k8s_build_and_push
fi
fi
# 執行 K8s 部署
k8s_deploy_all "$K8S_NAMESPACE"
# 設定 systemd (可選)
if [[ "$SETUP_SYSTEMD" == "true" ]]; then
log_info "K8s 環境通常不需要額外的 systemd 配置"
fi
log_success "K8s 部署完成!"
k8s_status "$K8S_NAMESPACE"
}
do_k8s_status() {
k8s_status "$K8S_NAMESPACE"
}
do_k8s_logs() {
local deployment="${2:-momo-app}"
k8s_logs "$K8S_NAMESPACE" "$deployment"
}
do_k8s_rollback() {
local deployment="${2:-momo-app}"
k8s_rollback "$K8S_NAMESPACE" "$deployment"
}
do_k8s_cleanup() {
k8s_cleanup "$K8S_NAMESPACE"
}
# =============================================================================
# Harbor 命令處理
# =============================================================================
do_harbor_install() {
install_harbor "$DOMAIN" "$HARBOR_PASSWORD"
}
do_harbor_push() {
harbor_build_and_push "momo-pro-system" "latest" "Dockerfile" "$PROJECT_ROOT"
}
do_harbor_scan() {
harbor_scan_image "wooo/momo-pro-system:latest"
sleep 5
harbor_get_scan_report "wooo/momo-pro-system:latest"
}
do_harbor_health() {
harbor_health_check
}
# =============================================================================
# 監控命令處理
# =============================================================================
do_monitoring_deploy() {
log_section "部署監控堆疊"
if [[ "$DEPLOY_TYPE" == "k8s" ]]; then
# K8s 監控 (Helm)
install_helm
add_helm_repos
deploy_prometheus_stack "$MONITORING_NAMESPACE"
deploy_loki "$MONITORING_NAMESPACE"
else
# Docker 監控
deploy_docker_monitoring
fi
log_success "監控堆疊部署完成!"
}
do_monitoring_status() {
if [[ "$DEPLOY_TYPE" == "k8s" ]]; then
check_monitoring_health "$MONITORING_NAMESPACE"
else
echo ""
log_section "Docker 監控服務狀態"
echo ""
docker ps --filter "name=momo-" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep -E "prometheus|grafana|alertmanager|loki|cadvisor|node-exporter" || echo " 無監控容器運行"
echo ""
fi
}
# =============================================================================
# Systemd 命令處理
# =============================================================================
do_systemd_setup() {
setup_all_services "$PROJECT_ROOT"
}
do_systemd_status() {
show_services_status
}
# =============================================================================
# 更新 do_deploy 以支援多種部署類型
# =============================================================================
do_deploy_enhanced() {
log_section "開始部署 MOMO Pro System"
# Step 1: 環境檢查
log_step 1 8 "環境檢查"
check_prerequisites
if [[ "$DEPLOY_TYPE" == "k8s" ]]; then
check_k8s_prerequisites || exit 1
fi
# Step 2: 準備配置
log_step 2 8 "準備配置"
if [[ -n "$ENV_FILE" ]]; then
validate_env_file "$ENV_FILE"
else
generate_env_interactive
fi
# Step 3: 根據部署類型和模式執行部署
case "$DEPLOY_TYPE" in
k8s)
do_k8s_deploy
;;
docker)
case $DEPLOY_MODE in
local)
do_local_deploy
;;
ssh)
do_ssh_deploy
;;
export)
do_export_package
;;
esac
;;
esac
# 設定 systemd (如果指定)
if [[ "$SETUP_SYSTEMD" == "true" && "$DEPLOY_TYPE" == "docker" ]]; then
log_info "設定開機自動啟動..."
setup_all_services "$PROJECT_ROOT"
fi
}
# =============================================================================
# 主程式
# =============================================================================
main() {
clear
echo ""
echo "${PURPLE}╔═══════════════════════════════════════════════════════════════════════════╗${NC}"
echo "${PURPLE}${NC} ${BOLD}MOMO Pro System - 一鍵部署工具 v2.0.0${NC} ${PURPLE}${NC}"
echo "${PURPLE}${NC} ${DIM}WOOO TECH © 2026${NC} ${PURPLE}${NC}"
echo "${PURPLE}╚═══════════════════════════════════════════════════════════════════════════╝${NC}"
echo ""
parse_args "$@"
# 顯示摘要(除了 help、check 和狀態查詢命令)
case "$COMMAND" in
check|k8s-status|k8s-logs|monitoring-status|systemd-status|harbor-health)
# 這些命令不需要確認
;;
*)
show_summary
;;
esac
# 執行對應命令
case $COMMAND in
# 基本命令
deploy)
do_deploy_enhanced
;;
backup)
do_backup
;;
restore)
do_restore
;;
check)
do_check
;;
export)
DEPLOY_MODE="export"
do_deploy
;;
ssl)
do_ssl
;;
health)
do_health
;;
# K8s 命令
k8s-deploy)
do_k8s_deploy
;;
k8s-status)
do_k8s_status
;;
k8s-logs)
do_k8s_logs
;;
k8s-rollback)
do_k8s_rollback
;;
k8s-cleanup)
do_k8s_cleanup
;;
# Harbor 命令
harbor-install)
do_harbor_install
;;
harbor-push)
do_harbor_push
;;
harbor-scan)
do_harbor_scan
;;
harbor-health)
do_harbor_health
;;
# 監控命令
monitoring-deploy)
do_monitoring_deploy
;;
monitoring-status)
do_monitoring_status
;;
# Systemd 命令
systemd-setup)
do_systemd_setup
;;
systemd-status)
do_systemd_status
;;
*)
log_error "未知命令: $COMMAND"
show_help
exit 1
;;
esac
echo ""
}
# 執行主程式
main "$@"