前言¶
DSH 自身只監聽 loopback,也不接受通配的 --host,所以 Web GUI 默認只有本機能訪問。想在局域網裏用手機或平板打開面板,要麼手動加 --trusted-host,要麼起一個會改寫 Host 的 HTTP 代理。前者容易漏配,後者多一層維護。
下面介紹的 miiy/dsh-access-gateway 就是爲這個場景做的:它在本機起一個帶密碼的監聽端口,登錄通過後把瀏覽器轉發到 loopback 上的 GUI,並自動帶上當前進程的 launch token。
這是什麼¶
dsh-access-gateway 由 miiy 維護,走社區目錄 skillhub.cn 分發,倉庫地址 https://github.com/miiy/dsh-access-gateway,許可證 MIT,當前版本 0.1.0。它解決的問題只有一個:讓局域網內其他設備能訪問 DSH Web GUI,同時不需要手工傳遞 token。
DSH 的生態理念是「一切皆插件」,這個插件屬於客戶端 bundle,同時向宿主進程註冊運行時行爲。目錄站是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係。
核心功能¶
- 密碼門監聽:默認監聽端口
3081,未帶 gateway cookie 的請求先收到一個密碼頁,通過後返回302到/?token=<launch token>,並向瀏覽器寫入 cookie。 - 令牌不由終端設備處理:轉發時用的是當前 DSH 進程的 launch token,手機、平板不需要知道這個 token。
- 字節管道轉發:每個連接只讀第一次請求的請求頭,驗證通過後後續流量直接按字節搬運,因此 HTTP keep-alive 和 WebSocket 升級都能正常工作,網關不需要理解這兩種協議。
- 運行時註冊可信來源:插件啓動時把自己監聽的地址登記進 Host 的 accepted-authority 列表,
/api和 WebSocket 因此接受瀏覽器發來的Host頭,宿主不需要額外啓動參數。改成0.0.0.0時所有接口地址都會被登記。 - 登錄頁跟隨 GUI 主題:登錄頁內聯了 Web GUI 主題的 token,跟隨系統深淺色,文案按
Accept-Language輸出中文或英文。 - 密碼以哈希存儲:Host 只存 scrypt 哈希,不存明文;密碼錯誤時回答前固定等待 600 ms。
安裝與啓用¶
安裝有兩條路,差別在於是否同時啓用。
第一種,讓 agent 調用宿主的 installBundle,一步完成安裝、寫入 dsh.profile.bundles 並熱生效:
install the plugin `github:miiy/dsh-access-gateway`
也可以在 Settings → Plugins 的安裝框裏粘貼同一段 spec。
第二種,用 CLI 安裝,這一步只裝包,不會組合進 profile:
dsh plugin --profile <profile> add github:miiy/dsh-access-gateway
之後需要到 Settings → Plugins 打開開關,纔會加入 dsh.profile.bundles;如果開關沒有實時生效,重啓一次 dsh web。本地 checkout 也可以安裝:
dsh plugin --profile <profile> add /path/to/dsh-access-gateway
這個 bundle 是純 JavaScript、沒有構建腳本,所以從 git 安裝時不需要 allowBuilds 審批。
裝好後照常啓動宿主即可,不需要額外啓動參數。
典型用法¶
裝完在 Settings → Plugins 裏啓用,然後去 Web GUI 的 Settings 頁,找到 Access 一節。這裏顯示監聽是否在線以及入口 URL,並在地址欄下面把本機各網卡地址做成按鈕,點一下就填入,不用靠記憶敲 IP。要改的四項是地址、端口、會話時長和密碼,一個表單一個保存按鈕,保存後監聽立即重開,不需要重啓 Host。
設置完從局域網另一臺設備打開入口地址(例如 http://192.168.0.10:3081),輸入密碼登錄一次,後續默認保留 30 天。端口默認是 3081,需要和 Web GUI 自己的端口區分開。
如果不設密碼,入口就不出現登錄頁:任何能連上該地址的請求都直接進入 GUI。在完全信任的網絡上這樣最方便,在不可信網絡上這樣不正確。
想徹底跳過網關驗證的,可以用 --trusted-host 手工指定來源,插件發現宿主沒有可擴展的 accepted-authority 列表時會把結果記進日誌:
dsh --profile web --trusted-host 192.168.0.10
配置項¶
Settings 頁保存的配置寫在 ~/.dsh/dsh-access-gateway/settings.json,優先級高於下面這些默認值:
| 鍵 | 默認值 | 含義 |
|---|---|---|
bind |
'' |
監聽地址。空值用機器報出的第一個非 loopback IPv4;0.0.0.0 監聽所有接口;填具體地址則只綁那一個,比如某個 VPN 地址。 |
port |
3081 |
監聽端口。不要和 GUI 的端口重複。 |
password |
'' |
網關密碼,至少 4 個字符。留空則入口無驗證,能連上地址的人都能進。 |
sessionDays |
30 |
一次登錄有效的天數。 |
上游地址從 webServer 服務讀取,所以這套配置裏不會出現 GUI 的端口。
安全與限制¶
需要清楚的地方:
- 監聽是明文 HTTP,應只用於可信網絡或 VPN;要對外暴露就自己在前置加 TLS。
- 密碼是可信網絡與 GUI 之間唯一的屏障,未設密碼時 Host 會打警告日誌,Settings 裏也會把入口標爲 open。
- 網關跑在 Host 進程內,因此可以讀到 launch token;它不持有其他憑據,密碼只存哈希。
- gateway cookie 的簽名密鑰放在
~/.dsh/dsh-access-gateway/secret.json(權限 0600),所以宿主重啓後已登錄狀態仍然有效。 - 每個 profile 只支持一個地址,需要兩個接口同時響應就得建兩行,分別給不同的
bind和port。 - 沒有 TLS、沒有隧道、沒有二維碼,它是給已信任的網絡用的入口,不是把 GUI 發佈到公網的工具。
適用場景與注意¶
適合:DSH 跑在家裏或辦公室局域網裏,想在手機、平板或第二臺電腦上打開 Web GUI 做查看、配置的人;不想手工維護 --trusted-host,也不想爲遠程訪問單獨起代理的人。
安裝前建議:這個插件以當前 DSH 進程的權限運行,能讀到進程內的 launch token。裝之前先在倉庫裏看一遍源碼,許可證是 MIT,確認沒有超出預期的行爲再啓用;從第三方來源拿到的安裝 spec 同理。倉庫當前星標爲 0,使用者不多,遇到問題建議直接在 GitHub Issues 反饋。
結尾¶
這個插件做得很收斂:不碰協議語義,只做一次密碼校驗加一次字節轉發,順帶解決了 Host 頭的可用性問題。如果你只需要局域網入口,它比手工配置 --trusted-host 少一步,比完整 HTTP 代理少一層維護。
- 目錄頁:https://www.skillhub.cn/plugins/miiy/dsh-access-gateway
- 倉庫:https://github.com/miiy/dsh-access-gateway