All checks were successful
CD Pipeline / deploy (push) Successful in 1m19s
P2 (Inline Keyboard 降價決策): - routes/bot_api_routes.py: POST /bot/api/price-decision/notify - services/telegram_bot_service.py: pa:/pr: callback handlers P3 (OpenClaw 自動觸發): - services/openclaw_strategist_service.py: Gemini 週報末尾輸出 PRICE_DECISIONS_JSON,解析後自動推送 inline keyboard 給 admin Ops 修復(跨專案隔離與容器斷訊根因): - ADR-011 全面規範多專案共存邊界、禁用 --remove-orphans - .gitea/workflows/cd.yaml: sync 模式一次重啟三容器 (原本僅 momo-pro-system,scheduler/telegram-bot 靜默落伍) - run_telegram_bot.py: 從 scripts/tools/ 複製到根目錄 (消滅 docker-compose mount 建空目錄的陷阱) - CLAUDE.md: 補核心容器表、診斷黃金三句、緊急指令 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
4.4 KiB
4.4 KiB
ADR-011: 跨專案資源隔離與 Container 管理原則
- Status: Accepted
- Date: 2026-04-19
- Deciders: 統帥
- Related: ADR-008(文件對齊實況), ADR-010(Gitea CI/CD)
Context
2026-04-19 發現 AI Agent 連續數日沒發任何 Telegram 通知(日報/比價/異常告警全斷)。根因調查揭露 188 主機是多專案共享環境,momo-pro、clawbot-v5、AWOOOI、wooo-aiops 等 5+ 個 compose project 並存,過去的部署操作缺乏隔離邊界檢查,造成下列風險:
實況盤點
momo-pro-system容器不是 compose 管理的(手動 docker run,labels 全空)momo-scheduler/momo-db是 compose 建立但 service name 對不上現行 compose 檔(視為 orphan)momo-telegram-bot容器從未被建立(docker ps -a 無歷史)docker compose up會自動建立 orphan 警告,若使用--remove-orphans會清掉 momo-db(資料災難)momo-pro/.env使用的 bot 實為OpenClawAwoooI_Bot(共用三專案),非 momo-pro 獨有docker-compose.yml部分 volume mount 指向不存在的根目錄檔案(如./run_telegram_bot.py),docker 會自動建空目錄造成__main__錯誤- compose 檔宣告的
momo-network與既有momo-pro_default網路分裂,新舊容器無法互連 DNS
衝擊
- 排程容器看似在跑,但環境變數沒注入 → 靜默失敗
- 跨專案盲改可能破壞
momo-db或openclaw容器 - 未來 CD 若無隔離檢查,會重複踩同樣的洞
Decision
① 隔離邊界(不可跨越)
| 資源 | 歸屬 | 不可做的事 |
|---|---|---|
momo-db(pgvector/pg14) |
momo-pro 獨家 | 任何其他專案不得連入 momo-pro_default 網路 |
NVIDIA_API_KEY |
momo-pro 獨家 | 不得移入其他專案的 .env |
services/{hermes,nemoton,openclaw}_*_service.py |
momo-pro 獨家 | AWOOOI 若要用必須透過 HTTP API 呼叫,禁止 import |
openclaw 容器(port 8088) |
clawbot-v5 專案 | momo-pro CD 不得 stop/remove 該容器 |
Container 命名 momo-* 前綴 |
momo-pro 保留 | 其他專案禁用此前綴 |
② Container 操作原則
- 禁用
docker compose down/--remove-orphans(會殃及 orphan label 的 momo-db) - 首選
docker compose up -d --no-deps --force-recreate <service>精準重建單一容器 - 救急
docker network connect momo-pro_default <container>處理網路分裂 - 容器操作前三句診斷(見
memory/reference_docker_topology.md)必跑
③ docker-compose.yml 修正(本 ADR 同步提交)
networks改為引用既有網路,杜絕新舊分裂:所有 service 的networks: momo-pro_default: external: truenetworks:段落明確指向momo-pro_defaultscheduler/telegram-bot的depends_on改為condition: service_started或移除,避免連帶觸發momo-pro-system重建衝突run_telegram_bot.pymount 路徑從./run_telegram_bot.py改為./scripts/tools/run_telegram_bot.py(或本地根目錄補檔)
④ CD Pipeline 補強(cd.yaml)
sync 模式在 docker restart momo-pro-system 之後增加:
docker restart momo-scheduler momo-telegram-bot
rebuild 模式在 docker compose up -d 之後增加健康檢查三容器全綠。
⑤ Telegram 共用 Bot 規範
- callback_data 必加專案 prefix:
momo:pa:{id}/momo:pr:{id} - 推播訊息標頭加
[EwoooC]以便群組內識別來源 services/openclaw_strategist_service.py:229的硬編碼 token fallback 移除,改為顯式 fail
Consequences
正面
- 未來任何專案動作前,強制查 label 驗證歸屬,消滅「改 A 壞 B」風險
- 網路統一後,新建容器不會再因 DNS 失敗而靜默停擺
- CD 同步重啟三容器,根除「scheduler 跟不上代碼」的斷訊路徑
負面
- 舊有的手動 docker run 歷史債仍在(如
momo-pro-system無 compose label),完整遷移需一次停機窗口 - 共用 bot 的長期策略需另立專題:拆分成
momo-pro-bot/awoooi-bot/openclaw-bot三個獨立 bot
References
memory/reference_188_multi_project.md— 188 上專案清單與歸屬memory/reference_docker_topology.md— 四容器實況與診斷指令memory/feedback_shared_telegram_bot.md— 共用 bot 踩坑memory/project_telegram_restore_20260419.md— 本次斷訊修復記錄