前言¶
DeepSeek Harness(DSH)的 Web UI 默认适合在本机或 HTTPS 环境下使用。若把服务暴露在局域网 IP、Tailscale 地址或非 loopback 主机名上,并以明文 HTTP 访问,页面可能在启动阶段就失败:会话列表和模型选择区空白,RPC 调用持续报错。
根因在于 Web UI 在启动关键路径里调用 crypto.randomUUID(),而该 API 仅在安全上下文(HTTPS,或 http://localhost / http://127.0.0.1)中可用。在 http://192.168.x.x:3080 这类地址上,crypto.randomUUID 为 undefined,后续 RPC 无法正常工作。
下面介绍社区插件 dsh-web-lan-access:在不改动 DSH 产品源码的前提下,通过宿主侧注入 polyfill 并自动放宽 /api 信任边界,使局域网与 Tailscale 访问可以正常加载会话与模型。
这是什么¶
dsh-web-lan-access 是 AcidGr 维护的 DSH Web 侧插件,归类为联网工具。它在 npm 上发布为 dsh-web-lan-access(当前版本 1.2.1,MIT 许可证),GitHub 仓库约 25 stars。
插件做三件事:
- 通过
webServer.tapIndex扩展点,在<head>最前面注入基于crypto.getRandomValues的 RFC 4122 v4 polyfill;在安全源上该脚本为 no-op。 - 通过 bundle patch 将 webserver 绑定地址设为
0.0.0.0,无需再传已被新版本 CLI 拒绝的--host 0.0.0.0。 - 自动根据主机当前非内网 IPv4(含
192.168.x、Tailscale100.x、VPN 接口)扩展/api信任围栏。
全程只变换服务端输出的 index.html 与配置,不修改产品源码,卸载即可回滚。
核心功能¶
crypto.randomUUID polyfill¶
DSH Web UI 在 RPC id、消息 id、草稿附件等路径依赖 crypto.randomUUID()。插件在 boot manifest 与 shell 入口之前注入一小段脚本,用 crypto.getRandomValues(在非安全源上仍可用)实现 v4 UUID。HTTPS 或 localhost 访问时脚本不生效。
自动绑定与信任围栏¶
bundle patch 将 webserver 监听 0.0.0.0。启动时插件会从主机网卡推导所有非 internal IPv4,与 resolveLanTrust 已有结果合并,写入 /api 信任围栏。因此 LAN IP 与 Tailscale IP 字面量访问通常无需额外配置——前提是远程接口在 dsh web 启动前已就绪。
MagicDNS 主机名支持¶
信任围栏只能发现 IP 字面量,不能自动识别 xxx.tailXXXX.ts.net 这类主机名。若要用域名而非 IP 访问,需把短名与完整域名分别加入 web-runtime 的 trustedHosts,或使用 CLI:
dsh --profile web --trusted-host myhost --trusted-host myhost.tailXXXX.ts.net
注意:Host 头按字面量匹配。用 http://myhost:3080 访问时,短名 myhost 必须单独列出,否则页面壳能加载但 /api 返回 403。不要把主机名配置写到 connection 行——那会覆盖 bundle 的动态围栏表达式,导致自动推导的 LAN/Tailscale IP 信任失效。
安装与启用¶
推荐通过 npm 安装到 web profile:
dsh plugin --profile web add dsh-web-lan-access
无 npm 或本地开发时,可指向 GitHub 仓库:
dsh plugin --profile web add github:AcidGr/dsh-web-lan-access
安装后重启 dsh web,并在浏览器中硬刷新。
离线手动安装时,将插件目录复制到 $DSH_HOME/profiles/web/plugins/lan-access,建立 @dsh-profile/lan-access 符号链接,并在 cordis.patch.yml 中插入对应 id。具体路径与 YAML 片段见仓库 README。
安装前应阅读插件源码与 MIT 许可证;插件以当前 dsh 进程权限运行。
典型用法¶
安装完成后,正常启动即可,不必传 --host:
dsh --profile web --port 3080
在同一局域网的另一台设备打开 http://<server-ip>:3080 或 http://<tailscale-ip>:3080,会话与模型应能加载。
验证 polyfill 是否注入:
curl http://127.0.0.1:3080/ | grep lan-access-polyfill
有匹配输出即表示脚本已写入首页。
若不想由插件接管绑定地址(例如只想 loopback 加端口转发),可从配置树中去掉 webserver 行覆盖,改用 socat、rinetd 或 Tailscale serve 转发,并手动维护 trustedHosts。
适用场景与注意¶
适合谁: 需要在家庭或办公室局域网、Tailscale 组网内,用 HTTP 从手机或其他电脑访问 DSH Web UI 的开发者;不想为内网调试单独搭 HTTPS 反向代理的场景。
安全: 绑定 0.0.0.0 且 /api 仅有来源围栏、无登录鉴权,同一网段内任何人均可访问智能体。公网 IP 主机上切勿直接暴露;应配合防火墙(如 ufw allow from 192.168.0.0/16)、Tailscale 或带认证的反代。若已用 TLS 反代,通常不再需要此 polyfill。
已知限制: 在未修改上游的 harness 构建中,settings.*、credentials.*、llm.discoverModels 等敏感 API 仍固定只允许 loopback,远程访问时设置页与凭证 UI 可能为空或报错;聊天与会话功能不受影响。需在 http://127.0.0.1:3080 本地管理这些项,或自行修改上游 isTrustedApiRequest 一行代码。
回滚:
dsh plugin --profile web remove dsh-web-lan-access
手动安装则删除 cordis.patch.yml 中的 lan-access 插入块。
结尾¶
dsh-web-lan-access 针对 DSH Web UI 在非安全 HTTP 源上无法启动的问题,用宿主插件方式注入 polyfill 并自动配置监听与 API 信任,使局域网与 Tailscale 访问可以开箱使用。插件来自 DSH 社区生态,SkillHub 目录页与 GitHub 仓库相互独立,与 DeepSeek / 幻方无官方从属关系。
- 目录页:https://www.skillhub.cn/plugins/AcidGr/dsh-web-lan-access
- GitHub:https://github.com/AcidGr/dsh-web-lan-access