鱼皮AI导航
鱼皮AI导航
  • 主页
  • 社区
  • AI工具
  • AI知识库
  • AI提示词
  • MCP
  • Skills
  • AI学习资源
  • AI资讯
  • GitHub开源
登录/注册

dsh-web-lan-access

Web UI 局域网/远程访问:为纯 HTTP 非安全上下文注入 crypto.randomUUID polyfill,局域网/Tailscale IP 直连时前端不再崩溃。

远程移动端
访问 GitHub
文档README

dsh-web-lan-access

English | 简体中文

DeepSeek Harness Web UI 的局域网/远程访问支持插件。

问题

Web UI 在启动关键路径上调用 crypto.randomUUID()(RPC id 生成、消息 id、草稿附件)。该 Web API 只在安全上下文存在(HTTPS,或 http://localhost / http://127.0.0.1)。当界面通过纯 HTTP 从非回环地址(局域网 IP、Tailscale IP、主机名)提供服务时,crypto.randomUUID 是 undefined,所有 RPC 抛错,会话和模型完全无法显示。

原理

宿主端插件使用 webserver 官方扩展点(webServer.tapIndex),在每次返回的 index.html 的 <head> 之后注入一段 polyfill(基于 crypto.getRandomValues 的 RFC 4122 v4 实现——该 API 在非安全上下文可用),位置在启动清单和 shell 入口之前。安全上下文下 polyfill 为空操作。

  • 不修改产品源码,完全可逆
  • 与版本无关(只转换下发的 index.html)
  • 跨平台(Linux / macOS / Windows / Android)

安装

方式一:bundle 安装(推荐)

从 npm 安装:

▼
sh
复制代码
dsh plugin --profile web add dsh-web-lan-access

(不走 npm / 本地开发时,可用仓库地址:

▼
sh
复制代码
dsh plugin --profile web add github:AcidGr/dsh-web-lan-access

)

重启 dsh web,浏览器硬刷新。

方式二:手动安装(无 pnpm / 离线)

▼
sh
复制代码
PROFILE="$DSH_HOME/profiles/web" # 按实际修改 DSH_HOME 和 profile 名 mkdir -p "$PROFILE/plugins" "$PROFILE/node_modules/@dsh-profile" cp -r dsh-web-lan-access "$PROFILE/plugins/lan-access" ln -sfn ../../plugins/lan-access "$PROFILE/node_modules/@dsh-profile/lan-access" # 在 $PROFILE/cordis.patch.yml 追加: # - insert: # - id: lan-access # name: '@dsh-profile/lan-access'

使用

插件是自包含的:它的 bundle patch 直接把 webserver 的绑定 host 设为 0.0.0.0(新版 harness 出于安全硬性拒绝命令行 --host 0.0.0.0,但 webserver 配置仍接受该值——所以无需改源码、无需 --host 参数;--port 参数照常可用)。它同时会自动扩大 /api 信任围栏。

  1. 安装插件后正常启动即可(不带 --host):

    ▼
    sh
    复制代码
    dsh --profile web --port 3080

    bundle patch 会从本机当前所有非内部 IPv4(局域网 192.168.x、Tailscale 100.x、VPN 接口)重新推导 /api 信任围栏,并合并 resolveLanTrust 已有的结果。只要远程接口在 dsh web 启动时已就绪(Tailscale 通常开机自启、先于它),局域网 / Tailscale IP 访问零额外配置:打开 http://<服务器IP>:3080 或 http://<tailscaleIP>:3080 即可正常加载会话和模型。

    如果你不想让插件接管绑定(例如想保持 127.0.0.1 + 端口转发),把 webserver 行覆盖从组合里去掉,改用 socat / rinetd / Tailscale serve 从 127.0.0.1:3080 转发端口,并把转发入口地址手动加入 trustedHosts。

  2. MagicDNS 主机名(如 xxx.tailXXXX.ts.net)——围栏只能自动发现 IP 字面量,无法发现主机名,所以如果你想像按 IP 那样用名字访问,需手动声明。改 web-runtime 行:它的 trustedHosts 是喂给围栏计算的输入(resolveLanTrust 会合并它们),你的条目叠加在自动发现的 IP 之上,是追加语义:

    ▼
    yaml
    复制代码
    - id: web-runtime config: trustedHosts: - <短名> # 如 myhost —— 必须单独列出! - <名称>.tailXXXX.ts.net # 完整域名

    或者不改文件,直接用可重复的 CLI 参数(同一条注入路径):dsh --profile web --trusted-host myhost --trusted-host myhost.tailXXXX.ts.net。两种方式二选一——静态列表会替换该行的默认表达式,不会再与 --trusted-host 合并。

    ⚠️ 围栏逐字比对 Host 头:MagicDNS 短名(http://myhost:3080)≠ 完整域名,短名必须单独列一行,否则所有 /api 请求返回 403(页面壳能开、会话/模型全无)。Tailscale / 局域网 IP 字面量无需在此列出——已自动覆盖。

    ⚠️ 不要把这段改指向 connection 行:patch 层按应用顺序做整个 key 替换(各 bundle 层先应用、本文件的层最后应用),直接往 connection.config.trustedHosts 写普通数组会静默替换掉 bundle 的动态围栏表达式——名字能访问了,但自动推导的局域网/Tailscale IP 信任就没了。确实需要动 connection 时,请照抄插件 bundle 补丁里的完整拼接表达式再追加自己的字面量,不要写纯列表。

已知限制:特权 API 方法

未修改的 harness 构建里,一小部分敏感 API 方法(settings.*、credentials.*、llm.discoverModels)被钉死在仅回环(packages/client/connection/src/index.ts 里的 isTrustedApiRequest(request, [])),与 trustedHosts 无关。远程来源调用它们会得到 403:聊天/会话/模型仍正常,但设置页(含插件配置卡片)和凭据界面显示为空/报错。polyfill 无法改变这一点——这是产品侧的策略。上游一行改动(isTrustedApiRequest(request, trustedHosts))即可让它们跟随部署的 trusted hosts;在那之前,要么本地改这一行,要么这些设置从 http://127.0.0.1:3080 上操作。

验证

▼
sh
复制代码
curl http://127.0.0.1:3080/ | grep lan-access-polyfill # 必须有输出

再从另一台设备打开 http://<服务器IP>:3080——会话和模型应正常加载。

安全警告

绑定 0.0.0.0 后,同一网络内任何设备都能无鉴权操作该 agent(/api 只是来源围栏,不是登录)。公网 IP 的服务器等于向整个互联网开放。请只在可信网络使用;用防火墙限制网段(如 ufw allow from 192.168.0.0/16),或走 Tailscale / 带鉴权的反向代理。走 TLS 反代的话连这个 polyfill 都不需要。

回滚

  • bundle 安装:dsh plugin --profile web remove dsh-web-lan-access
  • 手动安装:删掉 cordis.patch.yml 里的 lan-access insert 块;可选:启动时去掉 --host 0.0.0.0

许可证

MIT

远程移动端

快捷安装

复制到终端去安装插件

dshplugin--profilewebadddsh-web-lan-access

温馨提示

装插件等于在本机跑第三方代码,权限与你相同,能读文件、用凭据、访问网络,工具审批管不到。请只装可信来源,并尽量锁定 commit。

站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
dsh 插件推荐
dsh-web#packages/dsh-ssh
SSH 远程运维面板:Web 终端、SFTP 传输、本地端口转发与一条命令并发集群执行,Agent 与面板共用同一份主机配置。
dsh-tether
用 Android/iOS 手机远程使用电脑上的 dsh 完整网页界面,经 iroh 跨网点对点直连,中间不经过任何服务器。
dsh-im-gateway
DeepSeek Harness 聚合 IM 网关:通过微信、飞书、Telegram、Discord、QQ、WhatsApp 等 20+ 聊天平台驱动 agent,支持统一会话、远程审批和交互提问。默认放行所有能给机器人发消息的人,需要限制请配置 allowedUserIds。
dsh-android
在对话里直接操作 Android 设备——模拟器或 USB 手机,完全通过 adb 驱动:20 个 Agent 工具用于流式投屏、Gradle 构建运行、UI 树或 OCR 交互、logcat、进程与内存检查,并附带三键导航面板。
dsh-remote-ssh
类 VSCode Remote-SSH 的 DSH 插件:SSH 连接超算/服务器,内置文件页签直读远程文件、终端页签自动 SSH,远程工作区配单往返合并读与结果缓存,含 12 个会话感知的 remote_ssh_* 模型工具。
🔥热门工具
朱雀AI检测朱雀AI检测
朱雀AI检测助手朱雀AI检测助手
LovartLovart
老鱼简历老鱼简历
WritePass官网WritePass官网
面多多面多多
CursorCursor
星月写作星月写作
零感AI零感AI
墨得问题墨得问题