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
羽毛球分组比赛记分
小程序二维码

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

小夜