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>
This commit is contained in:
86
docs/adr/ADR-011-cross-project-resource-isolation.md
Normal file
86
docs/adr/ADR-011-cross-project-resource-isolation.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# 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 並存,過去的部署操作缺乏隔離邊界檢查,造成下列風險:
|
||||
|
||||
### 實況盤點
|
||||
1. `momo-pro-system` 容器**不是** compose 管理的(手動 docker run,labels 全空)
|
||||
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.py`),docker 會自動建空目錄造成 `__main__` 錯誤
|
||||
7. 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 同步提交)
|
||||
|
||||
1. `networks` 改為引用既有網路,杜絕新舊分裂:
|
||||
```yaml
|
||||
networks:
|
||||
momo-pro_default:
|
||||
external: true
|
||||
```
|
||||
所有 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`(或本地根目錄補檔)
|
||||
|
||||
### ④ CD Pipeline 補強(cd.yaml)
|
||||
|
||||
sync 模式在 `docker restart momo-pro-system` 之後增加:
|
||||
```bash
|
||||
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` — 本次斷訊修復記錄
|
||||
Reference in New Issue
Block a user