前言¶
在 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