使用 dsh-web-lan-access 讓 DeepSeek Harness Web UI 支持局域網訪問

前言

DeepSeek Harness(dsh)默認把 Web UI 開在 http://127.0.0.1:3080。本機瀏覽器裏一切正常:會話列表能出來,模型也能選。一旦換成手機、平板,或者同一網段裏另一臺電腦去打開 http://192.168.x.x:3080,常見現象是頁面殼能加載,側邊欄卻是空的,控制檯裏出現 TypeError: crypto.randomUUID is not a function

這件事不是「端口沒通」。官方倉庫討論區 #2396 已經把鏈路拆開了:服務端在綁定 0.0.0.0 之後,會把本機局域網 IPv4 加進 /api 信任圍欄,用 curlsession.list 也能返回數據;真正卡住的是瀏覽器前端。Web UI 在 RPC id、消息 id、草稿附件這幾條啓動路徑上直接調用了 crypto.randomUUID(),而這個 Web API 只存在於安全上下文(HTTPS,或者 http://localhost / http://127.0.0.1)。局域網純 HTTP 地址不算安全上下文,API 是 undefined,後續 RPC 全部拋錯,會話和模型自然渲染不出來。

新版 harness 還在命令行上硬性拒絕 --host 0.0.0.0,本意是避免把無鑑權的 agent 接口暴露到整張網。配置層的 webserver 仍然接受這個值,所以「綁到全接口」這條路並沒有被堵死,只是前端缺了一塊補丁。社區插件 dsh-web-lan-access 做的就是這件事:不改產品源碼,把局域網訪問補完整。

插件定位

dsh-web-lan-access 是一款界面增強插件,由 AcidGr 維護,MIT 許可證,主要語言是 JavaScript。npm 當前版本爲 1.1.0(2026-08-16 發佈)。GitHub 倉庫爲 AcidGr/dsh-web-lan-access,截至 2026-08-18,倉庫有 18 個 star。社區目錄把它歸在「界面增強」,收錄日期是 2026-08-14。

它解決的問題可以壓成一句話:讓 DeepSeek Harness 的網頁界面在局域網 IP、Tailscale IP 或普通主機名這類非迴環、純 HTTP 來源下,也能把會話和模型正常畫出來。

DeepSeek Harness 本身是 DeepSeek AI 的開源智能體運行時,架構口號是「一切皆插件」。本文介紹的目錄站點 DeepSeek Harness 插件庫 是獨立的社區目錄,與 DeepSeek / 幻方沒有從屬或背書關係,不託管插件代碼。安裝前請直接看維護者倉庫。

它具體做了兩件事

倉庫 README 和 package.json 把能力寫得很明確,插件是自包含的,包含兩層:

1、注入 crypto.randomUUID polyfill。宿主端插件掛在 webserver 的官方擴展點 webServer.tapIndex 上,每次下發 index.html 時,在 <head> 最前面插入一小段腳本,位置在啓動清單和 shell 入口之前。polyfill 按 RFC 4122 v4 用 crypto.getRandomValues 生成 UUID——這個 API 在非安全上下文裏仍然可用。如果當前頁面已經有 crypto.randomUUID(HTTPS 或 localhost),這段腳本直接 return,等於空操作。卸載插件後 tap 會隨行一起拆除,頁面恢復原樣。

2、把 webserver 綁定到 0.0.0.0。bundle 自帶的 cordis.patch.yml 直接改 webserver 配置裏的 host,端口仍走 CLI 的 --port(默認 3080)。這樣不需要改 harness 源碼,也不需要被拒絕的 --host 參數。綁定全接口後,harness 會通過 resolveLanTrust 把本機所有非內部 IPv4 自動加入 /api 信任圍欄,局域網用 IP 訪問通常不用再配 trustedHosts

README 還強調三點實現約束:不修改產品源碼、只轉換下發的 HTML 因而與 harness 版本解耦、跨 Linux / macOS / Windows / Android。

安裝

目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行即可:

dsh plugin add github:AcidGr/dsh-web-lan-access

維護者 README 更推薦寫到 web profile 上,避免裝進默認配置卻啓動了別的 profile:

dsh plugin --profile web add github:AcidGr/dsh-web-lan-access

如果環境能直接解析 npm 包名,也可以:

dsh plugin --profile web add dsh-web-lan-access

裝完後重啓 dsh web,瀏覽器做一次硬刷新(繞過緩存)。

目錄頁同時提醒:如需可復現安裝,把 commit 哈希釘死:

dsh plugin add github:AcidGr/dsh-web-lan-access#<commit>

<commit> 換成倉庫裏實際的提交哈希。插件以當前 dsh 進程的權限運行,安裝時可能執行代碼,裝之前應檢查源碼倉庫和許可證。

離線或沒有 pnpm 時,README 提供了手動拷貝到 $DSH_HOME/profiles/web/plugins 並在 cordis.patch.yml 裏插入 lan-access 行的做法。日常使用走上面的 bundle 安裝即可。

啓動與訪問

安裝之後正常啓動,不要再加 --host

dsh --profile web --port 3080

本機仍可用 http://127.0.0.1:3080。同一局域網裏的其他設備,用這臺機器的局域網 IP 加端口打開,例如 http://192.168.1.66:3080。多網卡時選真實局域網地址,不要用僅本機可達的虛擬網卡。

如果走 Tailscale、MagicDNS 或自定義域名,需要把訪問時瀏覽器實際帶上的 Host 頭寫進 trustedHosts。圍欄是逐字比對,短名和完整域名不是一回事。README 裏的示例結構如下:

- id: web-runtime
  config:
    trustedHosts:
      - myhost
      - myhost.tailXXXX.ts.net
      - 100.x.x.x

漏寫短名時,典型症狀是頁面殼能開,所有 /api 調用返回 403,會話和模型仍然是空的。這和 crypto.randomUUID 缺失長得很像,但原因是信任圍欄,不是 polyfill。

不想讓插件接管綁定地址時,README 建議去掉 patch 裏的 webserver 覆蓋,保持監聽 127.0.0.1,再用 socat、rinetd 或 Tailscale serve 做端口轉發,並把轉發入口手動加入 trustedHosts

怎麼確認已經生效

本機執行:

curl http://127.0.0.1:3080/ | grep lan-access-polyfill

有輸出說明 index 注入已經掛上。然後再用另一臺設備打開 http://<服務器IP>:3080,會話列表和模型選擇應能加載。若本機 curl 能 grep 到標記、對端瀏覽器控制檯仍報 crypto.randomUUID is not a function,先硬刷新,排除舊 HTML 緩存。

卸載:

dsh plugin --profile web remove dsh-web-lan-access

手動安裝則刪除 cordis.patch.yml 裏的 lan-access 插入塊。patch 是分層的,去掉之後 webserver 會回到默認的迴環綁定。

已知限制

未修改的 harness 構建裏,一部分敏感 API(settings.*credentials.*llm.discoverModels)被釘在僅迴環可調用,與 trustedHosts 無關。遠程來源訪問這些接口會得到 403:聊天、會話、模型列表仍然可用,但設置頁(包括插件配置卡片)和憑據界面會空白或報錯。這是產品側策略,polyfill 改不了。這類操作請回到 http://127.0.0.1:3080 上做。

適用場景與注意事項

適合已經在用 dsh Web UI、希望同一局域網裏用手機或另一臺電腦盯任務、改提示詞、看會話的人;也適合經 Tailscale 等組網訪問家裏那臺跑 harness 的機器,但要把實際 Host 寫進 trustedHosts

不適合把 dsh 直接暴露在公網 IP 上。綁定 0.0.0.0 之後,同一網絡裏任何設備都能無登錄操作這個 agent——/api 只是來源圍欄,不是賬號體系。機器如果有公網地址,等於對整個互聯網開放。請只在可信網絡使用,或用防火牆限制來源網段,例如:

ufw allow from 192.168.0.0/16

更穩妥的做法是走 Tailscale,或前面加一層帶鑑權的反向代理。若反代已經提供 HTTPS,瀏覽器處於安全上下文,crypto.randomUUID 本身就在,這個 polyfill 不再是剛需;那時要解決的是信任圍欄和鑑權,而不是 UUID。

再重複一次安裝安全:插件與當前 dsh 進程同權,安裝即可能執行代碼。社區目錄不是官方應用商店,裝之前打開 GitHub 倉庫 看 README、lib/index.js 和 MIT 許可證。

小結

dsh-web-lan-access 並不增加新的聊天能力,它補的是 Web UI 在非安全上下文裏缺的那一截:一段可逆的 randomUUID polyfill,外加把監聽地址放到 0.0.0.0。裝好之後,局域網設備才能真正用上已經跑起來的 DeepSeek Harness 界面。使用時把安全邊界看清楚:無鑑權、設置頁仍限本機、公網不要裸綁。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-web-lan-access/

GitHub:https://github.com/AcidGr/dsh-web-lan-access

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

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

小夜