dsh-lan-proxy:把 dsh Web UI 暴露到局域網的反代插件

前言

DSH 的 Web UI 默認只監聽迴環地址,也就是隻有本機能訪問。想在局域網裏的另一臺電腦、平板上打開它,通常得自己搭一層反向代理:單獨起進程、改配置文件、處理 token 鏈接和 WebSocket 轉發,dsh 一重啓還得跟着折騰。

dsh-lan-proxy 把這件事做成了插件:開關、狀態和啓動日誌直接嵌在 dsh 設置頁裏,隨 dsh 啓停,不需要單獨維護一個進程。下面介紹它的功能、安裝和用法。

這是什麼

dsh-lan-proxy 是由 liveqte 維護的 DSH 插件,採用 MIT 許可證。它的核心工作是把只監聽 127.0.0.1 的 dsh Web UI 通過 0.0.0.0 反代暴露到局域網,同時把局域網訪問會遇到的一系列適配問題(鑑權、協議、目錄選擇)一併處理掉。

DSH 的理念是「一切皆插件」,這個插件也遵循這個思路:不改變 dsh 本身的監聽行爲,而是以反代的方式在外層解決。

核心功能

  • 局域網反代:將 dsh Web UI 同時監聽 0.0.0.0:<port>,局域網內任何設備經 http://<局域網IP>:<port>/ 訪問。
  • 免配置開關:設置頁「局域網反代」tab 一鍵開關,即時熱啓停,無需重啓 dsh。
  • 端口配置:tab 內直接修改監聽端口與上游端口,保存即生效。
  • 協議適配:自動改寫 Host/Origin 爲迴環、橋接 WebSocket(RFC6455 幀編解碼)、注入 crypto.randomUUID polyfill(局域網 HTTP 屬於非安全上下文,缺少這個 API)。
  • 瀏覽器鑑權適配:自動完成 dsh web 的 token↔cookie 交換,局域網首次訪問無感,不需要手動打開帶 token 的鏈接。
  • 網頁端目錄選擇:禁用原生 OS 文件夾對話框,固定爲網頁內嵌「選擇工作區目錄」瀏覽,這樣在遠程機器上也能選宿主目錄。
  • 狀態與日誌:2 秒輪詢的運行狀態、上游可達性探測、局域網地址列表與啓動日誌,內置「重啓反代」按鈕。

安裝與啓用

安裝命令如下:

dsh plugin --profile web add "github:liveqte/dsh-lan-proxy#main"

bundle 層棧在啓動時組合,所以裝完需要重啓 dsh web 才生效。驗證兩點:設置頁導航出現「局域網反代」一級菜單;啓動日誌中沒有 plugin tree failed to load

運行環境要求 Node >= 20。

典型用法

1、開關局域網訪問

進入設置頁的「局域網反代」tab,切換「監聽局域網訪問」。頁面開關的即時狀態會寫入運行時文件 $DSH_HOME/profiles/web/lan-proxy.runtime.json(優先級高於配置默認值),立即生效。

2、從局域網訪問

在局域網內其他設備打開:

http://<局域網IP>:<監聽端口>/

默認監聽端口是 3080

3、調整端口

tab 內可直接修改兩類端口:

  • 監聽端口:綁定所有網卡;
  • 上游端口:指向 127.0.0.1,設爲 0 表示自動取 dsh 實際監聽端口。

4、選擇工作區

裝上插件後,側邊欄 / 會話區的「添加工作區」改爲網頁內嵌目錄瀏覽器(宿主文件系統列舉 + 新建文件夾),不再彈出 OS 對話框。這樣局域網 / 遠程瀏覽器也能選目錄;本機 127.0.0.1 訪問同樣走內嵌對話框。

配置項

配置項及默認值如下:

默認值 說明
enabled false 監聽局域網訪問(配置默認值;頁面開關優先級更高並持久化到運行時文件)
port 3080 反代監聽端口(所有網卡)
upstreamPort 0 上游端口,0 = 自動取 dsh 實際監聽端口
maxLogLines 500 頁面日誌緩衝行數
bypassRules 見下 前端 JS 改寫規則表

配置覆蓋寫在 profile 層的 cordis.patch.ymlid: lan-proxy 行的 config),不需要修改倉庫內文件。

設置頁封鎖的繞過

dsh 0.1.x 的瀏覽器端只爲迴環地址加載設置面(connection.isLoopback)。從局域網訪問「設置 → 模型」會得到:加載提供方目錄失敗: settings are unavailable in this browser

dsh-lan-proxy 的處理方式:反代在轉發 /plugins/<id>/client.js 字節流時,按規則表改寫其 JS,把封鎖判定固定爲迴環;服務端 /api 的柵欄按 Host 頭判定,而反代已把 Host 改回 127.0.0.1,服務端天然放行。這是改動瀏覽器實際執行字節的補丁,與插件加載順序無關。

內置規則(dsh 0.1.x)只有一條:dsh-client-connection:isLoopback-mirror,把 dsh-client-connection client 裏的 isLoopback: pageLocation… 改爲 isLoopback: true,使設置/模型/憑據面正常讀寫。官方換一種封鎖方式時,在配置里加一條 find/replace 規則即可(或覆蓋 bypassRules 表);舊規則 find 不中會自動跳過並在日誌面板提示。規則狀態(命中次數/最後錯誤)出現在「局域網反代」設置頁的運行狀態裏。

適用場景與注意

適合這些場景:在局域網內其他設備(另一臺電腦、平板)上使用 dsh Web UI;不想爲反代單獨維護一個進程;需要在遠程瀏覽器上選擇宿主機的工作區目錄。

使用前注意幾點:

  1. 開關與端口修改接口僅限本機迴環地址調用;局域網訪問只能讀狀態與日誌。即便如此,把服務暴露到局域網意味着同一網絡內的設備可以訪問你的 dsh Web UI,請在可信網絡環境中使用。
  2. 插件以當前 dsh 進程權限運行,安裝前建議檢查其源碼與許可證。本項目採用 MIT 許可證。
  3. 插件針對 dsh 0.1.x 的封鎖方式做了內置繞過規則,官方行爲變化後需要通過 bypassRules 自行補充規則。

結尾

dsh-lan-proxy 解決的是一個很具體的問題:讓 dsh Web UI 在局域網內可訪問,同時把鑑權、協議、目錄選擇這些邊角適配一次做完,並且不引入額外進程。如果你有遠程使用 dsh 的需求,可以直接試。

  • 社區目錄頁:https://www.skillhub.cn/plugins/liveqte/dsh-lan-proxy
  • GitHub 倉庫:https://github.com/liveqte/dsh-lan-proxy
羽毛球分组比赛记分
小程序二维码

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

小夜