把电脑上的 DSH 带到手机:局域网访问与 Pangolin 公网入口
电脑上的 Agent 还在处理任务,人却不一定一直坐在电脑前。我希望在手机上查看哪些任务完成了、哪些问题等我回复,必要时补一句要求,回到电脑后继续同一份工作。
我用的是自己的 DeepSeek Harness 仓库。手机直接打开 DSH Web,不需要另外安装原生 App,也不需要在手机上再启动一份 Agent:工作区、文件和任务仍然留在运行 DSH 的电脑上。
本文介绍两条访问路径:同一可信局域网内,用局域网地址访问;离开家以后,用 Pangolin 提供受认证保护的 HTTPS 入口。 Pangolin 的安装、Compose、证书和服务端维护已经写在我的 docker-deploy/pangolin 部署目录,这里不再复制整套部署文件,只列连接 DSH 必须配置的参数。
本文以撰写时仓库中的启动脚本和 Web 参数实现为准。DSH 是能够操作本机文件、执行命令的 Agent 工作界面,不是只读看板。把入口交给某个人,意味着允许对方在该实例的权限范围内操作 Agent,不能当成普通网页随意公开。
手机端适合做什么
我的使用方式不是在手机上替代完整 IDE,而是把手机作为电脑任务的补充入口:
- 查看总览:离开电脑后,确认任务状态和工作区分布。
- 处理待回复事项:Agent 需要补充信息时,在手机上继续对话。
- 查看完成结果和待办:先读结论,复杂代码审查留到电脑处理。
- 进入已有工作区:继续电脑上的会话,不在手机上复制代码仓库。
下面是这套仓库的手机浏览器界面。截图中的域名属于我的部署,后文统一使用 dsh.example.com 作为配置示例,不是公共试用地址。
先选访问方式
| 场景 | 建议方案 | 手机打开什么 | 主要限制 |
|---|---|---|---|
| 家中同一可信 Wi-Fi,临时查看任务 | 局域网转发 | http://电脑LAN-IP:3081 | 不提供 HTTPS 或用户认证,必须限制访问来源 |
| 手机使用蜂窝网络,电脑在家中或办公室 | Pangolin + Newt | https://dsh.example.com | 需要公网入口、域名、认证和在线的电脑 |
| 公共 Wi-Fi、访客网络、多人共享网络 | 不使用本文的无认证 LAN 示例 | 使用受保护的 HTTPS 入口 | 同一 Wi-Fi 不等于可信网络 |
| 电脑关机、休眠或断网 | 两种方案都不适用 | 无可用入口 | 隧道不能让离线电脑继续提供服务 |
本文的两条链路分别是:
局域网:手机浏览器 → 电脑 LAN IP:3081 → 本机 TCP 转发 → DSH 127.0.0.1:3080
公网:手机浏览器 → HTTPS / Pangolin 资源认证 → VPS 上的 Traefik → Gerbil / WireGuard 隧道 → 电脑上的 Newt → DSH 127.0.0.1:3080局域网方案不经过 VPS,也不需要 Pangolin。公网方案不需要在家里的路由器上把 3080 转发到互联网。Newt 是 Pangolin 的站点连接器,名称是 Newt,不是 netw。
先在电脑上启动 DSH
准备仓库和构建产物
首次使用时,在准备运行 Agent 的电脑上执行:
git clone https://github.com/lens077/deepseek-harness.gitcd deepseek-harnesspnpm installpnpm run build撰写时,根目录要求 Node.js ^22.19.0 || >=24.0.0,声明的包管理器是 pnpm@12.0.0。后续以仓库 package.json 为准。模型服务和凭据按仓库 README配置;先在电脑上确认能够完成一次对话,再增加手机入口。API Key 不要写进公开命令、截图或 Git。
pnpm dev 到底启动什么
当前根目录的脚本是:
{ "scripts": { "dev": "pnpm dsh web --no-open --no-browser-auth" }}因此这里的 pnpm dev 不是单独启动 Vite,而是启动完整的 DSH Web。默认组合使用 127.0.0.1:3080。它需要已有的包和前端构建产物;修改源码后,不能假定这条命令会自动重建所有内容。
| 参数 | 作用 | 不会做什么 |
|---|---|---|
--no-open | 不自动打开电脑上的默认浏览器 | 不改变监听地址和访问权限 |
--no-browser-auth | 关闭 DSH 的 launch-token / cookie 浏览器认证 | 不提供替代认证,也不自动关闭 Host 信任检查 |
--port 3080 | 明确 Web 监听端口 | 不自动放行防火墙 |
--trusted-host dsh.example.com | 增加浏览器信任检查接受的 authority | 不是密码、用户授权或防火墙白名单 |
注意:pnpm dev 已经关闭 DSH 浏览器认证。 公网部署必须由 Pangolin 等外层认证保护全部入口;局域网临时使用则必须自行限制可连接设备。不要把「没有弹出登录页」理解成「已经安全登录」。
可以先用以下命令确认本地版本支持的参数,不会启动另一份 Web 服务:
pnpm dsh web --help不要照搬 Vite 的 --host 0.0.0.0
当前仓库的 Web CLI 明确拒绝 --host 0.0.0.0。同时,底层 WebServer 的配置只接受 loopback 和 all-interfaces 两个固定值,不能把 --host 192.168.1.10 当作可用替代。
因此,pnpm dev -- --host 0.0.0.0、HOST=0.0.0.0 pnpm dev、直接启动一个 Vite 端口,都不是本文仓库已核实的手机访问方法。DSH Web 还需要服务端注入启动信息,只打开一个前端开发页面并不等于打开完整 DSH。
下面保留 DSH 的本机监听,通过显式的外部转发接入。局域网转发仍然扩大了访问范围,并不会因为多了一层转发就更安全。
方案一:同一可信局域网内临时访问
这个方案适合家中自用网络、临时测试手机布局或查看任务。它不要求 VPS,但下面的 HTTP 转发不加密、不认证。开始前,应确认网络可信,并在主机防火墙中仅允许自己的手机 IP 访问 TCP 3081;不要在公司共享 Wi-Fi、酒店或访客网络上直接照做。
1. 获取电脑的 LAN IP
macOS 常见 Wi-Fi 接口是 en0:
ipconfig getifaddr en0如果没有输出,先查看实际使用的网络接口,不要假定所有机器都用 en0。Linux 可以通过 ip -br addr 查看,Windows 可以通过 ipconfig 查看。
假设电脑的 LAN IP 是 192.168.1.10,手机将访问:
http://192.168.1.10:3081192.168.1.10 必须换成自己的电脑地址。手机上的 localhost 指向手机,不是电脑。
2. 启动 DSH,并信任手机使用的地址
如果已有 DSH 占用 3080,先在原启动终端正常停止它,再使用下面的命令替换启动;不要同时启动两份争用端口。
pnpm dsh web --no-open --no-browser-auth \ --port 3080 \ --trusted-host 192.168.1.10:3081这里 DSH 仍监听 127.0.0.1:3080。--trusted-host 填手机实际访问的 LAN 地址和转发端口 3081,不是内部端口 3080。它解决 Host 信任检查,不验证访问者身份。
3. 仅在指定 LAN 地址上开放转发
下面以 macOS / Linux 的 socat 为例。macOS 使用 Homebrew 安装:
brew install socat在另一个终端启动转发:
socat TCP4-LISTEN:3081,bind=192.168.1.10,reuseaddr,fork TCP4:127.0.0.1:3080它把电脑 192.168.1.10:3081 收到的 TCP 流量转给本机 DSH,不改 HTTP 路径,也不改请求的 Host。这里没有使用 0.0.0.0,避免顺带监听其他网卡;但绑定 LAN IP 仍不等于限制了访问者,手机 IP 白名单需要由防火墙实施。
在 Mac 上检查两个监听:
lsof -nP -iTCP:3080 -sTCP:LISTENlsof -nP -iTCP:3081 -sTCP:LISTEN预期 DSH 在 127.0.0.1:3080,socat 在指定 LAN IP 的 3081。随后用手机浏览器打开 http://192.168.1.10:3081。
这个 TCP 转发方式按当前监听和信任参数实现推导,具体设备、防火墙和手机浏览器仍需按下一节验收;不要把它当成仓库内置的一键 LAN 功能。
4. 验证并收回入口
先确认手机能进入工作区、读取已有会话,再发一条无副作用的测试消息,例如「只回复收到,不执行工具」。仅首页能打开不代表 API 和实时连接都正常。
测试完成后,在 socat 终端按 Ctrl+C 停止转发,并确认 3081 已不再监听。撤销临时防火墙规则。若不再需要关闭 DSH 的浏览器认证,可停止 DSH,改用 pnpm dsh web --no-open 恢复默认认证。
换 Wi-Fi 或 DHCP 地址变化后,需要重新获取 LAN IP,同时更新转发的 bind、DSH 的 --trusted-host 和手机书签。需要经常访问时,可以在路由器上配置 DHCP 地址保留。
方案二:通过 Pangolin 在外网访问
这个方案适合通勤、出差或手机使用蜂窝网络时继续电脑上的任务。我更倾向于把它作为长期入口:固定域名、HTTPS、统一认证,不用让手机记住电脑的局域网 IP。
1. 按仓库完成基础部署
安装步骤、Compose、域名、证书、端口和升级注意事项统一参考:
lens077/docker-deploy → pangolin
接入 DSH 前,需要已经具备:
- 可用的 Pangolin 管理地址,例如
https://pangolin.example.com。 - 指向公网 VPS 的资源域名,例如
dsh.example.com,以及覆盖该域名的可信证书。 - 运行 DSH 的电脑上安装原生 Newt,并创建对应的 Newt Site。
- VPS 和电脑所在网络允许部署文档要求的控制连接与隧道流量。
公网 VPS 不需要开放 3080 或 3081,家用路由器也不需要新增 DSH 端口映射。本文发布 HTTP 资源,不使用 raw TCP 资源。
2. 在 DSH 电脑上运行 Newt
从 Pangolin 的站点页面获取 ID 和 Secret,在 DSH 所在电脑上执行:
newt \ --endpoint https://pangolin.example.com \ --id YOUR_NEWT_ID \ --secret YOUR_NEWT_SECRET| 参数 | 应填写的内容 |
|---|---|
--endpoint | Pangolin 管理地址,不是 DSH 资源域名 |
--id | 站点页面提供的 Newt ID,不是站点显示名称 |
--secret | 对应站点的 Newt Secret,不是管理员密码或服务端 server.secret |
示例中的凭据都是占位符。真实 Secret 可能留在 shell 历史和进程参数中,不要提交或分享;长期运行按部署说明管理进程和凭据。同一组站点凭据不要重复启动多个连接器。
3. 启动 DSH,保留 loopback 监听
先确定将为资源启用 Pangolin 认证,再使用关闭 DSH 浏览器认证的命令。 不要在没有替代认证时把入口发布到公网。
在仓库根目录执行:
pnpm dsh web --no-open --no-browser-auth \ --host 127.0.0.1 \ --port 3080 \ --trusted-host dsh.example.com如果使用当前仓库已有的 dev 脚本,等价的简写是:
pnpm dev --trusted-host dsh.example.com两条命令二选一。若自己的组合改过默认监听地址或端口,优先使用完整命令明确指定。使用非标准外部端口时,--trusted-host 应包含实际端口;不要加 https://、路径或结尾斜杠。
4. 配置 Pangolin Resource
在 Pangolin 的 Resources 中创建 DSH 的 HTTP 资源,按以下内容填写:
| 字段 | 示例值或要求 |
|---|---|
| 资源名称 | dsh |
| 根域 / 子域名 | example.com / dsh |
| 类型 | HTTP 资源 |
| Site | DSH 电脑对应的 Newt 站点 |
| Target 协议 | HTTP |
| Target 地址 | 127.0.0.1 |
| Target 端口 | 3080 |
| Target 状态 | 启用 |
| 认证 | 启用 Pangolin 资源认证 / SSO |
| 授权 | 只允许自己的账号或明确授权的用户、角色 |
这里的 127.0.0.1 成立的前提是:Newt 原生运行在 DSH 所在电脑上。 如果 Newt 在 Docker 容器中,loopback 指向容器,不是 Mac;如果选择 VPS 的 local site,loopback 也不指向家里的电脑。不要混用这些场景。
0.0.0.0 是监听地址,不应填写为 Target。外部访问 HTTPS、内部目标 HTTP 并不矛盾:公网 TLS 在 Traefik 终结,跨网络部分通过加密隧道,Newt 最后连接电脑的回环地址。
建议给 DSH 独立子域名,按原路径代理整个站点,不只代理 / 页面。API、插件资源、上传和实时连接都需要到达同一个 DSH 实例,也都应受到外层访问控制。本文不配置子路径挂载。
5. 用蜂窝网络验收
关闭手机 Wi-Fi,使用蜂窝网络打开:
https://dsh.example.com按顺序检查:
- 在未登录的无痕窗口中访问,应该先受到 Pangolin 认证保护,不能直接操作 DSH。
- 用授权账号登录,确认进入的是正确的 DSH 工作区。
- 打开会话,发送无副作用消息,确认响应能够实时更新。
- 刷新页面,确认会话仍然可见;短暂切换应用后,检查连接能否恢复。
- 检查未授权账号不能访问,并确认没有另一条无认证的 LAN 转发或路由器端口映射绕过 Pangolin。
不同版本的认证插件可能对浏览器返回跳转,对 curl 返回 401。这不一定是隧道故障,不要为了让探测返回 200 就关闭 SSO。
如果仍保留上一节的无认证 LAN 转发,同网段设备可以绕过公网认证直接访问 DSH。改为长期使用 Pangolin 时,应停止不再需要的转发。
出问题时,按链路逐层检查
| 现象 | 先检查什么 |
|---|---|
| 电脑本机也打不开 | DSH 是否启动成功、端口是否占用、构建产物是否存在 |
| 手机 LAN 访问超时 | LAN IP、转发监听、防火墙、访客网络和 AP 隔离 |
| 首页能开,会话连接失败 | 手机实际 authority 是否在 --trusted-host 中,代理是否完整转发 API 和实时连接 |
| Pangolin 域名打不开 | DNS、证书、VPS 入口和安全组 |
| Newt 站点不在线 | Endpoint、ID、Secret、Newt 日志和隧道出站网络 |
| 站点在线但返回 502 | DSH 是否运行、Target 的 Site / 协议 / 地址 / 端口是否正确 |
| 未登录返回 401 或认证跳转 | 先判断是否是正常的资源认证,不直接关 SSO |
| 页面出现但流式响应中断 | 检查实时连接、代理超时、压缩或缓冲配置,不能只验证首页 |
| 合盖、注销或过一段时间后断开 | 电脑是否休眠,DSH 和 Newt 是否仍在运行 |
本机检查可以从这里开始:
curl -I http://127.0.0.1:3080/lsof -nP -iTCP:3080 -sTCP:LISTEN首页响应只能证明 HTTP 服务可达,不能证明模型调用、API 认证和完整会话链路都正常。不要用重新部署 Pangolin 代替本机检查,也不要用关闭全部防火墙作为排错第一步。
最后怎么选
如果只是坐在家里的沙发上看一眼任务,可信局域网里的临时转发就够用,用完关闭。如果希望离开家以后仍能使用,选择 DSH 本机监听 + Newt 出站隧道 + Pangolin HTTPS 和资源认证。
手机只是入口,任务仍在电脑上运行。电脑必须保持联网且不休眠,DSH 和 Newt 的进程管理也要分别处理。Pangolin 的登录墙不是 DSH 多租户隔离;不要把一个持有本机文件和凭据的个人实例开放给不可信用户,也不要因为从手机访问就放宽 Agent 的工具权限和审批策略。
对我而言,这套方式最有用的地方,是不用把工作搬到手机:电脑继续执行,手机负责查看、回复和跟进。
仓库与配置依据
- 我的 DSH 仓库:代码、模型配置和使用说明。
- DSH 根目录 package.json:
dev脚本、Node.js 和 pnpm 要求。 - Web 启动参数实现:
--no-browser-auth、--trusted-host和 wildcard host 限制。 - Web 组合配置:默认监听地址、端口和认证参数传递。
- Pangolin 部署目录:安装、Compose、证书、站点接入、资源权限与维护。