dsh-lan-proxy:把 dsh Web UI 暴露到局域网的反代插件

前言

DSH 的 Web UI 默认只监听回环地址,也就是只有本机能访问。想在局域网里的另一台电脑、平板上打开它,通常得自己搭一层反向代理:单独起进程、改配置文件、处理 token 链接和 WebSocket 转发,dsh 一重启还得跟着折腾。

dsh-lan-proxy 把这件事做成了插件:开关、状态和启动日志直接嵌在 dsh 设置页里,随 dsh 启停,不需要单独维护一个进程。下面介绍它的功能、安装和用法。

这是什么

dsh-lan-proxy 是由 liveqte 维护的 DSH 插件,采用 MIT 许可证。它的核心工作是把只监听 127.0.0.1 的 dsh Web UI 通过 0.0.0.0 反代暴露到局域网,同时把局域网访问会遇到的一系列适配问题(鉴权、协议、目录选择)一并处理掉。

DSH 的理念是「一切皆插件」,这个插件也遵循这个思路:不改变 dsh 本身的监听行为,而是以反代的方式在外层解决。

核心功能

  • 局域网反代:将 dsh Web UI 同时监听 0.0.0.0:<port>,局域网内任何设备经 http://<局域网IP>:<port>/ 访问。
  • 免配置开关:设置页「局域网反代」tab 一键开关,即时热启停,无需重启 dsh。
  • 端口配置:tab 内直接修改监听端口与上游端口,保存即生效。
  • 协议适配:自动改写 Host/Origin 为回环、桥接 WebSocket(RFC6455 帧编解码)、注入 crypto.randomUUID polyfill(局域网 HTTP 属于非安全上下文,缺少这个 API)。
  • 浏览器鉴权适配:自动完成 dsh web 的 token↔cookie 交换,局域网首次访问无感,不需要手动打开带 token 的链接。
  • 网页端目录选择:禁用原生 OS 文件夹对话框,固定为网页内嵌「选择工作区目录」浏览,这样在远程机器上也能选宿主目录。
  • 状态与日志:2 秒轮询的运行状态、上游可达性探测、局域网地址列表与启动日志,内置「重启反代」按钮。

安装与启用

安装命令如下:

dsh plugin --profile web add "github:liveqte/dsh-lan-proxy#main"

bundle 层栈在启动时组合,所以装完需要重启 dsh web 才生效。验证两点:设置页导航出现「局域网反代」一级菜单;启动日志中没有 plugin tree failed to load

运行环境要求 Node >= 20。

典型用法

1、开关局域网访问

进入设置页的「局域网反代」tab,切换「监听局域网访问」。页面开关的即时状态会写入运行时文件 $DSH_HOME/profiles/web/lan-proxy.runtime.json(优先级高于配置默认值),立即生效。

2、从局域网访问

在局域网内其他设备打开:

http://<局域网IP>:<监听端口>/

默认监听端口是 3080

3、调整端口

tab 内可直接修改两类端口:

  • 监听端口:绑定所有网卡;
  • 上游端口:指向 127.0.0.1,设为 0 表示自动取 dsh 实际监听端口。

4、选择工作区

装上插件后,侧边栏 / 会话区的「添加工作区」改为网页内嵌目录浏览器(宿主文件系统列举 + 新建文件夹),不再弹出 OS 对话框。这样局域网 / 远程浏览器也能选目录;本机 127.0.0.1 访问同样走内嵌对话框。

配置项

配置项及默认值如下:

默认值 说明
enabled false 监听局域网访问(配置默认值;页面开关优先级更高并持久化到运行时文件)
port 3080 反代监听端口(所有网卡)
upstreamPort 0 上游端口,0 = 自动取 dsh 实际监听端口
maxLogLines 500 页面日志缓冲行数
bypassRules 见下 前端 JS 改写规则表

配置覆盖写在 profile 层的 cordis.patch.ymlid: lan-proxy 行的 config),不需要修改仓库内文件。

设置页封锁的绕过

dsh 0.1.x 的浏览器端只为回环地址加载设置面(connection.isLoopback)。从局域网访问「设置 → 模型」会得到:加载提供方目录失败: settings are unavailable in this browser

dsh-lan-proxy 的处理方式:反代在转发 /plugins/<id>/client.js 字节流时,按规则表改写其 JS,把封锁判定固定为回环;服务端 /api 的栅栏按 Host 头判定,而反代已把 Host 改回 127.0.0.1,服务端天然放行。这是改动浏览器实际执行字节的补丁,与插件加载顺序无关。

内置规则(dsh 0.1.x)只有一条:dsh-client-connection:isLoopback-mirror,把 dsh-client-connection client 里的 isLoopback: pageLocation… 改为 isLoopback: true,使设置/模型/凭据面正常读写。官方换一种封锁方式时,在配置里加一条 find/replace 规则即可(或覆盖 bypassRules 表);旧规则 find 不中会自动跳过并在日志面板提示。规则状态(命中次数/最后错误)出现在「局域网反代」设置页的运行状态里。

适用场景与注意

适合这些场景:在局域网内其他设备(另一台电脑、平板)上使用 dsh Web UI;不想为反代单独维护一个进程;需要在远程浏览器上选择宿主机的工作区目录。

使用前注意几点:

  1. 开关与端口修改接口仅限本机回环地址调用;局域网访问只能读状态与日志。即便如此,把服务暴露到局域网意味着同一网络内的设备可以访问你的 dsh Web UI,请在可信网络环境中使用。
  2. 插件以当前 dsh 进程权限运行,安装前建议检查其源码与许可证。本项目采用 MIT 许可证。
  3. 插件针对 dsh 0.1.x 的封锁方式做了内置绕过规则,官方行为变化后需要通过 bypassRules 自行补充规则。

结尾

dsh-lan-proxy 解决的是一个很具体的问题:让 dsh Web UI 在局域网内可访问,同时把鉴权、协议、目录选择这些边角适配一次做完,并且不引入额外进程。如果你有远程使用 dsh 的需求,可以直接试。

  • 社区目录页:https://www.skillhub.cn/plugins/liveqte/dsh-lan-proxy
  • GitHub 仓库:https://github.com/liveqte/dsh-lan-proxy
羽毛球分组比赛记分
小程序二维码

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

小夜