在一个网站下远程管理多台设备上的 DeepSeek Harness

我用 DeepSeek Harness(下面简称 dsh)有一阵子了。家里的台式机、公司的笔记本、一台 Mac mini、还有 NAS,都装了它。dsh 本身很好用,但它有一个很现实的问题:每台设备都是一座孤岛。

想在另一台机器上接着干活,要么走过去,要么远程桌面,要么 SSH 做端口转发。dsh 自带的 Web UI 默认只监听 127.0.0.1,本来就不是给公网访问设计的;就算自己做内网穿透,也是每台设备一个端口、一套地址、一份证书,还要自己解决鉴权问题。

我想要的其实很简单:一个网址,登录,看到我所有的设备,点一下就是那台机器上真实的 dsh。手机、平板、公司的电脑,打开浏览器就能用,不装任何 App。

于是我写了一个小项目:dshoo。这篇文章讲讲它是怎么工作的,以及我现在怎么用它。

现在是什么样

打开网站,先登录。没有客户端,没有安装包,浏览器就是全部。

登录页

登录后是所有实例的列表,按在线和离线分成两组,标题上直接写着数量。每张卡片显示这台机器的系统、dsh 版本和在线时长;离线的卡片会标出来,可以就地删除记录。

实例列表

点任意一张卡片,进入的就是那台机器上真实运行的 dsh——不是截图,不是精简版,是同一份工作区、同一份会话记录。你昨晚在家里没写完的东西,在公司打开就能接着写。

实例页面

画面右边那个小胶囊是 dshoo 加的:返回实例列表,以及当前的链路延迟(绿色 ≤120ms、黄色 ≤300ms、红色更慢)。它可以拖到任意角落,位置会记住,所有实例共用一个位置——截图里我把它拖到了右边,平时它默认待在左上角。

多台设备之间切换,就是回到列表再点另一张卡片;想同时看两台,开两个标签页就行,互不影响。

它是怎么工作的

结构很简单:

结构示意

  • dshoo 服务器:一台有公网的小机器(VPS、家里的 NAS 都行),Go + SQLite 写的单二进制,也可以用 Docker 跑。它负责登录、实例列表,以及把浏览器的请求转给对应的设备。
  • dsh 插件:装在每台设备上,跟着 dsh 一起启动。它主动向服务器建立一条 WebSocket 隧道,然后一直挂着。
  • 浏览器:访问服务器,服务器把请求拆成帧,顺着隧道送到设备;插件在本机把它还原成一次普通的 HTTP 或 WebSocket 请求,交给 127.0.0.1 上的 dsh,再把响应原路带回来。

这里有几个关键点:

  1. 设备不需要公网 IP,也不开放任何入站端口。 隧道是设备主动连出去的,和你在家里上网没有区别。所以 NAS、软路由、公司电脑这种没有公网地址、也不方便做端口映射的设备,反而最适合。
  2. 一条隧道跑所有请求。 HTTP、SSE、WebSocket 都多路复用在同一条连接上,所以打开的是完整的 dsh,不是被裁剪过的页面。
  3. 设备侧的 dsh 依然只听回环。 它不知道外面有人通过 dshoo 访问它,插件的本机请求和本机浏览器打开时走的是同一套鉴权。

部署

服务端用 Docker 最省事:

1
2
3
4
5
6
7
8
9
10
11
services:
dshoo:
image: ghcr.io/imaegoo/dshoo:latest
container_name: dshoo
restart: unless-stopped
ports:
- "127.0.0.1:9830:9830"
volumes:
- ./data:/data
environment:
DSHOO_PUBLIC_URL: https://dsh.example.com

然后用 Caddy 或者 Nginx 套一层 HTTPS。Caddy 只要两行:

1
2
3
dsh.example.com {
reverse_proxy 127.0.0.1:9830
}

首次访问会让你创建账号和密码,之后每次都要登录。没有默认密码,也没有环境变量种子账号——数据库是空的,第一个访问的人来设置。

设备侧,在 dsh 里装插件:

  • 桌面版:左侧「插件 → 添加插件」,输入 dshoo,安装后点「立即启用」。
  • 命令行:dsh plugin --profile web add dshoo(桌面版把 web 换成 desktop)。

装好后打开「设置 → 远程访问」,填服务器地址、用户名、密码,点「连接」:

插件设置

连上以后,这台设备就出现在服务器的列表里了。只要 dsh 在运行,断线后它会自己重连;只有你手动点「断开连接」,它才会停下来。

日常怎么用

我现在有四台设备挂着 dsh:

  • 家里的台式机,4090,支持远程开关机,跑一些重活;
  • 公司的笔记本;
  • Mac mini,做下载和定时任务;
  • NAS 上跑一个 dsh,专门整理照片和文档。

以前要在它们之间切换,得挨个远程桌面或者 SSH。现在就是:

  • 在公司,浏览器打开 dsh.example.com,点列表里的 studio(家里的台式机),接着昨晚的会话继续;
  • 在外面用手机,5G 直接开,点 NAS,让它把新照片归档;
  • 临时要跑个只在那台机器上能跑的命令,点进去就是完整的 dsh,该有的功能一个不少。

因为入口就是一个普通网页,不用下载任何 App,也不挑设备:Windows、macOS、Linux、iPad、Android 手机,甚至借别人的电脑,登录一下就能用自己所有的实例。这是我最满意的一点——以前出差要带一台装好各种客户端的笔记本,现在什么都不用带。

把 dsh 挂到 NAS、软路由上

dsh 的 Web 模式是可以无头运行的:

1
dsh --profile web --no-open

它只启动一个 HTTP 服务,不会弹窗口,很适合常驻。所以只要那台机器能跑 Node 22(或者你愿意用容器),NAS、软路由、树莓派这类常年开机的设备,都可以挂一台 dsh 上去:

  • NAS:群晖、威联通、极空间,能用 Docker 的都可以;让它整理下载目录、做定时备份、盯着某个文件夹,比在电脑上开着更靠谱。
  • 软路由:iStoreOS 这类能跑 Docker 的,装一个轻量的 Linux 容器就行。性能不强,但跑 dsh 的 Web 服务和一两个小任务足够了。
  • 家里的服务器 / 小主机:更不用说了,本来就是干这个的。

这些设备通常没有公网 IP,也不适合做端口映射,但它们都能出网——这正是 dshoo 的设计前提。设备侧只要装插件、填服务器地址,剩下的都不用管。

配合 systemd 或者 Docker 的 restart: unless-stopped,机器重启后 dsh 和插件会自己回来,服务器那边的实例列表最多显示几十秒离线,然后恢复在线。

安全边界

这一点必须说清楚:dshoo 的服务端账号,等于这些设备的最高权限。dsh 能在本机执行命令,能读写文件,所以谁能登录你的 dshoo,谁就能操作你所有的实例。

因此:

  • 服务端一定要放在 HTTPS 后面,不要裸奔在公网;
  • 用强密码,别用默认账号;
  • 设备侧不开放任何端口,隧道是设备主动连出去的,减少被扫的风险;
  • 实例之间按账号隔离,浏览器和实例的 cookie 也是分开的,插件自己保管本机 dsh 的凭据,不会把本机的登录态传给浏览器;
  • 如果只是自己用,服务器可以只监听内网,通过 Tailscale 之类的组网访问,连公网都不用暴露。

最后

项目是开源的,MIT 协议:

从「每台机器一个地址」到「一个网站管所有设备」,对我来说最大的变化不是省了多少步骤,而是不再需要提前规划:新机器装个插件就接进来了,旧机器坏了就从列表里删掉,人在哪里、用什么设备,都不影响我打开昨晚的那台机器继续干活。

如果你也在多台设备上用 dsh,可以试试。

在一个网站下远程管理多台设备上的 DeepSeek Harness

https://www.imaegoo.com/2026/remote-manage-deepseek-harness/

作者

iMaeGoo

发布于

2026-10-24

更新于

2026-10-24

许可协议

CC BY 4.0

评论