dsh-lan-access:让 DSH Web GUI 在局域网内可访问

前言

DeepSeek Harness(DSH)默认把 Web GUI 绑在 127.0.0.1,只能在本机浏览器打开。想在同一 Wi‑Fi 下的手机或另一台电脑上看对话进度、继续会话,常见做法是 SSH 端口转发或内网穿透——步骤多,还要额外维护隧道。

dsh-lan-access 是 Leon0555 维护的 DSH 联网工具插件,通过 npm 一键安装,把 Web 服务绑定到 0.0.0.0,并处理局域网 HTTP 下浏览器缺少 crypto.randomUUID 导致 RPC 失败的问题。v0.1.2 起还自带窄屏移动排版适配。下面介绍它的能力、安装方式与安全边界。

这是什么

dsh-lan-access 面向「可信内网」场景:同一局域网下,手机、平板或其他电脑用浏览器访问 http://<运行 DSH 设备的 IP>:3080,无需 SSH、无需内网穿透。

  • 维护者:Leon0555
  • 分类:联网工具
  • 许可证:MIT
  • 当前版本:0.1.3(npm / GitHub)
  • 目录页:https://www.skillhub.cn/plugins/Leon0555/dsh-lan-access
  • 源码:https://github.com/Leon0555/dsh-lan-access

核心功能

1. 局域网绑定

插件以 bundle patch 覆盖 webserver 配置,将 host 改为 0.0.0.0,端口保持 DSH 默认逻辑(ctx.webStartup.port ?? 3080)。绑定后,局域网内其他设备可通过 http://<运行 DSH 设备的 IP>:3080 访问 Web GUI。

查本机 IP 示例(macOS):

ipconfig getifaddr en0

2. crypto.randomUUID polyfill

浏览器只在 HTTPS 或 localhost 等安全上下文暴露 crypto.randomUUID。局域网明文 HTTP 下该 API 不存在,会导致 DSH 的 RPC 全部失败——项目/会话列表加载不出、无法添加工作区。

本插件通过 webServertapIndex 钩子,向每次返回的 index.html<head> 注入兜底实现(标准 UUID v4,由 crypto.getRandomValues 生成)。带幂等守卫,仅在非安全上下文生效,本机 localhost 访问不受影响。

3. 手机/窄屏自动适配(v0.1.2+)

屏幕宽度 ≤820px 时自动切换紧凑移动排版,无需配置。主要包括:

  • 字号压缩与排版收紧(消息流、代码块、标题层级)
  • 输入框 font-size: 16px,规避 iOS 聚焦自动放大
  • 按钮加大触控目标、去除点击延迟(touch-action: manipulation
  • 弹层/对话框全屏化(100dvh + 安全区适配),模型选择等浮层固定定位防遮挡
  • 深色/浅色主题下均生效(跟随 DSH 本身)

窄屏适配 CSS 移植自 dsh-lan-gate(MIT License),仅保留排版层,不含网关/审批功能。

安装与启用

方式一:让 DSH 自行安装

把项目链接贴给 DSH,让它自己安装即可(目录页:https://www.skillhub.cn/plugins/Leon0555/dsh-lan-access)。

方式二:从 npm 安装

需要 pnpm(npm i -g pnpm)。执行:

dsh plugin --profile web add dsh-lan-access

本地开发安装可用:

dsh plugin --profile web add file:/path/to/dsh-lan-access

安装后重启服务生效。若使用 launchd 常驻:

launchctl kickstart -k gui/$(id -u)/com.dsh.web

卸载

dsh plugin --profile web remove dsh-lan-access

卸载后 webserver 恢复默认仅 127.0.0.1,polyfill 不再注入。

典型用法

  1. 在本机安装并重启 DSH Web 服务。
  2. 查运行 DSH 设备的局域网 IP(如 macOS 上 ipconfig getifaddr en0)。
  3. 在同一 Wi‑Fi 下的手机或另一台电脑浏览器打开 http://<IP>:3080
  4. 在本机 http://127.0.0.1:3080 完成模型、Provider、凭据等配置;远程设备主要用于对话、看进度、在会话内选模型。

若远程也需要完整访问配置平面,README 给出的合规方案是 SSH 本地端口转发:

ssh -L 3080:127.0.0.1:3080 用户@MacIP

然后在客户端访问 http://127.0.0.1:3080。从服务端视角仍是回环访问,不绕过 DSH 的安全栅栏,且自带 SSH 认证。需开启 Mac 的「远程登录」,并自行评估 SSH 带来的命令行访问风险。

适用场景与注意

适合谁

  • 家庭或公司可信内网,想在手机/平板上继续 DSH 对话、查看实时进度
  • 不想为日常局域网访问单独搭 SSH 转发或内网穿透
  • 需要在窄屏设备上获得可读、可点的 Web GUI 排版

安全提醒

绑定 0.0.0.0 后,同一网络内任何设备都能连接 DSH,且无认证,等于整网都能触达本机 DSH 进程的命令执行能力。仅限家庭/公司可信内网使用,公共 WiFi 请勿开启。

建议:路由器/防火墙限制来源 IP;出外网访问请叠加 Tailscale 等隧道。

插件以当前 DSH 进程权限运行。安装前应阅读源码与 MIT 许可证,确认行为符合你的安全预期。

远程访问限制(本插件有意不绕过)

DSH 把「配置平面」——设置页、模型/Provider 管理、凭据、Agent Preset、目录选择、llm.discoverModels 等——硬性限制为仅本机回环(127.0.0.1)可访问。即使本插件将 Web 服务绑定到 0.0.0.0,从局域网 IP 访问这些接口仍会返回 HTTP 403。这是 DSH 官方安全边界(dsh-client-connectionPRIVILEGED_METHODS);trustedHosts 白名单只是 DNS 反绑定栅栏,不是认证

本插件不绕过该栅栏,也不提供代理去改写请求头。

远程(局域网)可用 HTTP 403(仅本机回环)
对话、实时进度 设置页(模型、Provider 配置)
会话内模型选择(llm.providers / llm.models 凭据管理(credentials.*
会话历史、工作区浏览 Agent Preset 管理
其余正常 API 目录选择(host.pickDirectory)、llm.discoverModels

技术说明

  • 绑定:bundle patch 覆盖 webserver 行(host: 0.0.0.0,port 保持 ctx.webStartup.port ?? 3080)。
  • polyfilltapIndexindex.html <head> 注入内联脚本;非安全上下文才生效。
  • 手机适配:同一 tapIndex 注入 <style>@media (max-width: 820px)),选择器针对 DSH 的 data-slotdata-chat-flowdata-composer-cardrole="dialog" 等稳定结构属性。

结尾

dsh-lan-access 用三个改动解决局域网访问 DSH 的实际障碍:绑定 0.0.0.0、补全 crypto.randomUUID、窄屏排版适配。它明确不开放配置与凭据域,适合在可信内网做「远程对话、本机管配置」的分工。

  • 社区目录:https://www.skillhub.cn/plugins/Leon0555/dsh-lan-access
  • GitHub:https://github.com/Leon0555/dsh-lan-access
  • npm:https://www.npmjs.com/package/dsh-lan-access
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜