dsh-browser-service:无 root 容器里的 DSH 浏览器后端

前言

在 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-daemon browser 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 属正常。

安装时注意的三条

  1. 不要再单独装 dsh-builtin-browser:与本包组合会导致 browser / tool-browser 重复、33 个工具挂两遍。若已装,先 dsh plugin --profile <name> remove dsh-builtin-browser。
  2. 不要用旧裸包名 dsh-browser-cdp:npm 上同名包属他人项目;本仓库自 2026-09-27 起以 dsh-browser-service 发布。
  3. 不要与手写 cordis.patch.yml insert 同时叠 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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye