Files
ewoooc/docs/adr/ADR-011-cross-project-resource-isolation.md
ogt 8d0b79cd00
All checks were successful
CD Pipeline / deploy (push) Successful in 1m19s
feat(ops): restore Telegram chain + P2/P3 price decisions + ADR-011
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>
2026-04-19 12:25:04 +08:00

4.4 KiB
Raw Blame History

ADR-011: 跨專案資源隔離與 Container 管理原則

  • Status: Accepted
  • Date: 2026-04-19
  • Deciders: 統帥
  • Related: ADR-008文件對齊實況, ADR-010Gitea CI/CD

Context

2026-04-19 發現 AI Agent 連續數日沒發任何 Telegram 通知(日報/比價/異常告警全斷)。根因調查揭露 188 主機是多專案共享環境momo-pro、clawbot-v5、AWOOOI、wooo-aiops 等 5+ 個 compose project 並存,過去的部署操作缺乏隔離邊界檢查,造成下列風險:

實況盤點

  1. momo-pro-system 容器不是 compose 管理的(手動 docker runlabels 全空)
  2. momo-scheduler / momo-db 是 compose 建立但 service name 對不上現行 compose 檔(視為 orphan
  3. momo-telegram-bot 容器從未被建立docker ps -a 無歷史)
  4. docker compose up 會自動建立 orphan 警告,若使用 --remove-orphans清掉 momo-db(資料災難)
  5. momo-pro/.env 使用的 bot 實為 OpenClawAwoooI_Bot(共用三專案),非 momo-pro 獨有
  6. docker-compose.yml 部分 volume mount 指向不存在的根目錄檔案(如 ./run_telegram_bot.pydocker 會自動建空目錄造成 __main__ 錯誤
  7. compose 檔宣告的 momo-network 與既有 momo-pro_default 網路分裂,新舊容器無法互連 DNS

衝擊

  • 排程容器看似在跑,但環境變數沒注入 → 靜默失敗
  • 跨專案盲改可能破壞 momo-dbopenclaw 容器
  • 未來 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 同步提交)

  1. networks 改為引用既有網路,杜絕新舊分裂:
    networks:
      momo-pro_default:
        external: true
    
    所有 service 的 networks: 段落明確指向 momo-pro_default
  2. scheduler / telegram-botdepends_on 改為 condition: service_started 或移除,避免連帶觸發 momo-pro-system 重建衝突
  3. run_telegram_bot.py mount 路徑從 ./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 必加專案 prefixmomo: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 — 本次斷訊修復記錄