前言¶
在 DeepSeek Harness(DSH)的插件化使用方式中,有些場景需要從其他機器訪問本機 dsh 的 Web UI。dsh 的 Web UI 默認只監聽 127.0.0.1:3080,不直接對外提供入口。dsh-login-gateway 由 runfali 維護,用於在外部增加一個登錄入口;登錄通過後,它再把請求反向代理到本機 dsh Web UI。
這是什麼¶
dsh-login-gateway 是 DeepSeek Harness(dsh)登錄門衛插件。它默認在 0.0.0.0:3081 提供登錄入口;訪問者通過用戶名密碼登錄後,HTTP 與 WebSocket 請求會被全量反向代理到 127.0.0.1:3080 的 dsh Web UI。
已覈實資料中,項目許可證爲 MIT,package.json 聲明版本爲 0.2.0,要求 Node 22+ ESM,並聲明零運行時依賴,僅使用 Node.js 內置模塊。它不修改 dsh 安裝目錄的任何文件,也不改 dsh 自身配置邏輯;安裝/卸載隻影響 profile 目錄,需要重啓 dsh 生效。
核心功能¶
- 外部入口:默認在
0.0.0.0:3081提供登錄入口。 - 用戶名密碼登錄:登錄成功後種下
HttpOnly+SameSite=Strict會話 Cookie。 - 全量反向代理:登錄通過後代理到
127.0.0.1:3080,支持 HTTP 與 WebSocket。 - 請求頭改寫:反代時改寫
Host、Origin、Sec-Fetch-Site爲 loopback 形態,讓 dsh 信任放行。 - 一次性初始化:新裝沒有默認賬號,通過
/setup和一次性令牌創建管理員。 - 限速與節流:登錄和初始化按 IP 與用戶名雙維度限速,可鎖定失敗嘗試;另有全局認證節流。
- 會話控制:會話綁定 User-Agent;改密自動吊銷其他會話。
- 可選安全項:自籤 TLS、
secureCookie、審計日誌、安全響應頭和反代防請求走私處理。 - 零侵入:不修改 dsh 安裝目錄文件,也不改 dsh 自身配置邏輯。
安裝與啓用¶
使用本地目錄安裝。將 /path/to/dsh-login-gateway 替換爲實際插件目錄:
dsh plugin --profile web add /path/to/dsh-login-gateway
安裝後重啓 dsh。
新裝沒有默認賬號,需要先完成一次性初始化。可以讀取令牌文件:
cat ~/.dsh-login-gateway/setup-token.txt
令牌文件權限爲 0600。
然後瀏覽器打開:
http://<主機>:3081/setup
輸入令牌、管理員用戶名、密碼與確認密碼。
初始化前訪問 / 會 302 到 /setup;初始化完成後 /setup 返回 410,setup-token.txt 會被刪除。
完成初始化後,登錄入口爲:
http://<主機>:3081/
輸入用戶名密碼即可進入 dsh Web UI。
典型用法¶
登錄成功後,會話 Cookie 會種下,後續訪問會走反向代理。
登出可以使用頁面懸浮欄退出;無界面時也可以調用:
curl -X POST http://<主機>:3081/logout
卸載插件:
dsh plugin --profile web remove dsh-login-gateway
重啓 dsh 後,3081 停止服務。如需清理門衛的用戶數據目錄:
rm -rf ~/.dsh-login-gateway/
安全與注意¶
- 公網或同一鏈路暴露存在明文 HTTP 風險,建議前置 TLS 終止或啓用門衛自身 TLS,並配合
secureCookie。 - 直連場景建議保持
trustProxy: false,避免僞造X-Forwarded-For繞過限速。 - 會話綁定 User-Agent 默認開啓,瀏覽器升級更換 UA 後需要重新登錄。
- 個性化配置補丁會整段替換
config,覆蓋時需寫全所有配置項。 - 用戶數據文件默認位於
~/.dsh-login-gateway/users.json,使用 scrypt 哈希。 - 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
結尾¶
dsh-login-gateway 的價值在於:讓 dsh Web UI 保留 loopback 監聽,同時通過外部登錄入口和反向代理獲得受控訪問。
項目倉庫:
- https://github.com/runfali/dsh-login-gateway