# MOMO Pro System - CI/CD 與部署指南 > 完整的 CI/CD 流程與一鍵部署自動化指南 > 最後更新: 2026-02-06 --- ## 目錄 1. [架構總覽](#架構總覽) 2. [CI/CD 流程](#cicd-流程) 3. [一鍵部署到新主機](#一鍵部署到新主機) 4. [手動部署步驟](#手動部署步驟) 5. [自動啟動機制](#自動啟動機制) 6. [故障排除](#故障排除) --- ## 架構總覽 ``` ┌─────────────────────────────────────────────────────────────────────────────┐ │ MOMO Pro System 部署架構 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ 開發環境 (Mac) UAT 環境 (192.168.0.110) │ │ ┌──────────────┐ ┌────────────────────────────────────┐ │ │ │ 本地開發 │ │ K3s Kubernetes 叢集 │ │ │ │ git push │───────────────►│ │ │ │ └──────────────┘ CI/CD │ ┌────────────────────────────┐ │ │ │ │ │ momo-app (Flask) │ │ │ │ ┌──────────────┐ │ │ momo-scheduler (爬蟲) │ │ │ │ │ GitLab │◄───────────────►│ │ momo-postgres (PostgreSQL) │ │ │ │ │ :8929 │ │ └────────────────────────────┘ │ │ │ └──────────────┘ │ │ │ │ │ ┌────────────────────────────┐ │ │ │ │ │ 監控: Prometheus/Grafana │ │ │ │ │ │ 告警: Alertmanager/Telegram│ │ │ │ │ └────────────────────────────┘ │ │ │ └────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## CI/CD 流程 ### 流程圖 ``` git push │ ▼ ┌───────────────────┐ │ GitLab CI 觸發 │ │ .gitlab-ci.yml │ └─────────┬─────────┘ │ ▼ ┌───────────────────┐ ┌───────────────────┐ │ Stage: test │────►│ Stage: deploy │ │ • pytest 測試 │ │ • rsync 同步 │ │ • 允許失敗 │ │ • docker build │ └───────────────────┘ │ • k3s import │ │ • kubectl restart│ │ • 健康檢查 │ └─────────┬─────────┘ │ ▼ ┌───────────────────┐ │ Telegram 通知 │ │ 成功 ✅ / 失敗 ❌ │ └───────────────────┘ ``` ### GitLab CI 配置 (.gitlab-ci-simple.yml) 此配置**不依賴 Harbor**,直接在 K3s 主機建置映像: ```yaml stages: - test - deploy variables: K3S_HOST: "192.168.0.110" K3S_USER: "wooo" IMAGE_NAME: "momo-pro-system" deploy: stage: deploy script: # 1. 同步程式碼 - rsync -avz --delete --exclude='.git' ./ ${K3S_USER}@${K3S_HOST}:/home/wooo/momo_pro_system/ # 2. 在 K3s 主機建置 - ssh ${K3S_USER}@${K3S_HOST} "cd /home/wooo/momo_pro_system && docker build -t momo-pro-system:local ." # 3. 匯入到 K3s containerd - ssh ${K3S_USER}@${K3S_HOST} "docker save momo-pro-system:local | sudo k3s ctr images import -" # 4. 重啟服務 - ssh ${K3S_USER}@${K3S_HOST} "sudo kubectl rollout restart deployment/momo-app deployment/momo-scheduler -n momo" ``` ### 手動觸發部署 ```bash # 方法 1: 推送到 GitLab git add . git commit -m "feat: 新功能" git push gitlab main # 方法 2: 使用部署腳本 ./scripts/deploy/build-and-deploy.sh ``` --- ## 一鍵部署到新主機 ### 前置需求 | 項目 | 需求 | |------|------| | 作業系統 | Ubuntu 22.04 / Debian 12 | | CPU | 4 核心以上 | | 記憶體 | 8GB 以上 | | 硬碟 | 50GB SSD | | 網路 | 開放 80, 443 端口 | ### 方法 1: SSH 遠端部署 ```bash # 從本地部署到新主機 ./deploy/deploy.sh --ssh -h <新主機IP> -u root deploy # 例如: ./deploy/deploy.sh --ssh -h 192.168.0.200 -u wooo deploy ``` ### 方法 2: 匯出部署包 ```bash # 1. 在開發機匯出 ./deploy/deploy.sh --export --with-data # 2. 複製到新主機 scp momo-pro-system_*.tar.gz root@新主機:/opt/ # 3. 在新主機解壓並執行 ssh root@新主機 cd /opt tar -xzf momo-pro-system_*.tar.gz cd momo-pro-system ./deploy/deploy.sh deploy ``` ### 方法 3: K8s 部署 ```bash # 1. 確保 K3s 已安裝 curl -sfL https://get.k3s.io | sh - # 2. 套用 K8s 配置 kubectl apply -f k8s/00-namespace.yaml kubectl apply -f k8s/01-secrets.yaml kubectl apply -f k8s/02-configmap.yaml kubectl apply -f k8s/03-postgres.yaml kubectl apply -f k8s/04-momo-app.yaml kubectl apply -f k8s/05-scheduler.yaml # 3. 建置並匯入映像 docker build -t momo-pro-system:local . docker save momo-pro-system:local | sudo k3s ctr images import - # 4. 重啟服務 kubectl rollout restart deployment/momo-app deployment/momo-scheduler -n momo ``` --- ## 手動部署步驟 ### Step 1: 準備環境 ```bash # 安裝 Docker curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 安裝 K3s (可選) curl -sfL https://get.k3s.io | sh - ``` ### Step 2: 複製程式碼 ```bash git clone http://192.168.0.110:8929/root/momo-pro-system.git cd momo-pro-system ``` ### Step 3: 配置環境變數 ```bash cp deploy/configs/.env.template .env # 編輯 .env 填入實際值 ``` ### Step 4: 建置映像 ```bash docker build -t momo-pro-system:local . ``` ### Step 5: 部署服務 **Docker Compose 方式:** ```bash docker compose up -d ``` **K8s 方式:** ```bash # 匯入映像 docker save momo-pro-system:local | sudo k3s ctr images import - # 套用配置 kubectl apply -f k8s/ # 重啟 kubectl rollout restart deployment/momo-app -n momo ``` ### Step 6: 設定 SSL ```bash # 使用 Certbot sudo certbot --nginx -d mo.yourdomain.com ``` ### Step 7: 驗證 ```bash # 健康檢查 curl https://mo.yourdomain.com/health ``` --- ## 自動啟動機制 ### systemd 服務 系統重開機後自動啟動所有服務: ```bash # 安裝服務 sudo cp scripts/tools/momo-startup-complete.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable momo-startup-complete.service # 查看狀態 systemctl status momo-startup-complete.service ``` ### 啟動順序 ``` 系統啟動 │ ▼ (60秒延遲) Docker 服務啟動 │ ▼ Harbor Registry (可選) │ ▼ K8s Services ├── PostgreSQL (先啟動) ├── momo-app (等待 PostgreSQL) └── momo-scheduler (等待 momo-app) │ ▼ 健康檢查 + Telegram 通知 ``` ### 啟動腳本 ```bash # 手動執行啟動腳本 sudo /home/wooo/momo_pro_system/scripts/tools/system_startup_complete.sh # 查看日誌 sudo journalctl -u momo-startup-complete.service ``` --- ## 故障排除 ### CI/CD Pipeline 失敗 | 錯誤 | 原因 | 解決方案 | |------|------|---------| | SSH 連線失敗 | SSH key 未設定 | 設定 GitLab CI/CD 變數中的 SSH_PRIVATE_KEY | | Docker build 失敗 | 磁碟空間不足 | 執行 `docker system prune -af` | | kubectl 權限錯誤 | kubeconfig 問題 | 使用 `sudo kubectl` | ### K8s Pod 問題 ```bash # 查看 Pod 狀態 kubectl get pods -n momo # 查看日誌 kubectl logs -f deployment/momo-app -n momo # 進入 Pod 除錯 kubectl exec -it deployment/momo-app -n momo -- /bin/bash # 強制重啟 kubectl delete pod -n momo -l app=momo-app ``` ### 資料庫連線問題 ```bash # 檢查 PostgreSQL kubectl logs momo-postgres-0 -n momo # 測試連線 kubectl exec -n momo momo-postgres-0 -- psql -U momo -d momo_analytics -c "SELECT 1" ``` ### 健康檢查失敗 ```bash # 檢查服務狀態 curl -v https://mo.wooo.work/health # 檢查 Nginx sudo nginx -t sudo systemctl status nginx # 檢查 SSL openssl s_client -connect mo.wooo.work:443 -servername mo.wooo.work ``` --- ## 常用命令速查 ### 部署 ```bash # 完整部署 ./scripts/deploy/build-and-deploy.sh # 只重啟服務 ssh wooo@192.168.0.110 "sudo kubectl rollout restart deployment/momo-app -n momo" ``` ### 監控 ```bash # 查看 Pod 狀態 ssh wooo@192.168.0.110 "sudo kubectl get pods -n momo" # 查看資源使用 ssh wooo@192.168.0.110 "sudo kubectl top pods -n momo" # 查看日誌 ssh wooo@192.168.0.110 "sudo kubectl logs -f deployment/momo-app -n momo --tail=100" ``` ### 備份 ```bash # 備份資料庫 ./deploy/deploy.sh backup # 匯出部署包(含資料) ./deploy/deploy.sh --export --with-data ``` ### 驗證 ```bash # 執行完整驗證 ./scripts/verify-cicd.sh # 健康檢查 curl -s https://mo.wooo.work/health | jq ``` --- ## 相關檔案 | 檔案 | 說明 | |------|------| | `.gitlab-ci-simple.yml` | 簡化版 CI/CD 配置 (不依賴 Harbor) | | `scripts/deploy/build-and-deploy.sh` | 本地建置部署腳本 | | `deploy/deploy.sh` | 一鍵部署主腳本 | | `scripts/tools/system_startup_complete.sh` | 系統自動啟動腳本 | | `scripts/verify-cicd.sh` | CI/CD 完整驗證腳本 | | `k8s/` | K8s 配置檔案目錄 | | `k8s/optimized/` | 優化版 K8s 配置 | --- ## 聯絡資訊 - **Telegram 告警**: Bot `@wooowooowooobot` - **GitLab**: http://192.168.0.110:8929 - **Grafana**: http://192.168.0.110:30030 - **正式網址**: https://mo.wooo.work