前言¶
DSH 自身只监听 loopback,也不接受通配的 --host,所以 Web GUI 默认只有本机能访问。想在局域网里用手机或平板打开面板,要么手动加 --trusted-host,要么起一个会改写 Host 的 HTTP 代理。前者容易漏配,后者多一层维护。
下面介绍的 miiy/dsh-access-gateway 就是为这个场景做的:它在本机起一个带密码的监听端口,登录通过后把浏览器转发到 loopback 上的 GUI,并自动带上当前进程的 launch token。
这是什么¶
dsh-access-gateway 由 miiy 维护,走社区目录 skillhub.cn 分发,仓库地址 https://github.com/miiy/dsh-access-gateway,许可证 MIT,当前版本 0.1.0。它解决的问题只有一个:让局域网内其他设备能访问 DSH Web GUI,同时不需要手工传递 token。
DSH 的生态理念是「一切皆插件」,这个插件属于客户端 bundle,同时向宿主进程注册运行时行为。目录站是独立站点,与 DeepSeek / 幻方没有官方从属关系。
核心功能¶
- 密码门监听:默认监听端口
3081,未带 gateway cookie 的请求先收到一个密码页,通过后返回302到/?token=<launch token>,并向浏览器写入 cookie。 - 令牌不由终端设备处理:转发时用的是当前 DSH 进程的 launch token,手机、平板不需要知道这个 token。
- 字节管道转发:每个连接只读第一次请求的请求头,验证通过后后续流量直接按字节搬运,因此 HTTP keep-alive 和 WebSocket 升级都能正常工作,网关不需要理解这两种协议。
- 运行时注册可信来源:插件启动时把自己监听的地址登记进 Host 的 accepted-authority 列表,
/api和 WebSocket 因此接受浏览器发来的Host头,宿主不需要额外启动参数。改成0.0.0.0时所有接口地址都会被登记。 - 登录页跟随 GUI 主题:登录页内联了 Web GUI 主题的 token,跟随系统深浅色,文案按
Accept-Language输出中文或英文。 - 密码以哈希存储:Host 只存 scrypt 哈希,不存明文;密码错误时回答前固定等待 600 ms。
安装与启用¶
安装有两条路,差别在于是否同时启用。
第一种,让 agent 调用宿主的 installBundle,一步完成安装、写入 dsh.profile.bundles 并热生效:
install the plugin `github:miiy/dsh-access-gateway`
也可以在 Settings → Plugins 的安装框里粘贴同一段 spec。
第二种,用 CLI 安装,这一步只装包,不会组合进 profile:
dsh plugin --profile <profile> add github:miiy/dsh-access-gateway
之后需要到 Settings → Plugins 打开开关,才会加入 dsh.profile.bundles;如果开关没有实时生效,重启一次 dsh web。本地 checkout 也可以安装:
dsh plugin --profile <profile> add /path/to/dsh-access-gateway
这个 bundle 是纯 JavaScript、没有构建脚本,所以从 git 安装时不需要 allowBuilds 审批。
装好后照常启动宿主即可,不需要额外启动参数。
典型用法¶
装完在 Settings → Plugins 里启用,然后去 Web GUI 的 Settings 页,找到 Access 一节。这里显示监听是否在线以及入口 URL,并在地址栏下面把本机各网卡地址做成按钮,点一下就填入,不用靠记忆敲 IP。要改的四项是地址、端口、会话时长和密码,一个表单一个保存按钮,保存后监听立即重开,不需要重启 Host。
设置完从局域网另一台设备打开入口地址(例如 http://192.168.0.10:3081),输入密码登录一次,后续默认保留 30 天。端口默认是 3081,需要和 Web GUI 自己的端口区分开。
如果不设密码,入口就不出现登录页:任何能连上该地址的请求都直接进入 GUI。在完全信任的网络上这样最方便,在不可信网络上这样不正确。
想彻底跳过网关验证的,可以用 --trusted-host 手工指定来源,插件发现宿主没有可扩展的 accepted-authority 列表时会把结果记进日志:
dsh --profile web --trusted-host 192.168.0.10
配置项¶
Settings 页保存的配置写在 ~/.dsh/dsh-access-gateway/settings.json,优先级高于下面这些默认值:
| 键 | 默认值 | 含义 |
|---|---|---|
bind |
'' |
监听地址。空值用机器报出的第一个非 loopback IPv4;0.0.0.0 监听所有接口;填具体地址则只绑那一个,比如某个 VPN 地址。 |
port |
3081 |
监听端口。不要和 GUI 的端口重复。 |
password |
'' |
网关密码,至少 4 个字符。留空则入口无验证,能连上地址的人都能进。 |
sessionDays |
30 |
一次登录有效的天数。 |
上游地址从 webServer 服务读取,所以这套配置里不会出现 GUI 的端口。
安全与限制¶
需要清楚的地方:
- 监听是明文 HTTP,应只用于可信网络或 VPN;要对外暴露就自己在前置加 TLS。
- 密码是可信网络与 GUI 之间唯一的屏障,未设密码时 Host 会打警告日志,Settings 里也会把入口标为 open。
- 网关跑在 Host 进程内,因此可以读到 launch token;它不持有其他凭据,密码只存哈希。
- gateway cookie 的签名密钥放在
~/.dsh/dsh-access-gateway/secret.json(权限 0600),所以宿主重启后已登录状态仍然有效。 - 每个 profile 只支持一个地址,需要两个接口同时响应就得建两行,分别给不同的
bind和port。 - 没有 TLS、没有隧道、没有二维码,它是给已信任的网络用的入口,不是把 GUI 发布到公网的工具。
适用场景与注意¶
适合:DSH 跑在家里或办公室局域网里,想在手机、平板或第二台电脑上打开 Web GUI 做查看、配置的人;不想手工维护 --trusted-host,也不想为远程访问单独起代理的人。
安装前建议:这个插件以当前 DSH 进程的权限运行,能读到进程内的 launch token。装之前先在仓库里看一遍源码,许可证是 MIT,确认没有超出预期的行为再启用;从第三方来源拿到的安装 spec 同理。仓库当前星标为 0,使用者不多,遇到问题建议直接在 GitHub Issues 反馈。
结尾¶
这个插件做得很收敛:不碰协议语义,只做一次密码校验加一次字节转发,顺带解决了 Host 头的可用性问题。如果你只需要局域网入口,它比手工配置 --trusted-host 少一步,比完整 HTTP 代理少一层维护。
- 目录页:https://www.skillhub.cn/plugins/miiy/dsh-access-gateway
- 仓库:https://github.com/miiy/dsh-access-gateway