前言¶
自托管 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,否则配置树无法加载。