dsh-opentunnel:为 DSH Web GUI 提供公网 HTTPS 入口

前言

DeepSeek Harness(DSH)的 Web 界面默认只监听本机环回地址,用手机或外网浏览器访问时,常见做法是 VPN、在路由器上开端口,或把 token 链接手工转发出去。DSH 进程每次重启都会轮换 Web token,收藏夹或旧二维码容易变成 401 dsh web authentication required,体验也不稳定。

@ikauann/dsh-opentunnel 是社区维护的 DSH 插件(分类:联网工具),通过 OpenTunnel 为 Web GUI 挂一条可随时开关的公网 HTTPS 路由,并在设置页提供永久二维码入口;中间用环回代理改写 Host/Origin,避免为外网 Host 单独放宽 DSH 的 API 围栏。下文介绍其定位、安装步骤与使用方式;事实均来自 GitHub 仓库 的 README 与 package.json。

这是什么

  • 名称:@ikauann/dsh-opentunnel(npm 包名,当前资料中的版本为 0.4.0)
  • 维护者:ikauann
  • 许可证:MIT
  • 定位:为 DSH Web GUI 提供 OpenTunnel 公网路由——设置里的开关、手机扫码进站的永久 QR,以及守在本机 listener 前的权限改写代理。
  • 运行要求:Node.js >=22(见 package.json 的 engines)

插件以当前 DSH 进程权限运行;安装前应自行审阅源码与许可证,并理解公网入口等同暴露本机上的智能体执行环境。

核心功能

设置页开关与永久入口链接

在账户菜单、侧栏底部的 Configurações → OpenTunnel(设置 → OpenTunnel)中可开关 Túnel público(公网隧道)。隧道默认关闭:可从外网访问 agent 是一种需要主动开启的状态。

首次开启约需 30 秒(创建隧道并通过 ACME 签发证书);之后重新附着通常在数秒内完成。关闭开关后,公网路由立即失效。

永久入口形如 https://<host>/e/<código>(资料中的示例 hostname 为 *.opentunnel.xyz)。用手机扫描二维码即可打开该 URL;隧道侧把入口码换成当前进程的有效 token,DSH 下发 30 天有效期的签名 cookie,之后手机可直接进入,无需再次扫码。

DSH 启动时还会在终端同一行打印本地 Web 与 opentunnel 链接,例如:

dsh web: http://127.0.0.1:3080/?token=…
dsh opentunnel: https://tqeae3hifged.opentunnel.xyz/e/390abeb82886223d2c5dca1485769813

同一链接会写入 $DSH_HOME/opentunnel-link.txt(文件权限 600)。

/e/<código> 与 token 生命周期

DSH 打印的 Web token 是按进程的:重启 DSH 会换 token,但隧道 hostname 与路径不变,旧书签或旧 QR 可能对同一 URL 返回 401。

入口码保存在 $DSH_HOME/opentunnel.json,代理在每次打开时将其换成当前存活的 token,因此 DSH 重启后链接形式仍可不变(仍依赖隧道 hostname 稳定——身份存放在 %USERPROFILE%\.local\share\opentunnel\(资料中的 Windows 路径表述)——以及隧道处于开启状态)。

入口码会过期(配置项 entryTtlDays,默认 7 天);打开设置页或点击 Novo link(新链接)会续期。已登录设备靠 30 天 cookie,轮换入口码不会踢掉已进站的手机,只会使旧链接失效。

环回代理与 Host/Origin 改写

DSH 对 /api 有 Host/Origin 围栏:接受环回、listener 绑定 IP 以及 trustedHosts(来自启动参数 --trusted-host)。隧道会把访客的 Host 原样送到后端,导致围栏对 /api 返回 403,GUI 无法加载后端。

插件在本机 listener 前增加环回代理,隧道指向该代理;代理将 Host 与 Origin 改写为 127.0.0.1:<porta>,其余头(含 sec-fetch-site)照常转发,使请求在 DSH 看来等价于本地访问,无需为外网单独加信任标志。

需注意:cookie 绑定在 127.0.0.1:<porta> 上;若更改 listener 端口,旧 cookie 失效,但永久链接仍可工作并会签发新 cookie。

若关闭代理改写(rewrite: false),须以隧道 host 作为可信主机启动,例如资料中的 PowerShell 示例:

dsh --profile web --trusted-host tqeae3hifged.opentunnel.xyz --public-url https://tqeae3hifged.opentunnel.xyz

此模式下没有 /e/<código>,需改用 DSH 每次重启会更新的带 token 链接。

安装与启用

安装方式是在 web profile 的 package.json 中声明依赖并加入 bundle,然后执行官方给出的安装与重启命令(资料原文,勿自行拼接其它 dsh plugin add 形式)。

  1. 编辑 $DSH_HOME/profiles/web/package.json,加入依赖与 bundle。若从 GitHub 安装(非本地 link:),依赖写为 github:ikauann/dsh-opentunnel,并在 dsh.profile.bundles 中包含包名 @ikauann/dsh-opentunnel:
{
  "dependencies": {
    "@ikauann/dsh-opentunnel": "github:ikauann/dsh-opentunnel"
  },
  "dsh": {
    "profile": {
      "bundles": ["…", "@ikauann/dsh-opentunnel"]
    }
  }
}

(若使用本地路径开发,可将依赖改为 "link:C:/caminho/para/dsh-opentunnel" 等形式,bundle 条目保持不变。)

  1. 安装依赖并重启 DSH(服务端 bundle 与客户端模块仅在新的 boot 中加载):
$env:DSH_HOME="$HOME\.dsh"
dsh plugin --profile web install
dsh --profile web

Linux/macOS 用户将 DSH_HOME 与路径按本机环境替换即可;命令逻辑相同。

典型用法

经过上面的安装与重启后,按 README 中的顺序操作:

  1. 打开 Web GUI,进入 设置 → OpenTunnel。
  2. 打开 公网隧道开关;首次等待约 30 秒直至路由就绪。
  3. 用手机扫描页面上的 QR,或从终端输出、opentunnel-link.txt 复制 https://<host>/e/<code> 链接。
  4. 用毕关闭开关,公网路由随即拆除。

管理面 REST 路由(均需 header x-dsh-opentunnel,由 Host 注入)包括:GET /opentunnel/state、POST /opentunnel/enable、POST /opentunnel/disable、GET /opentunnel/link、GET /opentunnel/qr、POST /opentunnel/rotate。入口路由 GET /e/<código> 仅在隧道侧、经代理可达,成功时 302 到 /?token=<当前 token>。

访问审计写入 $DSH_HOME/opentunnel-access.log(可在设置页查看尾部;文件约 512 KB 自动轮转)。

主要配置项

以下默认值与含义来自 README 配置表(在插件配置或 profile 中覆盖,具体挂载方式以 DSH 与插件文档为准):

键 默认 作用摘要
enabled false 首次 boot 的初始状态;之后以设置页开关为准
rewrite true 是否启用 Host/Origin 改写代理;关则需 --trusted-host
entryTtlDays 7 入口码有效期
persist true 是否将开关与入口码写入 $DSH_HOME/opentunnel.json
printLink true 路由附着时是否在终端打印链接
accessLog true 是否记录 opentunnel-access.log

完整键表(含 routeName、profile、api、proxy、rewritePort、targetPort、panelPath、linkFile 等)见仓库 README 的「Configuração」一节。

适用场景与注意

适合谁:需要在不装手机专用 App、不配 VPN、不在家用路由器上开端口的前提下,偶尔用手机浏览器或远端 HTTPS 访问同一台机器上的 DSH Web GUI 的开发者。

安全(资料原文要点):

  • 无 token 且无有效入口码时,公网 URL 对请求返回 401。
  • 永久链接相当于长期凭据:持有者相当于获得本机 agent 上的代码执行面;应在 entryTtlDays 内视需要轮换,并使用 Novo link 立即作废旧码。
  • 入口码为 128 位,不出现在模型上下文中;QR 以 SVG 经认证页面 fetch 呈现,而非可被第三方记录的 <img src> 外链。
  • TLS 在本进程终止,私钥不离开本机。

限制:OpenTunnel 官方 CLI(Rust)在资料中仅提供 Linux 与 macOS 二进制;Windows 上该插件使用 TypeScript SDK(Node)。README 在「Limitações」之后内容在抓取稿中截断,细节以仓库最新说明为准。

生态说明:DSH 奉行「一切皆插件」;SkillHub 目录页 为社区收录站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-opentunnel 把「公网 HTTPS + 设置开关 + 稳定 /e/ 入口 + 环回代理」收成一套可复现流程,针对的是 DSH Web 默认只服务本机、且进程 token 易变的问题。若要查看分类与简介,可打开目录页;安装、配置与安全细节以 GitHub 为准。

  • 目录页:https://www.skillhub.cn/plugins/ikauann/dsh-opentunnel
  • GitHub:https://github.com/ikauann/dsh-opentunnel
羽毛球分组比赛记分
小程序二维码

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

Xiaoye