前言¶
DeepSeek Harness(DSH)的 dsh web 默认面向本机浏览器:工作区选择会弹出宿主机原生目录框,若干特权 API(host.pickDirectory、settings.*、credentials.* 等)被官方硬编码限制在 loopback,文档里也写明「直到真正的认证层出现」。若要把 DSH 经 nginx、SSH 隧道、Tailscale 或 Frp 暴露到局域网或外网,远程用户既看不到原生选择框,也无法在未认证情况下安全使用这些接口。
@xgone/dsh-remote(GitHub:xgone/dsh-remote)正是针对这一缺口:在 dsh web 前增加账号密码登录、MFA(TOTP)门禁、签名会话 Cookie 与角色权限,并把目录选择改为浏览器内对话框。认证通过后自动放行 DSH 原本仅限本机的特权路径,全程不在宿主机弹出原生窗口。
这是什么¶
@xgone/dsh-remote 由维护者 xgone 发布,分类为 admin-security,MIT 许可证。npm 当前版本为 0.2.8。GitHub 仓库约 42 stars、2 forks。
一句话定位:让 DeepSeek Harness 可以被安全地远程访问——外网或局域网浏览器登录后即可使用完整 Web 功能,包括工作区选择与账号管理。
核心功能¶
远程访问与 DSH 特权放行¶
经反向代理或隧道暴露后,外部浏览器登录即可使用全部功能。插件作为认证层,认证通过后自动放行 DSH /api 中原本钉死在 loopback 的特权方法。
WebSocket 事件流(events.mux / events.host)在会话有效时正常建立。
浏览器内目录选择¶
DSH 默认目录选择器在 loopback 部署下会调用宿主机 OS 选择框,远程用户无法操作。本插件用 browse 后端替换:选择或新建工作区变为浏览器内双栏目录视图,带面包屑与新建文件夹,不弹宿主窗口。
账号密码与登录门禁¶
未登录访问任意路径均返回自包含登录页;/api 与 WebSocket 全部要求有效会话 Cookie。
会话采用 HMAC-SHA256 签名的 HttpOnly Cookie,可配置过期时间、Secure、SameSite;签名密钥随机生成并持久化,重启后会话仍有效。
密码以 scrypt 哈希存储(N=16384,r=8,p=1),配合常量时间比较,不落盘明文。登录失败按「IP + 用户名」限速,默认 15 分钟窗口内 5 次。
首次无账号时,登录页提供「创建首个管理员」,仅本机 loopback 可提交,防止远程抢先注册。根账号不可删除、不可改角色,只能重置密码。默认 adminOnly 模式禁止新建账号、强制 admin 角色;关闭后可启用 admin / user / guest 三层方法级权限。
MFA 两步验证(TOTP)¶
兼容 Google Authenticator、1Password、Authy 等标准认证器(RFC 6238,6 位 / 30 秒)。开启时展示二维码(SVG)、手动密钥、otpauth 链接与 10 个一次性备用码(备用码仅存 SHA-256 哈希)。登录页显示动态码剩余秒数倒计时,输入满 6 位自动验证;备用码含字母时需手动确认。管理员可用自己的密码为任意账号禁用 MFA。
设置页与体验细节¶
设置 → 登录与账号:MFA 自服务、账号列表、重置密码、退出登录。会话过期时 SPA 内出现全屏重登浮层。
界面通过 DSH 官方设计令牌(--dsw-alias-*)取色,自动跟随浅色 / 深色 / 跟随系统。登录页、MFA 引导、重登浮层、设置页均提供中英双语,跟随 DSH 应用语言设置;远程浏览器下插件还接管语言偏好的读写通道,经标准 settings.describe / settings.mutate RPC 与 settings.yaml 同步。
较新版本还修复了远程场景下插件配置页空白、欢迎弹窗反复出现、模型页「settings are unavailable」等问题(README 中分别标注 v0.1.5+、v0.1.6+、v0.2.6+)。
安装与启用¶
前置条件¶
- 已安装 DeepSeek Harness,可运行
dsh web(默认端口 3080); - 已初始化 web profile(首次运行
dsh web会自动初始化); - 系统 PATH 中有
pnpm(dsh plugin管理 profile 插件时需要)。
安装插件¶
NPM 安装(推荐):
dsh plugin --profile web add @xgone/dsh-remote
固定版本示例:
dsh plugin --profile web add @xgone/dsh-remote@0.1.0
也可从 Git 或本地目录安装:
dsh plugin --profile web add git@github.com:xgone/dsh-remote.git
dsh plugin --profile web add ~/path/to/dsh-remote
dsh plugin 会在 ~/.dsh/profiles/web/ 下用 pnpm 安装包,并自动把 @xgone/dsh-remote 追加到 profile 的 dsh.profile.bundles,无需手动改 bundles 列表。
确认安装并重启¶
python3 -c "import json; print(json.load(open('$HOME/.dsh/profiles/web/package.json'))['dsh']['profile']['bundles'])"
期望输出类似:['@deepseek-ai/dsh-base', '@deepseek-ai/dsh-web-app', '@xgone/dsh-remote']。
Web 表面禁用 HMR,必须重启 dsh web 才生效:
dsh web
首次创建管理员¶
重启后浏览器打开 http://127.0.0.1:3080:
- 未登录会看到登录页;
- 无账号时进入引导模式,标题为「创建首个管理员账号」;
- 输入用户名与至少 6 位密码,点击创建——仅限本机 loopback 提交;
- 创建成功即登录并签发会话 Cookie。
验证:
curl http://127.0.0.1:3080/auth/me
应返回含 authEnabled、authenticated 等字段的 JSON。
无浏览器服务器(headless)¶
无法在本机浏览器完成引导时,可在 ~/.dsh/profiles/web/cordis.patch.yml 中预置首个管理员(账号库为空时生效,幂等):
- id: remote
config:
enabled: true
bootstrap:
username: admin
password: '换成一个强密码'
首次登录后建议从配置中移除 bootstrap 节;反向代理部署通常还需 trustProxy: true(默认已开启)。
卸载¶
dsh plugin --profile web remove @xgone/dsh-remote
重启 dsh web 后门禁消失。$DSH_HOME/auth/store.json 会保留,需彻底清除可手动删除。
典型用法¶
绑定 MFA¶
登录后进入设置 → 登录与账号 → 双重验证 (MFA) → 启用双重验证:
- 扫码或手动输入密钥,保存 10 个一次性备用码;
- 在认证器中输入当前 6 位动态码,自动验证并启用;
- 之后每次登录需密码 + 动态码(或备用码)。
也可在登录页密码验证通过后,按引导就地绑定 MFA。
远程暴露¶
将 dsh web 经 nginx、SSH 隧道(ssh -L)、Tailscale 或 Frp 暴露后,远程浏览器访问同一入口 URL,先过登录门禁,再正常使用工作区选择与 API。HTTPS 部署时建议在 cordis.patch.yml 将 session.secure 设为 true。
主要配置项¶
编辑 ~/.dsh/profiles/web/cordis.patch.yml 中 remote 行的 config:
- id: remote
config:
enabled: true
session:
cookieName: dsh_session
ttlSeconds: 604800
secure: false
sameSite: lax
enforceRoles: true
adminOnly: true
trustProxy: true
mfa:
enabled: true
issuer: DeepSeek Harness
window: 1
backupCodes: 10
rateLimit:
maxAttempts: 5
windowMs: 900000
紧急旁路:设 enabled: false 重启,或删除 $DSH_HOME/auth/store.json 重新引导。忘记 MFA 时由管理员在设置页为该账号禁用 MFA(需管理员密码)。
适用场景与注意¶
适合需要把 DSH Web 安全暴露到非本机浏览器的开发者:远程办公、内网穿透、无图形界面服务器上的 headless 部署等。
插件以当前 dsh 进程权限运行,安装前应阅读 GitHub 源码 与 MIT 许可证,确认符合你的安全策略。创建首个管理员仅限 loopback,是为防止公网抢先注册;公网暴露前务必完成账号创建并建议启用 MFA。
DSH 生态理念是「一切皆插件」;SkillHub 等社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。@xgone/dsh-remote 是社区维护的 admin-security 类插件,不是 DSH 内置组件。
链接¶
- 目录页:https://www.skillhub.cn/plugins/xgone/dsh-remote
- GitHub:https://github.com/xgone/dsh-remote
- npm:https://www.npmjs.com/package/@xgone/dsh-remote