前言¶
自託管 DeepSeek Harness 後,Web 界面往往直接暴露在局域網或公網上。Harness 自身有認證與 API 路徑,但根路徑 / 與前端入口在未額外加固時,仍可能被掃描器或誤訪問者先一步打開。反向代理、防火牆可以擋一部分流量,卻未必覆蓋「首次訪問就要設密、失敗要限流、操作要留痕」這類運維習慣。
下面介紹社區插件 dsh-web-login(維護者 liyang52520),在 admin-security 分類下,爲 Harness Web GUI 提供獨立於 Harness 內置流程的密碼門:未通過驗證的請求不會進入 Harness,也不會拿到 launch token;Harness 原有認證與 /api/* 不受影響。
這是什麼¶
dsh-web-login 是一個零依賴的 Cordis 插件,接管 / 與 /index.html。通過驗證後纔會把請求轉發給 Harness;憑證使用 scrypt 加鹽哈希存儲,會話 Cookie 經 HMAC-SHA256 簽名並綁定主機。
插件當前版本爲 1.4.0(見倉庫 package.json),許可證 MIT,要求 Node >= 20。
核心功能¶
資料中明確列出的能力如下。
首次運行設置 — 首次訪問時在頁面上設置密碼,須與 dsh 啓動時打印的一次性 setup token 一併校驗,避免公網掃描器搶先佔坑。
會話 — 勾選「記住我」時默認 30 天,否則 12 小時;二者可在配置中修改。
暴力破解防護 — 同一真實客戶端 IP 連續失敗 5 次(默認)後鎖定 300 秒(默認);IP 來源由 clientIpHeader 等配置決定。
審計日誌 — 記錄登錄、改密、鎖定、登出等事件,不記錄密碼明文。
管理界面 — 登錄後在 Harness Settings → 登錄門禁(Login Gate)中改密、重置密碼、本機登出;界面隨 Harness 主題變化。
與 Harness 的邊界 — 插件不改動 Harness 對 /api/* 的處理;本地 Agent 若需繞過門禁,須顯式配置 trustDirectLoopback 或通過 /__login 攜帶 Cookie,詳見下文。
安裝與啓用¶
安裝依賴 pnpm;dsh 未內置 pnpm,缺失時會報錯 pnpm was not found 且 profile 不變。可先全局安裝 pnpm,再用官方命令把插件加入 web profile:
npm i -g pnpm
dsh plugin --profile web add git+https://github.com/liyang52520/dsh-web-login.git
包聲明瞭 dsh.bundle,dsh 會自動註冊到 dsh.profile.bundles,一般無需手改配置文件。修改後需重啓 dsh 加載插件;systemd 部署示例:
systemctl restart dsh
維護命令:
dsh plugin --profile web update dsh-web-login # 升級
dsh plugin --profile web remove dsh-web-login # 卸載
DSH_HOME 須與正在運行的實例一致(默認 ~/.dsh)。路徑不一致時命令仍可能成功,但裝到了別的 profile,對當前進程無效。
典型用法¶
首次設置密碼¶
dsh 啓動日誌中會打印一次性 token,例如:
dsh web-login: setup-token: 7rJfiimRBtBZbZZqbEY3_O6VBO3Te-bA
在 systemd 下可用 journalctl -u dsh 查看;前臺運行看終端;容器內看 docker logs。瀏覽器打開站點,輸入 token 並設置密碼即可完成首次配置。
在設置裏管理門禁¶
登錄 Harness 後進入 Settings → 登錄門禁:
| 操作 | 效果 |
|---|---|
| 修改密碼 | 校驗當前密碼後設置新密碼;輪換籤名密鑰,其他設備會話失效 |
| 重置密碼 | 刪除已存密碼,所有設備需重新走首次設置 |
| 登出 | 僅清除本設備會話 |
默認允許經密碼驗證的遠程瀏覽器修改設置(unlockRemoteSettings: true);若僅允許本機 loopback 改設置,需瞭解 README 中「Settings are read-only」一節。
可選配置¶
在 profile 的 cordis.patch.yml 中按插件 id 寫入 config(整段 config 會被替換,未列出的鍵保持默認):
- id: web-login
config:
title: My Harness
rememberDays: 7
常用鍵(完整表見 GitHub README):
| 鍵 | 默認值 | 說明 |
|---|---|---|
enabled |
true |
爲 false 時不接管任何路由 |
title |
"DeepSeek Harness" |
頁面標題與登錄頁標題 |
passwordMinLength |
8 |
密碼最小長度 |
rememberDays |
30 |
「記住我」會話天數 |
sessionHours |
12 |
未勾選「記住我」時會話小時數 |
maxFailures |
5 |
觸發鎖定的連續失敗次數 |
lockoutSeconds |
300 |
鎖定時長(秒) |
clientIpHeader |
"x-real-ip" |
取真實客戶端 IP 的 Header |
trustDirectLoopback |
false |
是否將無代理頭的本機 loopback 請求視爲已驗證 |
本地 Agent 若需無 Cookie 直接訪問文檔,可在瞭解 SSH 隧道與同機任意用戶等風險後開啓:
- id: web-login
config:
trustDirectLoopback: true
更穩妥的做法是保持該選項關閉,向 /__login POST 密碼並複用 dsh_gate Cookie。
登錄後仍 403¶
多爲 Harness 的 Host/Origin 校驗與當前訪問主機名不一致。插件首次遇到時會在日誌中提示:爲 dsh 聲明 --trusted-host,並在反向代理後透傳真實 Host 與 Origin(nginx 示例見 README Troubleshooting)。
適用場景與注意¶
適合誰 — 自託管 Harness、希望 Web 入口多一層密碼門、需要失敗鎖定與審計、又希望管理入口集成在 Harness 設置裏的部署者。
運行與信任 — 插件隨當前 dsh 進程加載,權限與 dsh 相同。安裝前應在 GitHub 閱讀源碼與 MIT 許可證,自行判斷是否用於生產。
生態說明 — DeepSeek Harness 採用「一切皆插件」思路;SkillHub 插件目錄 爲社區站點,與 DeepSeek / 幻方無官方從屬關係。手動安裝勿同時混用 dsh plugin add 的 bundle 與 cordis.patch.yml 裏重複的 web-login insert,否則配置樹無法加載。