前言¶
在 DSH 里做网页抓取、表单操作或文档预览时,往往要接一层浏览器。内置的 dsh-builtin-browser 走自托管 Electron:没有二进制、没有 GUI 库,或在 seccomp 容器里常见 No usable sandbox!。Playwright 类方案又容易每个消费方各起一个进程,CDP 端口若对外监听还会把 cookie 暴露给本机任意进程。
下面介绍社区插件 dsh-browser-service(维护者 lyp88997),用一条 dsh plugin add 把单例 CDP 守护、ctx.browser 的 cdp-daemon provider、完整 browser_* 工具面,以及网页浮动窗口装进 web profile,面向无 root、无 GUI 的服务器与容器环境。
这是什么¶
dsh-browser-service 是 DeepSeek Harness 的联网工具类插件,npm 包名与插件 id 均为 dsh-browser-service。一个 tarball 交付:
- 用户态 chrome-headless-shell 单例 CDP 守护(内核只绑
127.0.0.1,对外经要求 Bearer token 的本机回环代理暴露/devtools); - 经本包 shim 转出的 33 个
browser_*工具(工具面来自依赖dsh-builtin-browser,由组合 patch 挂到tool-browser); cdp-daemonbrowser provider,首次用浏览器时默认用包内bin/browsersvc.mjs start拉起守护进程;- 网页面板:左上角可拖动的胶囊入口,内嵌可点、可滚、可打字的实时画面,以及操作 / 控制台 / 网络 / 设置;
- 两份随包全局技能
browser、browser-runtime(技能中心显示为「系统内置」)。
另提供与 dsh-univer-office 兼容的包装脚本思路:Univer 只认「浏览器可执行文件路径」,可把同一份二进制外的 wrapper 配成 browserExecutablePath(不共享 CDP 守护进程,分析见仓库 docs/design-notes.md)。
许可证 MIT;运行环境要求 Node >= 22.19(见 package.json engines)。
核心功能¶
单例 CDP 与多会话隔离¶
多个客户端通过 CDP 连入同一个守护进程,会话用隔离的 BrowserContext 分开,避免每个插件或技能各起一份 Chromium 占内存。
安全边界¶
CDP 不直接对外监听。对内随机端口 + 回环代理,读元数据与 /devtools 需 Authorization: Bearer <token>(v0.3.0 起)。代理侧可统计连接数。
与内置方案的取舍¶
组合 patch(plugin/cordis.patch.yml)会:选 cdp-daemon、插入 tool-browser 与 browser-cdp provider,并关掉内置 browser-electron 与 dsh-playwright-browser(后者 10 个与内置同名的 browser_* 工具不能与双 provider 共存)。
守护进程生命周期¶
browsersvc 默认空闲约 15 分钟可退出(--idle-ms,上限 24 小时);插件自启默认 idleMs 为 5 分钟。最后一个会话关闭后插件会主动断开 CDP,守护进程才可能真正空闲;下次调用浏览器会自动再拉起。
端点不通时不必手写 autoStartCommand:插件默认执行本包 bin/browsersvc.mjs start。要固定端口或内核时,再在 profile 的 cordis.patch.yml 里整行覆盖 browser-cdp 的 config(须重述 cdpUrl)。
安装与启用¶
推荐一条命令(可重复执行):
dsh plugin --profile web add dsh-browser-service@latest
钉版本或离线分发时,README 示例为 Release 资产或本地 tgz,例如:
dsh plugin --profile web add https://github.com/lyp88997/dsh-browser-service/releases/download/v0.8.2/dsh-browser-service-0.8.2.tgz
装完后必须重启 DSH(插件在 boot 时 import,热重载不可靠)。校验组合是否生效:
dsh --profile web --dump-config | grep -E 'browserProvider|# == dsh-browser-service|not found'
期望看到 browserProvider: cdp-daemon 与 # == dsh-browser-service 层;仅装本包时 browser-electron / playwright-browser 守卫行打印 not found 属正常。
安装时注意的三条¶
- 不要再单独装
dsh-builtin-browser:与本包组合会导致browser/tool-browser重复、33 个工具挂两遍。若已装,先dsh plugin --profile <name> remove dsh-builtin-browser。 - 不要用旧裸包名
dsh-browser-cdp:npm 上同名包属他人项目;本仓库自 2026-09-27 起以dsh-browser-service发布。 - 不要与手写
cordis.patch.ymlinsert 同时叠 bundle patch,以免重复插入(改源码临时用法见仓库docs/profile-patch.browser-service.yml)。
升级:dsh plugin --profile web add dsh-browser-service@latest(@latest 在已满足依赖范围时可能不会升版,要换版本请用 Release URL 或本地 tgz)。插件与 browsersvc 须同版本升级;顺序建议先换插件并重启 DSH,再 browsersvc restart。
卸载:
dsh plugin --profile web remove dsh-browser-service
可选停止守护进程(路径随 profile 安装位置而定,README 给出通过 dump-config 定位 node_modules/dsh-browser-service 再 stop 的写法)。
典型用法¶
依赖插件自动起守护进程¶
装上并重启后,首次调用浏览器相关工具或 ctx.browser 时,插件会用默认 autoStartCommand 拉起守护进程,多数场景无需手工步骤。
手动起守护进程与验证¶
需要固定端口、指定 wrapper 或排查环境时,进入插件目录(profile 下的 node_modules/dsh-browser-service):
node bin/browsersvc.mjs detect
node bin/browsersvc.mjs start --port=9333 --idle-ms=900000
node bin/browsersvc.mjs status
验证 CDP 元数据(token 来自 $DSH_HOME/browser-service/service.json):
TOKEN=$(node -p 'JSON.parse(require("fs").readFileSync(process.env.DSH_HOME+"/browser-service/service.json","utf8")).token')
curl -s -H "Authorization: Bearer $TOKEN" 127.0.0.1:9333/json/version
停止:
node bin/browsersvc.mjs stop
DSH 容器内 README 实测示例会使用 --wrapper 指向注入 LD_LIBRARY_PATH、FONTCONFIG_FILE 以及 --no-sandbox --disable-dev-shm-usage 的脚本;无 wrapper 时用 --kernel 指定 chrome-headless-shell,须保证系统库与字体可用,否则易出现截图纯白或中文方块。
给 dsh-univer-office 配可执行路径¶
Univer 不接远端 CDP,保持「可执行文件路径」即可,例如:
- id: univer
config:
browserExecutablePath: /home/node/DSH/.browser/chromium-wrapper.sh
与守护进程共用同一份二进制与库,由 Univer 自起临时实例。
网页面板¶
重启 DSH 后,页面左上角出现可配置位置与外观的胶囊;点开即浏览器窗口(网页 / 操作 / 控制台 / 网络 / 设置),中间为实时交互画面。分辨率、留白、网络日志清理上限等可在设置区调整。
适用场景与注意¶
适合谁:在 web profile 里跑 DSH、部署在无 GUI、无 root 或 seccomp 限制的容器/服务器上,又需要稳定 browser_* 工具链或可视化调试网页自动化的开发者。
权限与安全:插件与当前 DSH 进程同权限运行;安装前应阅读 GitHub 仓库 源码与 MIT 许可证,自行评估是否引入依赖 dsh-builtin-browser 等 transitive 包。
环境:需 Node >= 22.19;需本机或用户态目录内可用的 chrome-headless-shell(或 README 所述 wrapper 所指向的二进制与库)。
生态说明:DSH 主张「一切皆插件」;SkillHub 目录页 是社区收录站点,与 DeepSeek / 幻方无官方从属关系。仓库 GitHub 星标以页面为准(撰写时线索为 0)。
结尾¶
dsh-browser-service 把「单例 CDP + token 门 + 33 工具 + 网页实时窗」收成一包,专门对齐 DSH 在无 Electron、无 root 环境下的浏览器接缝。安装命令以 README 为准:dsh plugin --profile web add dsh-browser-service@latest,重启后核对 browserProvider: cdp-daemon 即可开用。
- 目录页:https://www.skillhub.cn/plugins/lyp88997/dsh-browser-service
- 源码与文档:https://github.com/lyp88997/dsh-browser-service