diff --git a/docs/LOGBOOK.md b/docs/LOGBOOK.md index 813b36134..8316bfea4 100644 --- a/docs/LOGBOOK.md +++ b/docs/LOGBOOK.md @@ -25717,3 +25717,58 @@ production browser smoke: - Ansible / PlayBook 自動執行:約 0% runtime-ready;`ansible_playbook_binary_missing` gate 未解除前不可宣稱可自動執行。 - 24h 完整自動修復 production claim:0%;目前可視化與單點 smoke 已補強,但完整自動修復閉環仍需 24h production evidence。 - 完整 AI 自動化管理產品化:約 99.45%;可視化接近完整,下一段應處理 MCP allowlist / adapter 失敗與 Ansible runtime gate。 + +## 2026-06-01 | 自建 MCP SSH alias / filter_name 合約修正 + +**背景**:Run detail MCP 證據矩陣上線後,production Run 顯示自建 MCP audit total `100`、success `88`、failed `12`。失敗不是「MCP 沒用」,而是兩個具體 adapter/參數契約問題: +- `Host 'wooo' not in SSH_MCP_ALLOWED_HOSTS` +- `'filter_name'` + +**根因判定**: +- Production `SSH_MCP_ALLOWED_HOSTS` 仍是既有 IP 白名單:`192.168.0.110,192.168.0.120,192.168.0.121,192.168.0.188`;不應為了 `wooo` 直接放寬 SSH scope。 +- `wooo` 在實際事件裡是 110 devops host 的別名,應在 provider / PDI 層正規化成 `192.168.0.110`。 +- `decision_manager.py` 仍有舊呼叫使用 `container_name` 呼叫 `ssh_get_container_status`;正式 schema 要求 `filter_name`,因此 audit 會記錄 `'filter_name'`。 + +**完成變更**: +- `apps/api/src/plugins/mcp/providers/ssh_provider.py` + - `SHORT_HOST_MAP` 增加 `wooo -> 192.168.0.110`,只做 alias normalization,不擴大 allowed hosts。 + - `ssh_get_container_status` command builder 支援舊呼叫 `container_name` / `name` fallback,缺參時回明確 `Missing filter_name for ssh_get_container_status`。 +- `apps/api/src/services/pre_decision_investigator.py` + - `_SHORT_HOST_MAP` 增加 `wooo -> 192.168.0.110`,讓決策前調查的 MCP 參數先落在 production allowlist。 +- `apps/api/src/services/decision_manager.py` + - `ssh_get_container_status` 呼叫改送 `filter_name`,並保留 `container_name` 相容欄位。 +- 測試新增: + - `test_normalize_ssh_host_strips_exporter_ports_and_users` 覆蓋 `wooo` / `wooo:9100`。 + - `test_ssh_container_status_accepts_legacy_container_name_alias` 覆蓋舊呼叫相容。 + - `test_build_tool_params_maps_wooo_alias_to_allowed_ssh_host` 覆蓋 PDI 事件參數建構。 + +**驗證與部署**: +- Local validation: + - `DATABASE_URL=postgresql://test:test@localhost:5432/test PYTHONPATH=apps/api pytest apps/api/tests/test_ssh_provider_tools.py apps/api/tests/test_pre_decision_investigator.py -q` + - 結果:`44 passed in 0.62s` + - `python3 -m py_compile apps/api/src/plugins/mcp/providers/ssh_provider.py apps/api/src/services/pre_decision_investigator.py apps/api/src/services/decision_manager.py` + - `git diff --check` +- Commit:`87378b45 fix(api): normalize ssh mcp evidence inputs`,已推 `gitea main`。 +- Gitea: + - `code-review #2358` success。 + - `cd #2357` success:`tests`、`build-and-deploy`、`post-deploy-checks` 全部 success。 +- Production image / rollout: + - `awoooi-api=192.168.0.110:5000/awoooi/api:87378b452d8635b12ec23e33c95bfbedccc3de00` + - `awoooi-worker=192.168.0.110:5000/awoooi/api:87378b452d8635b12ec23e33c95bfbedccc3de00` + - `awoooi-web=192.168.0.110:5000/awoooi/web:87378b452d8635b12ec23e33c95bfbedccc3de00` + - `kubectl rollout status deployment/awoooi-api deployment/awoooi-worker deployment/awoooi-web` 全部成功。 +- Production pod 內驗證: + - `_normalize_ssh_host("wooo:9100") -> 192.168.0.110` + - `_build_tool_params(...)["host"] -> 192.168.0.110` + - `SSHProvider()._build_command("ssh_get_container_status", {"container_name": "awoooi-api"}) -> docker ps -a --filter name=awoooi-api` + +**目前整體進度(本階段完成後)**: +- MCP / 自建 MCP 可視化:約 99.2%;前端已能看見成功 / 失敗與工具來源。 +- MCP adapter 正確性:約 98.8%;本輪已修掉 `wooo` alias 與 `filter_name` 兩個已驗證失敗根因,後續需觀察新 Incident audit failed count 是否下降。 +- AwoooP Runs / Approvals / Work Items 前端同步:約 99.95%;Run detail 能追到 Incident、MCP、補救試跑與狀態鏈。 +- Telegram / DB / AwoooP / 前端 truth-chain 可視化:約 99.95%;下一段應補 callback/action 的更細歷史與 source provider log drill-down。 +- Sentry / SigNoz source correlation:約 99.0%;e2e-health 已通過,仍需逐筆 Incident source-link 持續收斂。 +- KM governance:約 82.5%;stale KM 仍需 Hermes 產草稿、owner 審核後寫入。 +- Ansible / PlayBook 自動執行:約 0% runtime-ready;`ansible_playbook_binary_missing` gate 未解除前不可宣稱自動執行完成。 +- 24h 完整自動修復 production claim:0%;本輪修的是 MCP 證據 / adapter,還不是 24h 全自動修復閉環證據。 +- 完整 AI 自動化管理產品化:約 99.5%;可視化與 MCP 技術債已再收斂一段,下一段主線應轉向 Ansible runtime gate 與 Telegram callback/action 歷史閉環。