在一个网站下远程管理多台设备上的 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,再把响应原路带回来。
这里有几个关键点:
- 设备不需要公网 IP,也不开放任何入站端口。 隧道是设备主动连出去的,和你在家里上网没有区别。所以 NAS、软路由、公司电脑这种没有公网地址、也不方便做端口映射的设备,反而最适合。
- 一条隧道跑所有请求。 HTTP、SSE、WebSocket 都多路复用在同一条连接上,所以打开的是完整的 dsh,不是被裁剪过的页面。
- 设备侧的 dsh 依然只听回环。 它不知道外面有人通过 dshoo 访问它,插件的本机请求和本机浏览器打开时走的是同一套鉴权。
部署
服务端用 Docker 最省事:
1 | services: |
然后用 Caddy 或者 Nginx 套一层 HTTPS。Caddy 只要两行:
1 | dsh.example.com { |
首次访问会让你创建账号和密码,之后每次都要登录。没有默认密码,也没有环境变量种子账号——数据库是空的,第一个访问的人来设置。
设备侧,在 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 协议:
- GitHub:https://github.com/imaegoo/dshoo
- 镜像:
ghcr.io/imaegoo/dshoo:latest - 插件:
dsh plugin --profile web add dshoo
从「每台机器一个地址」到「一个网站管所有设备」,对我来说最大的变化不是省了多少步骤,而是不再需要提前规划:新机器装个插件就接进来了,旧机器坏了就从列表里删掉,人在哪里、用什么设备,都不影响我打开昨晚的那台机器继续干活。
如果你也在多台设备上用 dsh,可以试试。
在一个网站下远程管理多台设备上的 DeepSeek Harness
https://www.imaegoo.com/2026/remote-manage-deepseek-harness/


