前言¶
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:
- DSH:
0.1.5-rc.2(next)或0.1.6-alpha.2+(alpha)。更旧的构建(例如 npm 仍标为latest的0.0.1-rc.1)没有本插件能注册的卡片槽位,启用时会以DSH_VERSION_UNSUPPORTED失败。 - Node:20 或更新(插件仅使用 Node 内置模块)。
tailscale模式:已安装并登录tailscaleCLI,tailnet 启用 HTTPS Certificates,且有权限配置tailscale serve(Linux 上通常需为 tailscale operator)。quick模式(实验性,面板未提供):需要cloudflared;在allowDownload为 true 时首次使用会下载到$DSH_HOME/cache/cloudflared,或通过cloudflaredPath指向已有二进制。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 下的只读插件清单。
典型用法¶
- 确认 DSH 与 Node 版本满足要求,Tailscale 已登录且具备 Serve 权限(若用默认
tailscale模式)。 - 安装并启用插件,在 Remote Access 卡片中按文档打开远程访问开关(默认
tailscale模式)。 - 在已加入同一 tailnet 的手机或另一台电脑上,用 MagicDNS 地址
https://<machine>.<tailnet>.ts.net打开浏览器访问;身份由 tailnet 提供,无需再给 DSH 配置--trusted-host或浏览器 harness token。 - 若仅需验证前门与密码登录路径、不对外发布,可选用
none模式做诊断。 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 安全章节再决定是否启用。