Windows 端部署说明

Windows 端部署说明

把家里这台 Windows 上的 DeepSeek Harness,通过 SSH 反向隧道接到服务器,让你在任何地方用浏览器打开它,并让 agent 直接操作本机的文件和软件。

这是什么

整个链路是这样走的,全部由 PC 主动连出,家里不需要公网 IP,路由器不用做端口映射:

你的浏览器
→
服务器 nginx :8443
→
127.0.0.1:13081
⇠ 隧道
本机 dsh :13080

PC 上只做两件事:跑一个 dsh web,再跑一条 ssh -R 把本地端口送到服务器。浏览器访问的是服务器,看到的是本机的 dsh。

为什么必须用隧道

DeepSeek Harness 是「Host 监听 / Peer 连入」的模型,没有让一个节点主动连回另一个节点的能力。所以「PC 连回服务器」这一层只能由隧道承担,这也是本项目存在的唯一理由。

本次部署目标

这台 Windows 要接入的服务器,参数如下(脚本已经按这些值配好,直接照抄即可):

对外访问地址
https://www.lukezystudio.cn:8443
服务器 / SSH 主机
www.lukezystudio.cn
SSH 用户名
ubuntu
SSH 端口
22
隧道端口
13081
本机 dsh 端口
13080
登录墙账号
dsh
登录墙密码
见服务器端安装时的打印输出
密码不在本文档里

这个页面部署在公网,所以登录墙密码不写进来。它在服务器端执行 install.sh 时只打印过一次,如果你已经丢了,去服务器上重跑一次安装、在 config.env 里显式设置 AUTH_PASS 即可重置。

前置检查

在 Windows 上打开 PowerShell(开始菜单搜 PowerShell,右键选「以管理员身份运行」),逐条确认:

1. Node.js 22 LTS

PowerShell
node --version

要求 v20 以上,推荐 v22。没装就执行:

PowerShell
winget install OpenJS.NodeJS.LTS

装完必须关掉这个窗口重新开一个,否则 PATH 还是旧的。

2. OpenSSH 客户端

PowerShell
ssh -V

没输出就去「设置 → 应用 → 可选功能 → 添加功能」,找到 OpenSSH 客户端 安装。

3. 能连到服务器

PowerShell
Test-NetConnection www.lukezystudio.cn -Port 22

TcpTestSucceeded 必须是 True。如果是 False,先解决网络或防火墙,后面的步骤都会卡在这里。

第一步:准备文件

把仓库里的 windows 目录拷到本机,建议固定放在 C:\dsh-win-tunnel:

PowerShell
# 方式一:有 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

目录里应该有这些文件:

第二步:一键配置

在 C:\dsh-win-tunnel 目录里执行。建议用管理员权限的 PowerShell,否则计划任务可能注册失败:

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...

第三步:首次登录

  1. 浏览器打开上一步那条带 ?token= 的完整地址
  2. 先弹出一个 HTTP 认证框,输入登录墙账号 dsh 和那个密码
  3. 页面加载后,浏览器已经种下 cookie,以后直接访问 https://www.lukezystudio.cn:8443 即可
证书应该是正常的

这条链路复用服务器上 www.lukezystudio.cn 的 Let's Encrypt 证书,浏览器不应该出现「连接不是私密连接」。如果你看到了证书警告,说明你访问的是 IP 而不是域名,检查地址栏。

token 会随 dsh 重启变化

已经种过 cookie 的浏览器不受影响。换浏览器、清 cookie、或者换设备时,需要重新从日志里取一次 token。

验证链路

任何时候怀疑出问题,先跑体检。它会逐段告诉你断在哪:

PowerShell
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 = 隧道断了

日常操作

看 dsh 日志
C:\dsh-win-tunnel\logs\dsh-web.log
看隧道日志
C:\dsh-win-tunnel\logs\tunnel.log
手动启动 dsh
run-dsh.bat
手动启动隧道
run-tunnel.bat

开机自启

脚本注册了两个计划任务,登录后 20 秒自动启动:

PowerShell · 查看任务
schtasks /Query /TN DshWinTunnel-DshWeb /V /FO LIST
schtasks /Query /TN DshWinTunnel-Tunnel /V /FO LIST

隧道脚本内部是死循环,断开后 5 秒自动重连,所以 PC 断网恢复后不需要人工干预。

改配置

重新执行一遍 setup.ps1 并传入新参数即可,它会覆盖 config.json 与两个 bat、并重建计划任务。

卸载

PowerShell
cd C:\dsh-win-tunnel
powershell -ExecutionPolicy Bypass -File uninstall.ps1 -PurgeFiles

会删除计划任务、结束进程、清理生成的配置与日志。不会动你的 SSH 密钥和已安装的 dsh。

常见问题

浏览器打开是 502 Bad Gateway

nginx 活着,但连不上隧道的落点。先看 PC 上隧道进程在不在:

PowerShell
Get-CimInstance Win32_Process -Filter "Name='ssh.exe'" | Select-Object ProcessId, CommandLine

没有就双击 run-tunnel.bat。再看 logs\tunnel.log 的最后几行,常见报错对照:

  • Permission denied (publickey) → 公钥没部署上,重跑 setup.ps1
  • remote port forwarding failed → 服务器上 13081 被占用
  • Connection refused → SSH 端口不对
  • Operation timed out → 网络不通或域名解析错
能登录,但页面白屏、接口全 401

原因是 DSH 的浏览器信任校验(Host 与 Origin 必须同源)。检查 PC 上启动参数里有没有 --trusted-host:

PowerShell
Get-Content C:\dsh-win-tunnel\run-dsh.bat | Select-String "trusted-host"

应该能看到 --trusted-host www.lukezystudio.cn:8443。少了就重跑 setup.ps1。

看不到第一次的 token 了
PowerShell
Select-String -Path C:\dsh-win-tunnel\logs\dsh-web.log -Pattern "token=" | Select-Object -Last 3

拿到后拼成 https://www.lukezystudio.cn:8443/?token=那串字符 打开一次。

重启电脑后连不上

计划任务默认在用户登录后触发。如果 PC 重启后停在登录界面没人登,就不会启动。确认方式:

PowerShell
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,隧道和其余配置会自动跟着变。

安全须知

这台 PC 的 PowerShell 和文件系统等于交给了公网

agent 能执行命令、读写文件。请认真看完这几条再决定是否长期运行。


附:完整命令速查

PowerShell · 全部命令
# 环境
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 的输出发出来定位最快。