dsh-tailscale-access:在 Tailscale 或 cloudflared 下远程打开 DSH Web GUI

前言

DeepSeek Harness(DSH)的 Web GUI 默认只监听本机回环地址。你在办公室或外出时,想用手机或另一台电脑打开同一台机器上的 Harness 界面,常见做法是公网 IP、端口转发,或让 DSH 改绑网卡——而 Harness 本身刻意拒绝对外绑定,只留在 127.0.0.1。下面介绍社区插件 dsh-tailscale-access:在不改 DSH 监听地址的前提下,通过 Tailscale Serve 或(实验性的)cloudflared 快速隧道,把浏览器入口接到本机上的 Web GUI。

这是什么

dsh-tailscale-access 是维护者 why-did 发布的 DSH 插件,npm 包名与安装名均为 dsh-tailscale-access;插件设置区、HTTP 路由与状态文件仍使用 remote-access 命名。分类上属于联网工具:解决「无公网 IP、无端口转发、DSH 仍只监听 127.0.0.1:3080」场景下的远程访问。

当前版本为 0.1.x(package.json 标注 0.1.0),README 明确说明处于早期阶段:有自动化测试且作者在自用机器上日常使用,但接口、默认值与行为仍可能在版本间变化,且尚未针对 hostile 网络或多用户共享主机做硬化。启用前建议花两分钟阅读仓库中的安全说明与 IMPORTANT 提示。

工作原理(概要)

请求路径在 README 中概括为:

phone / another computer
   │  tailscale serve(tailnet 内,端到端加密)
   │  或 cloudflared quick tunnel(公网 HTTPS)
   ▼
local rewriting front door  127.0.0.1:8787
   │  Host → 127.0.0.1:3080;丢弃 Origin/Referer/Sec-Fetch-Site;
   │  注入 harness 自有的 browser cookie
   ▼
dsh web  127.0.0.1:3080(对外部访问无感知)

前门默认监听 127.0.0.1:8787,DSH 始终在 127.0.0.1:3080;插件做的是本机反代与隧道编排,而不是让 Harness 直接对外监听。

环境与依赖

安装前请核对 README 与 package.json 中的 engines:

  1. DSH:0.1.5-rc.2(next)或 0.1.6-alpha.2+(alpha)。更旧的构建(例如 npm 仍标为 latest 的 0.0.1-rc.1)没有本插件能注册的卡片槽位,启用时会以 DSH_VERSION_UNSUPPORTED 失败。
  2. Node:20 或更新(插件仅使用 Node 内置模块)。
  3. tailscale 模式:已安装并登录 tailscale CLI,tailnet 启用 HTTPS Certificates,且有权限配置 tailscale serve(Linux 上通常需为 tailscale operator)。
  4. quick 模式(实验性,面板未提供):需要 cloudflared;在 allowDownload 为 true 时首次使用会下载到 $DSH_HOME/cache/cloudflared,或通过 cloudflaredPath 指向已有二进制。
  5. none 模式:无额外依赖,仅用于诊断前门与登录路径,本身不对外发布。

核心功能

三种模式(同一时刻只运行一种)

模式 入口 认证 说明
tailscale(默认) tailscale serve --https=443 指向前门 tailnet 身份(Tailscale-User-Login + 允许列表) 稳定 URL:https://<machine>.<tailnet>.ts.net,端到端加密,无密码
quick(实验性) cloudflared quick tunnel 密码(可选源 CIDR 允许列表) 仍在测试中且未在面板提供;需在设置里写 mode: quick。公网 HTTPS,每次启动 URL 会变,需显式风险确认
none 仅 loopback 前门,无隧道 密码 诊断用;不自行对外发布

切换模式会先拆除旧入口再建立新入口。Tailscale Funnel 与 tagged 节点不带身份头,会被拒绝。

安全模型(启用前必读)

插件提供的是 DSH 本身拒绝的「对外入口」:默认关闭,而后台 GUI 可执行命令。README 强调应像对待 SSH 端口一样对待该入口——尽量留在 tailnet 内,并理解 trade-off。

要点包括:

  • tailscale 模式:仅信任来自 loopback(tailscaled 代理)且启用 proxy headers 时的 Tailscale-User-Login;客户端伪造的 Tailscale-User-* 会被忽略;无身份头返回 403。
  • 允许列表 fail-closed:空的 allowedUsers 表示「仅本节点自己的 login」(启用时从 tailscale status --json 解析),无法解析则拒绝启用;不存在「空即全员」的语义。
  • quick / none:密码至少 8 字符;quick 还需 acknowledgeRisk: true。会话为 HMAC 签名 cookie,默认 sessionHours 为 72;登录失败按 IP 限流。
  • 前门仅绑定 127.0.0.1;关闭开关会 tailscale serve reset、关前门、清会话,不遗留监听。
  • 能访问 GUI 的人可批准 tool call,即可能授权命令执行;允许列表或密码即访问边界。

完整条目以 GitHub README 为准(资料截断处之后的内容请直接在仓库阅读)。

安装与启用

从 Plugins 页安装(推荐)

在 DSH 0.1.6-alpha.2+ 中,侧栏打开 Plugins,选择 Add plugin,输入包名并安装:

dsh-tailscale-access

勾选 Enable now 会同时写入 profile 依赖与 dsh.profile.bundles 条目。

手动安装

在 Web profile 目录(默认 ~/.dsh/profiles/web)安装依赖:

cd ~/.dsh/profiles/web
pnpm add dsh-tailscale-access

在 profile 的 package.json 中把包名加入 dsh.profile.bundles,并保留依赖,例如:

// ~/.dsh/profiles/web/package.json
{
  "dependencies": {
    "dsh-tailscale-access": "^0.1.0"
  },
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-tailscale-access"
      ]
    }
  }
}

若 profile 配置了 "patchReload": "live",改 manifest 后会自动重组;否则需重启 dsh web。在 profile 目录外也可使用 dsh plugin --profile web add dsh-tailscale-access,效果与上述 pnpm 步骤相同。

打开配置卡片

侧栏 Plugins → Remote Access(Official 分组)。这是配置页,不是 Settings → Plugins 下的只读插件清单。

典型用法

  1. 确认 DSH 与 Node 版本满足要求,Tailscale 已登录且具备 Serve 权限(若用默认 tailscale 模式)。
  2. 安装并启用插件,在 Remote Access 卡片中按文档打开远程访问开关(默认 tailscale 模式)。
  3. 在已加入同一 tailnet 的手机或另一台电脑上,用 MagicDNS 地址 https://<machine>.<tailnet>.ts.net 打开浏览器访问;身份由 tailnet 提供,无需再给 DSH 配置 --trusted-host 或浏览器 harness token。
  4. 若仅需验证前门与密码登录路径、不对外发布,可选用 none 模式做诊断。
  5. quick 模式:README 写明实验性且面板未提供;若自行在设置区配置 mode: quick,须设置密码、acknowledgeRisk: true,并理解公网临时 URL 与额外风险。

适用场景与注意

适合谁:已在用 DSH Web、希望在不改 Harness 回环绑定的前提下,从 tailnet 内设备(或明确接受实验性公网隧道方案时)访问 GUI 的开发者或自用部署者。

务必注意:

  • 插件以当前 dsh 进程权限 运行;安装与启用前应阅读 源码与 LICENSE(MIT),自行评估是否接受「远程 GUI ≈ 远程命令审批面」的风险。
  • 0.1.x 早期软件,接口与行为可能变更;有问题可在 GitHub Issues 反馈。
  • 社区目录 SkillHub 插件页 与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本文事实以仓库 README 与 package 声明为准。

结尾

dsh-tailscale-access 用一把开关把 DSH Web GUI 接到 Tailscale Serve(或可选的 cloudflared 快速隧道)之后,前门仍只在本机回环上改写 Host 与 Cookie,Harness 继续监听 127.0.0.1:3080。若你的痛点是「无公网、不想动 DSH 绑定、又要在 tailnet 里用手机开 GUI」,可先读 README 安全章节再决定是否启用。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye