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 仍遵循「一切皆插件」的扩展方式。

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

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

小夜