dsh-web-gate:爲桌面端 DSH 提供帶密碼的局域網網關

前言

DeepSeek Harness(DSH)桌面版內置 Web 能力,但 dsh --profile web 默認只監聽 loopback,手機或平板很難在同一 WiFi 下用瀏覽器連上本機實例。官方通過 --public-url 與 --trusted-host 做反代,對 Electron 拉起的 Host 並不適用:無法追加啓動參數、端口每次動態分配、根路徑還需要進程內存裏的 ?token= 才能換會話 Cookie。

dsh-web-gate(npm 包名 @realoiyo/dsh-web-gate)由 REALOIYO 維護,作爲 DSH 客戶端類插件,在 Host 進程內實現局域網網關:不改 DSH 頁面,同網段設備瀏覽器輸入密碼即可訪問本機 DSH。下文介紹其定位、安裝步驟與使用時的安全邊界。

這是什麼

一句話:在桌面 DSH 外掛一層 HTTP 網關,用密碼保護,讓局域網內的瀏覽器訪問本機 Harness。

插件在網關進程內讀取 ctx.webServer.port 與 ctx.connection.authenticatedUrl(),完成 token 握手與請求轉發;對經局域網 IP 訪問的頁面注入少量 polyfill,以彌補非安全上下文下 crypto.randomUUID 等 API 缺失、以及非迴環 hostname 導致設置無法持久化的問題。許可證爲 MIT,當前 npm 版本爲 0.2.1,依賴 Node >=22。

背景:爲何不直接反代

README 歸納了桌面版與 CLI Web profile 的差異:

  1. Host 由 Electron 啓動,不能像在命令行裏那樣追加 --public-url。
  2. Web 端口每次啓動變化,無法預先寫死反代 upstream。
  3. 首次訪問依賴僅存在於內存中的 launch token,外部反代難以自行完成 Cookie 會話建立。

因此網關實現在插件側,在 Host 生命週期內與 DSH Web Server 協同。

核心功能

密碼與會話

  • 監聽可配置地址與端口(默認 0.0.0.0:3082),訪問需輸入網關密碼(默認隨機 10 位,最少 8 位)。
  • 會話 Cookie 名爲 dsh_gate_session,由 HMAC(secret, password) 派生;修改密碼等同於註銷全部已登錄設備。
  • 登錄失敗限速:單 IP 每分鐘 5 次失敗鎖定 60 秒;全局每分鐘 50 次失敗鎖定 30 秒。

網關先用內部 launch token 請求 / 取得 DSH 會話 Cookie,再轉發外部請求,客戶端不看到 303 跳轉。

DSH 認證 Cookie 名含 host:port 的 sha256,桌面版端口變化且舊 Cookie 不清理,條目累積過多時請求頭可觸發 Node 約 16 KB 上限(HTTP 431,界面表現爲 Web authentication failed)。網關攔截上游全部 Set-Cookie,內存中只保留當前一條,客戶端側主要維護網關會話 Cookie。

polyfill 注入

經 http://<局域網 IP> 訪問時,瀏覽器可能缺少 crypto.randomUUID 或 AbortSignal.any,表現爲可讀不可寫;非迴環 hostname 還會讓 DSH 把設置存到 memory 而非 host。插件僅在 API 缺失時注入,不覆蓋原生實現;對 HTML 文檔移除 accept-encoding 以便插入腳本,JS/CSS 仍保持壓縮。

設置界面

安裝並在 DSH 中啓用後,監聽地址與密碼會寫入日誌,並出現在 設置 → 手機網關(可複製、可改密)。

安裝與啓用

DSH 插件以當前 dsh 進程權限運行,安裝前建議在 GitHub 倉庫 查看源碼與 MIT 許可證。

從 npm 安裝:

dsh plugin --profile desktop add @realoiyo/dsh-web-gate

從 GitHub 安裝(會走源碼構建):

dsh plugin --profile desktop add github:REALOIYO/dsh-web-gate

安裝後重啓 DSH。配置文件位於 $DSH_HOME/dsh-web-gate/settings.json,修改後需重啓生效。配置優先級爲:profile patch 中的 config > settings.json > 隨機生成。

鍵 默認值 說明
port 3082 監聽端口
host "0.0.0.0" 監聽地址
password 隨機 10 位 訪問密碼,最少 8 位
secret 隨機 32 字節 會話簽名密鑰,修改將使全部會話失效

典型用法

  1. 在桌面端按上文命令安裝插件並重啓 DSH。
  2. 在 設置 → 手機網關 查看本機局域網訪問地址與密碼(或查啓動日誌)。
  3. 確保手機/平板與電腦處於同一網段。
  4. 瀏覽器打開 http://<主機局域網 IP>:3082(端口以 settings.json 中 port 爲準),輸入網關密碼後使用 DSH Web 界面。

網關不提供公網隧道與專門移動端適配;可選安裝 qrcode-terminal 時在終端輸出二維碼(README 說明默認不生成二維碼)。

安全與限制

  • 密碼爲唯一憑證;網關可在主機上代表 DSH 執行代碼,不應把密碼傳到不可信環境。
  • 流量爲明文 HTTP,同網段內可被嗅探,僅適合可信局域網;跨網段應疊加 WireGuard、Tailscale 等隧道,不要直接暴露公網。
  • password 以明文存於 settings.json(權限 0600),同機其他管理員賬戶可讀。
  • 不提供官方公網穿透;WebSocket 僅在握手階段校驗一次;Host / Origin / Referer / Sec-Fetch-Site 會改寫爲 loopback,若部署依賴真實 Host 需自行調整。

社區插件目錄 SkillHub 上的 dsh-web-gate 頁 與 GitHub 倉庫 可查閱更新與 Issue;目錄爲社區站點,與 DeepSeek / 幻方無官方從屬關係。DSH 生態奉行「一切皆插件」,本插件適合需要在同一 WiFi 下用手機瀏覽器臨時操作本機 Harness、又不願改 DSH 本體界面的開發者。

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

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

小夜