dsh-lan-link
为 DeepSeek Harness Web 提供可持久开启的局域网访问入口,面向当前 DSH 0.1.5-rc.1。
插件不实现第二套反向代理或自定义认证,而是配置并展示 DSH 0.1.5 自带的:
0.0.0.0WebServer LAN 监听;- LAN IP
trustedHosts信任栅栏; - 每进程随机 launch token;
- token 首次访问后签发的 HttpOnly Cookie;
- 默认 30 天、可跨 DSH 重启复用的签名浏览器会话。
兼容版本
| 项目 | 版本 |
|---|---|
| DeepSeek Harness CLI | 0.1.5-rc.1 |
| 插件 | 0.2.0 |
| Node.js | >=22.19.0 |
本插件以实际全局 dsh --version 和安装目录为基线,而不是旧源码 checkout。package.json 中的 dsh.engines.dsh 精确声明为 0.1.5-rc.1。
安装
git clone https://github.com/advance-lion/dsh-lan-link.git
cd dsh-lan-link
dsh plugin --profile web add .
然后重启当前 dsh web 进程。
卸载:
dsh plugin --profile web remove dsh-lan-link
使用
进入:
设置 → 插件 → 插件配置 → LAN Link
设置卡提供:
- Enable LAN access after restart:保存是否允许 LAN 访问;
- DSH Web port:保存下次启动使用的 Web 端口,默认
3080; - Authorization lifetime (days):设置授权 Cookie 有效期,默认
30天,可设1–3650天; - 当前实际绑定地址与端口;
- 是否需要重启,以及本机可用的 Save and restart DSH 一键重启按钮;
- DSH 原生的完整 token 授权链接;
- 安全风险提示。
一键重启复用当前 profile 已安装的 DSH Market 安全重启端点:它重放当前 DSH 的入口、参数、环境与工作目录,并等待端口释放后拉起新进程。端点只接受本机同源请求;通过 LAN 打开的远程页面不能重启主机进程。点击前会确认,并提示当前模型响应和后台任务会被中断。若 profile 未安装或已禁用 dshmarket,按钮会显示端点返回的错误,此时需手工重启。
为什么修改后要重启
DSH 0.1.5 的 WebServer 和 BrowserAuth 在进程启动时读取配置:监听地址不能在运行中把 127.0.0.1 安全热切换为 0.0.0.0,Cookie 有效期也在 BrowserAuth 初始化时确定。因此开关、端口和授权天数使用 applies: restart:设置立即持久化,但重启 dsh web 后生效。授权天数的修改只影响重启后新签发的 Cookie,不会追溯改变已签发 Cookie 的到期时间。
- 关闭:绑定
127.0.0.1,仅本机访问; - 开启:绑定
0.0.0.0,由 DSH Web Runtime 自动发现 LAN IPv4 并加入trustedHosts; - 显式命令行
--host/--port仍优先于插件设置,方便临时覆盖。
原生授权流程
开启 LAN 并重启 DSH;
设置卡或启动日志显示类似:
http://192.168.1.20:3080/?token=...远程浏览器第一次打开完整链接;
DSH 原生
BrowserAuth校验该进程的随机 token;成功后返回重定向,并写入绑定 hostname 和 port 的签名 Cookie;
此后可直接访问不含 token 的干净 URL;
Cookie 默认有效 30 天。
launch token 每次 DSH 启动都会变化。Cookie 签名密钥保存在 $DSH_HOME/.credentials.yaml,所以已经授权的浏览器 Cookie 可以跨 DSH 重启继续使用,直到过期、清除浏览器 Cookie,或删除/替换对应 credential 后重启。
安全边界
- 完整 token URL 等同于 DSH 完整操作权限,不是只读链接;
- 原生 Cookie 为 HttpOnly、Host-only、
Path=/、SameSite=Strict; - Cookie 绑定 hostname 和 port,换 IP、主机名或端口后需要重新授权;
- 普通 HTTP 不加密,局域网内具备嗅探能力的攻击者可能看到流量;
- Host、Origin 和
sec-fetch-site仍由 DSH 原生信任栅栏检查; - 不要把端口映射到公网,不要在公共 Wi-Fi 上开启;
- Windows 防火墙提示时只允许“专用网络”,不要允许“公用网络”;
- 跨公网访问应使用 Tailscale、WireGuard、SSH 隧道或 HTTPS 反向代理。
如果需要撤销某个浏览器:清除其 Cookie。若要撤销全部已授权浏览器,需要删除或替换 client-connection/browser-session credential 并重启 DSH。
实现结构
lib/config.js:在 WebServer 绑定前读取并注册持久设置,提供启动快照;cordis.patch.yml:让原生 WebServer 根据快照选择 loopback/LAN 地址,并保持 DSH 原生 Connection 认证;lib/index.js:向已认证设置页返回原生授权链接并处理配置写入;lib/client.js:Settings → Plugins 中的配置卡。
插件没有自建 HTTP/WebSocket 代理,也没有自行存储长期 token。
验证
已在全局 DSH 0.1.5-rc.1 上完成真实测试:
- 空白 profile 本地安装与 Cordis 配置合成;
- loopback 模式启动;
- LAN 模式绑定
0.0.0.0; - 未认证 LAN 请求返回
401; - 原生 token 交换返回重定向并设置 Cookie;
- Cookie 后页面返回
200且包含window.__DSH_BOOT__; - DSH 重启、launch token 变化后,旧签名 Cookie 仍可访问;
- 代理层单元测试已删除,因为 0.2.0 不再包含自建代理。
开发检查:
pnpm test
npm pack --dry-run
版本维护与上游跟踪
main与v0.2.1:主要支持 DSH0.1.5-rc.1;compat/dsh-0.1.5-rc.2与v0.2.2-rc.2.0:经隔离端到端验证的 DSH0.1.5-rc.2兼容预发布;compatibility.json记录主版本与已验证组合;- GitHub Actions 对每个分支按其
dsh.engines.dsh安装官方 DSH 并执行原生认证 smoke test; - 每周检查 DeepSeek Harness Releases,发现尚未验证的新版本时自动创建兼容性 Issue。新版本不会未经测试自动发布。
License
MIT
No comments yet. Be the first to write one.