dsh-home-monitor:用一份 config.json 做自託管只讀健康檢查

前言

在 DSH 裏讓智能體幫你看服務是否在線,常見做法是臨時 curl 或寫一次性腳本:每次對話都要重新描述目標,結果格式也不統一。若你維護的是小規模自託管環境,更穩妥的做法是把「要盯什麼」寫進固定清單,由工具按同一套規則做 HTTP、TCP、SSL 與 Docker 探測,且只讀、不重啓、不修復。社區插件 lowspecai/dsh-home-monitor(維護者 lowspecai,分類:聯網工具)就是按這個思路實現的:同一套檢查既可註冊爲 DSH 工具,也可單獨作爲 MCP stdio 服務運行。

這是什麼

home-monitor 面向 dsh 0.2.0-rc.2 及以上(package.json 中 engines.dsh 爲 >=0.2.0-rc.2),許可證 MIT,當前版本 0.1.0。它只做只讀健康檢查:打開連接、讀取、關閉,不寫配置、不重啓進程、不執行修復命令。

兩種打包方式共用 server/config.json:

  1. DSH 插件:向智能體註冊五個工具——monitor_http、monitor_tcp、monitor_ssl、monitor_docker、monitor_targets。
  2. 獨立 MCP stdio 服務:同一套邏輯,工具名爲 check_http、check_tcp、check_ssl、check_docker、monitor_status,任意 MCP 客戶端均可調用。

插件層 lib/index.js 直接引用 server/monitors/ 下的模塊;MCP 子包 server/ 單獨依賴 @modelcontextprotocol/sdk,MCP 鏈路異常時不會拖垮 DSH 側五個工具。

核心功能

HTTP

對 config.json 裏 http.targets[] 中的 { name, url, expect?, headers? } 發起請求,返回狀態碼、延遲與 body 大小。expect 可爲單個狀態碼或數組;例如 [200, 302, 401] 表示任一碼即視爲健康——受保護端點返回 401 仍可能是「服務在線且鑑權生效」,而非故障。

TCP

對 tcp.targets[] 中的 { name, host, port } 做連接探測,默認連接超時 8000 ms(HTTP)/ 5000 ms(TCP),可在對應節調整 timeoutMs。

SSL

對 ssl.targets[] 檢查證書過期時間、剩餘天數、簽發者與鏈信任;全局 ssl.warnDays 默認 21 天。單目標可設 warnDays、servername、allowSelfSigned 等。

Docker

默認 關閉(docker.enabled: false 時工具返回 status: "unavailable")。開啓後通過 docker.socket(默認 /var/run/docker.sock)做 engine ping,並按 docker.expectRunning[] 校驗容器是否處於 running。掛載 Docker 套接字等於高權限,需顯式 opt-in。

調用約定

targets[].name 即工具參數 { "target": "name" };省略 target 則檢查該協議下的全部目標。批量結果統一爲 JSON:ok、checked、failed(失敗名稱列表)、results[](含 name、ok、ms 及協議細節);未知 target 返回 ok: false 與 known 列表。失敗以字段表達,不拋異常。

安裝與啓用

以下步驟假設容器內源碼路徑爲 /workspace/home-monitor(宿主機常見爲掛載的 ./workspace)。官方 README 亦提供 git clone 獲取源碼;若你已有目錄,可用 docker cp 拷入容器。

1. 安裝 MCP 子包依賴

在 DSH 容器內執行:

docker exec dsh sh -c 'cd /workspace/home-monitor/server && npm i'

容器內 npm i 需能訪問 registry;鏡像默認常用 npmmirror,可用 npm config get registry 確認。

2. 解析 @deepseek-ai/dsh-tools

lib/index.js 通過 bare name 引用 @deepseek-ai/dsh-tools,peer 爲 optional,npm i 不會自動安裝。在 stock 鏡像中需手動鏈到 DSH 自帶副本:

docker exec dsh sh -c 'mkdir -p /workspace/home-monitor/node_modules/@deepseek-ai && ln -sfn /usr/local/lib/node_modules/@deepseek-ai/dsh/node_modules/@deepseek-ai/dsh-tools /workspace/home-monitor/node_modules/@deepseek-ai/dsh-tools'

@deepseek-ai/dsh-mcp-client 由 dsh 包自帶,patch 行加載時從 DSH 的 node_modules 解析,一般無需額外鏈接。

3. 接入 profile(任選一種)

方式 A:安裝到 profile 並在 patch 中引用包名:

docker exec dsh sh -c 'cd /data/profiles/web && corepack enable pnpm && pnpm add /workspace/home-monitor'

在 /data/profiles/web/cordis.patch.yml 增加:

- insert:
    - id: home-monitor
      name: home-monitor

方式 C:不裝 pnpm,直接指向插件入口:

- insert:
    - id: home-monitor
      name: '/workspace/home-monitor/lib/index.js'

編輯 cordis.patch.yml 前建議備份;無效 patch 可能導致容器重啓循環。改完後可用 overlay 先驗證再重啓生產:

docker exec dsh sh -c 'cd /workspace && dsh --profile headless --patch /tmp/ol.yml --dump-config' | grep -n home-monitor

其中 /tmp/ol.yml 內容與方式 C 的 insert 相同。

4. 確認並重載

docker exec dsh dsh --profile web --dump-config | grep -n 'home-monitor\|mcp-client'
docker restart dsh && docker logs --tail 40 dsh

stock 配置下 HMR root 爲空,改 patch 後需重啓容器。合併配置末尾會列出已應用的 patch 層;成功後 harness 可出現 MCP 側工具(如文檔中的 mcp__home_monitor__check_http)。

插件還通過 package.json 的 dsh.bundle.patch 指向 cordis.patch.yml,用於把 MCP 服務行寫入 bundle patch;與 profile 行的疊加順序見 README「Patch layering」。

配置 server/config.json

整份監控清單放在 server/config.json(純 JSON,JSON.parse 解析;以下劃線 _ 開頭的鍵僅作文檔,代碼忽略)。

鍵 含義
http.timeoutMs 單次請求超時,默認 8000
http.targets[] { name, url, expect?, headers? }
tcp.timeoutMs 連接超時,默認 5000
tcp.targets[] { name, host, port }
ssl.timeoutMs 握手超時,默認 10000
ssl.warnDays 過期預警天數,默認 21
ssl.targets[] { name, host, port?, warnDays?, servername?, allowSelfSigned? }
docker.enabled 默認 false
docker.socket 默認 /var/run/docker.sock
docker.expectRunning[] 必須爲 running 的容器名

修改 config.json 後需重啓相關進程;工具發現列表在啓動時快照。

典型用法

在 DSH 對話中

配置好 target 名稱後,讓智能體調用 monitor_http 等工具,傳入 { "target": "dsh" } 或省略以掃描整組。README 截圖說明:對需鑑權的 / 返回 401 可判定爲探測成功(鑑權門仍在響應)。

獨立 MCP 服務

cd server && npm i
node index.js

在 MCP 客戶端中註冊(路徑按實際安裝調整):

{
  "mcpServers": {
    "home_monitor": {
      "command": "node",
      "args": ["/workspace/home-monitor/server/index.js"],
      "env": { "PATH": "/usr/local/bin:/usr/bin:/bin" }
    }
  }
}

經 @deepseek-ai/dsh-mcp-client 接入時,未顯式傳入的 env 會被清理,需保留 PATH 以便找到 node。serverName 須匹配 [A-Za-z0-9_-]{1,32}。

無客戶端時可管道 smoke test:

printf '%s\n' \
  '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"0"}}}' \
  '{"jsonrpc":"2.0","method":"notifications/initialized"}' \
  '{"jsonrpc":"2.0","id":2,"method":"tools/list"}' \
  | node index.js

適用場景與注意

適合:家庭實驗室、少量自託管服務(Web、端口、證書、可選 Docker)需要統一清單、只讀探測,並希望在 DSH 對話或 MCP 客戶端裏複用同一配置。

不適合:需要自動修復、告警推送、歷史存儲或出站地址白名單的場景——本插件故意不做寫入與過濾,且將 config.json 視爲受信輸入;勿把 MCP 服務或 Docker 套接字暴露給不可信網絡。

權限與安全:插件與 MCP 進程以當前 DSH 容器權限運行;安裝前請閱讀 GitHub 源碼 與 MIT 許可證。SSL 檢查使用 rejectUnauthorized: false 以便報告鏈信任結果,是否算失敗由 authorized 與 allowSelfSigned 決定。無出站地址過濾,可探測內網私有地址。

其他限制:MCP 子進程異常退出需手動重啓;DSH 內工具調用另有約 20 秒硬超時;容器內無 ps,排查 MCP 子進程可參考 README 中的 /proc 與 docker top 說明。

結尾

dsh-home-monitor 把自託管監控清單收斂到單一 server/config.json,以只讀探測方式接入 DSH 五個工具或獨立 MCP,適合「先列清單、再讓智能體查狀態」的工作流。目錄頁:https://www.skillhub.cn/plugins/lowspecai/dsh-home-monitor;源碼與完整接線說明:https://github.com/lowspecai/dsh-home-monitor。DSH 社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係;生態上 DSH 仍遵循「一切皆插件」的擴展方式。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜