From 832030b6de07d244d0565325af54f9c0f6097ef9 Mon Sep 17 00:00:00 2001 From: OoO Date: Tue, 28 Apr 2026 15:34:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(cd):=20sync=20=E6=A8=A1=E5=BC=8F=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20compose=20up=20-d=20=E5=8F=96=E4=BB=A3=20restart?= =?UTF-8?q?=EF=BC=8C=E6=A0=B9=E9=99=A4=20502=20=E5=BE=A9=E7=99=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:cd.yaml sync 模式用 `docker compose restart`,對「不存在的容器」 直接報錯 → 任何外力(人工 docker rm、orphan 清理、別專案連動)清掉容器後, 下次 sync 部署 100% 失敗 → 健康檢查 5 連 502。 修法: - sync 模式改 `docker compose up -d --no-deps`:image 未變時對既存容器 no-op(觸發熱掛載),對不存在則自動 create - 緊急回滾 step 同步從 `docker restart momo-pro-system ...` 改 `compose up -d`, 否則容器不存在時連回滾都救不回 驗證:2026-04-28 15:33 跑 P0 救急已成功讓 4/4 容器 healthy + HTTP 200。 Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitea/workflows/cd.yaml | 15 ++++++++----- ...DR-011-cross-project-resource-isolation.md | 6 +++++ docs/guides/devops_handbook.md | 22 +++++++++++++++++++ docs/memory/history_logs.md | 7 ++++++ 4 files changed, 45 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml index 5f8e926..49e031a 100644 --- a/.gitea/workflows/cd.yaml +++ b/.gitea/workflows/cd.yaml @@ -169,10 +169,13 @@ jobs: - name: 重啟容器(Sync 模式) if: steps.deploy_type.outputs.type == 'sync' run: | + # ROOT CAUSE FIX (2026-04-28): 從 `restart` 改為 `up -d` + # restart 對「不存在的容器」會失敗 → 任一外力清掉容器後下次 sync 必爆 502 + # up -d 對 image 未變的容器是 no-op(只觸發熱掛載),對不存在則自動 create ssh -i ~/.ssh/id_deploy ollama@192.168.0.188 \ "cd /home/ollama/momo-pro && \ - docker compose restart momo-app scheduler telegram-bot && \ - echo '✅ 三容器已重啟(app/scheduler/telegram-bot)'" + docker compose up -d --no-deps momo-app scheduler telegram-bot && \ + echo '✅ 三容器已就緒(app/scheduler/telegram-bot)'" # ── 模式 B:重建 Docker Image(Dockerfile / requirements.txt 變動) ── - name: 同步所有檔案並重建 Image @@ -287,13 +290,15 @@ jobs: -H "Content-Type: application/json" \ -d "$(jq -n --arg c "$TG_CHAT" --arg t "$MSG" '{chat_id:$c,text:$t,parse_mode:"HTML"}')" - # ── H4: 緊急回滾嘗試(部署失敗時嘗試重啟三容器回復服務)─────────────── + # ── H4: 緊急回滾嘗試(部署失敗時嘗試起回三容器回復服務)─────────────── - name: 緊急回滾嘗試 if: failure() run: | - echo "⚠️ 部署失敗,嘗試重啟三容器回復服務..." + echo "⚠️ 部署失敗,嘗試 compose up -d 回復三容器..." + # 同樣用 up -d 而非 restart,對「不存在的容器」也能起回來 ssh -i ~/.ssh/id_deploy ollama@192.168.0.188 \ - "docker restart momo-pro-system momo-scheduler momo-telegram-bot 2>&1 || true" || true + "cd /home/ollama/momo-pro && \ + docker compose up -d --no-deps momo-app scheduler telegram-bot 2>&1 || true" || true # ── 部署失敗通知(C1 fix: env: 區塊隔離)──────────────────────────── - name: 通知部署失敗 diff --git a/docs/adr/ADR-011-cross-project-resource-isolation.md b/docs/adr/ADR-011-cross-project-resource-isolation.md index 085ccec..1769f8d 100644 --- a/docs/adr/ADR-011-cross-project-resource-isolation.md +++ b/docs/adr/ADR-011-cross-project-resource-isolation.md @@ -17,6 +17,7 @@ 5. `momo-pro/.env` 使用的 bot 實為 **`OpenClawAwoooI_Bot`(共用三專案)**,非 momo-pro 獨有 6. `docker-compose.yml` 部分 volume mount 指向**不存在**的根目錄檔案(如 `./run_telegram_bot.py`),docker 會自動建空目錄造成 `__main__` 錯誤 7. compose 檔宣告的 `momo-network` 與既有 `momo-pro_default` **網路分裂**,新舊容器無法互連 DNS +8. **2026-04-28 追更**: `docker-compose.yml` 遺漏了 `telegram-bot` 與 `scheduler` 的 `./routes` 掛載,導致代碼更新無效(幽靈容器問題);且 `depends_on: postgres` 導致與 orphan `momo-db` 發生 5432 埠位衝突。 ### 衝擊 - 排程容器看似在跑,但環境變數沒注入 → 靜默失敗 @@ -53,6 +54,11 @@ 所有 service 的 `networks:` 段落明確指向 `momo-pro_default` 2. `scheduler` / `telegram-bot` 的 `depends_on` 改為 `condition: service_started` 或移除,避免連帶觸發 `momo-pro-system` 重建衝突 3. `run_telegram_bot.py` mount 路徑從 `./run_telegram_bot.py` 改為 `./scripts/tools/run_telegram_bot.py`(或本地根目錄補檔) +4. **2026-04-28 修正**: + - `telegram-bot` 與 `scheduler` 的 `volumes` 段落補齊 `- ./routes:/app/routes:ro`。 + - 徹底移除 `depends_on: postgres`,改由程式碼內部的 `OllamaService` 健康檢查與 `Database` 連線重試機制處理。 + - CD 模式 B (Rebuild) 增加 `--no-cache` 以應對 Docker Snapshot 損壞。 + - CD 模式 A (Sync) 使用 `docker compose restart` 取代硬編碼容器名稱。 ### ④ CD Pipeline 補強(cd.yaml) diff --git a/docs/guides/devops_handbook.md b/docs/guides/devops_handbook.md index a11b630..c333eb4 100644 --- a/docs/guides/devops_handbook.md +++ b/docs/guides/devops_handbook.md @@ -54,3 +54,25 @@ - `https://momo.wooo.work/health` -> 200 - `https://monitor.wooo.work/` -> 200 - `https://registry.wooo.work/v2/` -> 401 + +--- + +## 🆘 故障排除 (Troubleshooting) - 2026-04-28 實戰總結 + +### 1. 網站 502 Bad Gateway (Nginx 找不到後端) +- **原因**: 110 與 188 之間的 SSH 隧道中斷。 +- **檢查**: 在 110 執行 `curl -I http://127.0.0.1:5003/health`。 +- **修復**: 在 110 執行 `ssh -fN -L 5003:127.0.0.1:5003 ollama@192.168.0.188` 重啟隧道。 + +### 2. CI/CD 報錯 `parent snapshot ... not found` +- **原因**: Docker Buildx 快取損壞。 +- **修復**: 在 `.gitea/workflows/cd.yaml` 中使用 `docker compose build --no-cache`。 + +### 3. CI/CD 報錯 `No such container: momo-pro-system` +- **原因**: Sync 模式使用硬編碼容器名,但容器可能已被重建或改名。 +- **修復**: 使用 `docker compose restart ` 取代直接重啟容器。 + +### 4. Telegram Bot 代碼更新無效 (幽靈容器) +- **原因**: `docker-compose.yml` 遺漏了 `/app/routes` 的 Volume 掛載。 +- **檢查**: `docker inspect momo-telegram-bot | jq '.[0].Mounts'`。 +- **修復**: 確保 `volumes` 段落包含 `- ./routes:/app/routes:ro`。 diff --git a/docs/memory/history_logs.md b/docs/memory/history_logs.md index c12ce3d..c89584a 100644 --- a/docs/memory/history_logs.md +++ b/docs/memory/history_logs.md @@ -10,6 +10,13 @@ ## 📅 詳細更新日誌 (考古存檔) +### 2026-04-28:AI 引擎穩定性與 CI/CD 幽靈容器大規模修復 +- **幽靈容器排除**: 發現 `docker-compose.yml` 漏掛載 `routes` 目錄,導致 Telegram Bot 長期執行舊代碼。 +- **埠位衝突修復**: 移除 `depends_on: postgres` 以解決與 orphan `momo-db` 的 5432 埠位競爭問題。 +- **CI/CD 強化**: `cd.yaml` 引入 `--no-cache` 與 `docker compose restart` 以應對快取損壞與容器識別問題。 +- **AI 備援優化**: 放寬 Ollama 健康檢查至 10s,請求超時至 180s,修復 Gemini 429 速率限制與 MCP 404 報錯。 +- **網站 502 修復**: 手動恢復因容器重建中斷的 110-188 SSH 隧道。 + ### 2026-02-13:重開機服務修復與 Clawdbot 整合 - 更新 `system_startup.sh` v2.0,移除 Harbor 相關邏輯。 - 重新設計 Monitor 首頁,移除不存在的服務連結。