Windows 端部署说明
把家里这台 Windows 上的 DeepSeek Harness,通过 SSH 反向隧道接到服务器,让你在任何地方用浏览器打开它,并让 agent 直接操作本机的文件和软件。
这是什么
整个链路是这样走的,全部由 PC 主动连出,家里不需要公网 IP,路由器不用做端口映射:
PC 上只做两件事:跑一个 dsh web,再跑一条 ssh -R 把本地端口送到服务器。浏览器访问的是服务器,看到的是本机的 dsh。
DeepSeek Harness 是「Host 监听 / Peer 连入」的模型,没有让一个节点主动连回另一个节点的能力。所以「PC 连回服务器」这一层只能由隧道承担,这也是本项目存在的唯一理由。
本次部署目标
这台 Windows 要接入的服务器,参数如下(脚本已经按这些值配好,直接照抄即可):
这个页面部署在公网,所以登录墙密码不写进来。它在服务器端执行 install.sh 时只打印过一次,如果你已经丢了,去服务器上重跑一次安装、在 config.env 里显式设置 AUTH_PASS 即可重置。
前置检查
在 Windows 上打开 PowerShell(开始菜单搜 PowerShell,右键选「以管理员身份运行」),逐条确认:
1. Node.js 22 LTS
node --version
要求 v20 以上,推荐 v22。没装就执行:
winget install OpenJS.NodeJS.LTS
装完必须关掉这个窗口重新开一个,否则 PATH 还是旧的。
2. OpenSSH 客户端
ssh -V
没输出就去「设置 → 应用 → 可选功能 → 添加功能」,找到 OpenSSH 客户端 安装。
3. 能连到服务器
Test-NetConnection www.lukezystudio.cn -Port 22
TcpTestSucceeded 必须是 True。如果是 False,先解决网络或防火墙,后面的步骤都会卡在这里。
第一步:准备文件
把仓库里的 windows 目录拷到本机,建议固定放在 C:\dsh-win-tunnel:
# 方式一:有 git
git clone https://github.com/MrLukezy/dsh-win-tunnel.git C:\dsh-win-src
New-Item -ItemType Directory -Force C:\dsh-win-tunnel | Out-Null
Copy-Item C:\dsh-win-src\windows\* C:\dsh-win-tunnel\ -Recurse -Force
# 方式二:没有 git,直接浏览器下载 zip 后手动解压
# 把 windows 目录里的文件放进 C:\dsh-win-tunnel
目录里应该有这些文件:
setup.ps1—— 一键配置check.ps1—— 链路体检uninstall.ps1—— 卸载config.example.json—— 配置样例(不用手改)
第二步:一键配置
在 C:\dsh-win-tunnel 目录里执行。建议用管理员权限的 PowerShell,否则计划任务可能注册失败:
cd C:\dsh-win-tunnel
powershell -ExecutionPolicy Bypass -File setup.ps1 `
-ServerHost www.lukezystudio.cn `
-ServerUser ubuntu `
-TunnelPort 13081 `
-PublicUrl https://www.lukezystudio.cn:8443
脚本会依次做这些事,中途只需要你输一次服务器密码:
| 阶段 | 动作 | 你要做什么 |
|---|---|---|
| 环境检查 | 确认 Node / dsh / OpenSSH | 无,缺 dsh 会自动 npm i -g |
| 生成密钥 | 在 ~/.ssh/id_ed25519 生成 SSH 密钥 | 无,已有则复用 |
| 部署公钥 | 把公钥追加到服务器 authorized_keys | 输一次服务器登录密码 |
| 写配置 | 生成 config.json 与两个启动脚本 | 无 |
| 注册自启 | 两个登录后自动启动的计划任务 | 无 |
| 启动并取 token | 拉起 dsh 与隧道,从日志抓首次登录地址 | 无,等几分钟 |
dsh web 第一次运行要创建 profile 并安装插件,几分钟属正常。脚本最多等 300 秒,期间窗口最小化是正常的,不要关它。
成功时最后会打印一条这样的地址,立刻复制下来:
https://www.lukezystudio.cn:8443/?token=aBcD1234...
第三步:首次登录
- 浏览器打开上一步那条带
?token=的完整地址 - 先弹出一个 HTTP 认证框,输入登录墙账号
dsh和那个密码 - 页面加载后,浏览器已经种下 cookie,以后直接访问
https://www.lukezystudio.cn:8443即可
这条链路复用服务器上 www.lukezystudio.cn 的 Let's Encrypt 证书,浏览器不应该出现「连接不是私密连接」。如果你看到了证书警告,说明你访问的是 IP 而不是域名,检查地址栏。
已经种过 cookie 的浏览器不受影响。换浏览器、清 cookie、或者换设备时,需要重新从日志里取一次 token。
验证链路
任何时候怀疑出问题,先跑体检。它会逐段告诉你断在哪:
cd C:\dsh-win-tunnel
powershell -ExecutionPolicy Bypass -File check.ps1
输出会按顺序检查四段:
| 检查项 | 正常表现 | 失败含义 |
|---|---|---|
| 本机 dsh 端口 | [PASS] 127.0.0.1:13080 可连接 | dsh web 没在跑 |
| dsh 进程 | 发现 1 个以上 node 进程 | 进程崩了 |
| 隧道进程 | 发现 ssh.exe 且带 -R 13081 | 隧道没起来 |
| 公网入口 | 返回 401(登录墙正常) | 502 = 隧道断了 |
日常操作
开机自启
脚本注册了两个计划任务,登录后 20 秒自动启动:
DshWinTunnel-DshWebDshWinTunnel-Tunnel
schtasks /Query /TN DshWinTunnel-DshWeb /V /FO LIST
schtasks /Query /TN DshWinTunnel-Tunnel /V /FO LIST
隧道脚本内部是死循环,断开后 5 秒自动重连,所以 PC 断网恢复后不需要人工干预。
改配置
重新执行一遍 setup.ps1 并传入新参数即可,它会覆盖 config.json 与两个 bat、并重建计划任务。
卸载
cd C:\dsh-win-tunnel
powershell -ExecutionPolicy Bypass -File uninstall.ps1 -PurgeFiles
会删除计划任务、结束进程、清理生成的配置与日志。不会动你的 SSH 密钥和已安装的 dsh。
常见问题
浏览器打开是 502 Bad Gateway
nginx 活着,但连不上隧道的落点。先看 PC 上隧道进程在不在:
Get-CimInstance Win32_Process -Filter "Name='ssh.exe'" | Select-Object ProcessId, CommandLine没有就双击 run-tunnel.bat。再看 logs\tunnel.log 的最后几行,常见报错对照:
Permission denied (publickey)→ 公钥没部署上,重跑 setup.ps1remote port forwarding failed→ 服务器上 13081 被占用Connection refused→ SSH 端口不对Operation timed out→ 网络不通或域名解析错
能登录,但页面白屏、接口全 401
原因是 DSH 的浏览器信任校验(Host 与 Origin 必须同源)。检查 PC 上启动参数里有没有 --trusted-host:
Get-Content C:\dsh-win-tunnel\run-dsh.bat | Select-String "trusted-host"应该能看到 --trusted-host www.lukezystudio.cn:8443。少了就重跑 setup.ps1。
看不到第一次的 token 了
Select-String -Path C:\dsh-win-tunnel\logs\dsh-web.log -Pattern "token=" | Select-Object -Last 3拿到后拼成 https://www.lukezystudio.cn:8443/?token=那串字符 打开一次。
重启电脑后连不上
计划任务默认在用户登录后触发。如果 PC 重启后停在登录界面没人登,就不会启动。确认方式:
schtasks /Query /TN DshWinTunnel-Tunnel /V /FO LIST | Select-String "Status","Last Run"状态是 Ready 且 Last Run Time 很旧,说明没跑过。登录一次即可。
agent 执行 shell 命令报 bash 找不到
这是 Windows 的固有限制:dsh 的 bash 工具是硬编码的 bash -c,Windows 没有 bash。
两个选择:
- 装 WSL:
wsl --install,之后能用wsl -e bash -lc "..." - 只用 PowerShell 那套工具,不依赖 bash
电脑休眠后连接断了
休眠会终止所有网络连接。到「电源和电池 → 屏幕和睡眠」把睡眠设为「从不」。锁屏不影响,dsh 和隧道都还在跑。
对话卡住不输出,最后整段蹦出来
这是 SSE 流式响应被缓冲了。服务器端 nginx 已经配了 proxy_buffering off,如果还出现,检查服务器上该 location 有没有被别的配置覆盖。
想换回自签证书或换端口
这些都在服务器端决定,跟 PC 无关。PC 端只需要改 -PublicUrl 后重跑 setup.ps1,隧道和其余配置会自动跟着变。
安全须知
agent 能执行命令、读写文件。请认真看完这几条再决定是否长期运行。
- 两层门都别拆:服务器 nginx 的 basic auth 是外门,DSH 自己的 token 是内门。删掉任何一个都等于裸奔。
- 本机只绑 127.0.0.1:启动参数固定
--host 127.0.0.1,不要改成0.0.0.0,否则家里的局域网也能直接连。 - 密码别外传:这个页面在公网,任何登录到本页的人都能看到部署方式。密码只存在于你的记忆和服务器上。
- 考虑再收紧:如果条件允许,在服务器安全组里把 8443 限制为只允许你常用出口 IP,或者叠一层 Tailscale / Cloudflare Access。
- 不用的时侯停掉:跑
uninstall.ps1或用计划任务禁用,比一直开着安全。
附:完整命令速查
# 环境
node --version
ssh -V
Test-NetConnection www.lukezystudio.cn -Port 22
# 部署
cd C:\dsh-win-tunnel
powershell -ExecutionPolicy Bypass -File setup.ps1 `
-ServerHost www.lukezystudio.cn `
-ServerUser ubuntu `
-TunnelPort 13081 `
-PublicUrl https://www.lukezystudio.cn:8443
# 体检
powershell -ExecutionPolicy Bypass -File check.ps1
# 日志
Get-Content C:\dsh-win-tunnel\logs\tunnel.log -Tail 20
Get-Content C:\dsh-win-tunnel\logs\dsh-web.log -Tail 20
# 取 token
Select-String -Path C:\dsh-win-tunnel\logs\dsh-web.log -Pattern "token=" | Select-Object -Last 1
# 手动重启
Start-Process C:\dsh-win-tunnel\run-tunnel.bat -WindowStyle Minimized
# 卸载
powershell -ExecutionPolicy Bypass -File uninstall.ps1 -PurgeFiles
dsh-win-tunnel · Windows 端操作手册 · 服务器 www.lukezystudio.cn:8443
项目仓库 github.com/MrLukezy/dsh-win-tunnel · 遇到文档没覆盖的问题,把 check.ps1 的输出发出来定位最快。