SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-16

DeepSeek Harness VPS 私有部署與 SSH tunnel 設定

了解如何在 Linux VPS 安裝 DeepSeek Harness、固定 npm 版本,並透過 SSH tunnel 連線至 port 3080 UI,避免公開未設密碼的 web server。

DeepSeek Harness 是什麼

DeepSeek Harness(dsh)是可在 VPS(虛擬私有伺服器)上執行的 Node.js agent runtime。安全的執行方式,是將它綁定至 127.0.0.1,再讓瀏覽器透過 SSH(secure shell)tunnel 連線。它會在 port 3080 提供 web UI(user interface),不必在 terminal 中操作。此 web server 本身不要求密碼,因此公開 port 3080 等同於讓任何找到它的人取得一個 agent,而該 agent 能以你的 Linux 使用者身分讀取檔案及執行命令。

DeepSeek 於 13 August 2026 以 MIT licence 發布此專案,套件名稱為 npm package @deepseek-ai/dsh。專案將自身定位為 developer preview,並明確表示預期會出現不相容變更。以下所有版本號碼都是 August 2026 的快照。在將任何內容複製到重要的伺服器前,請先檢查 repository。

整個設計都圍繞一個概念:所有功能都是 plugin。Model adapter、tool registry、session log、sandbox、scheduler 以及 agent loop 本身,都是載入同一個 shared context 的 plugin,且其中任何一項都可以替換。這裡沒有僅供 plugin 裝飾的特權核心。這使 harness 值得測試,也正是唯一真正的風險所在。

Harness 不是模型

Harness 負責執行 agent 迴圈。推理工作在其他地方的模型中進行,因此在提供 API(application programming interface)key 或自行託管的模型 endpoint 位址之前,任何功能都無法運作。

請在 UI 的 Settings,再進入 Models 進行設定。目錄中有主要 API 提供者(DeepSeek、OpenAI、Anthropic)的預先建立卡片,可直接貼上 key。「Add a custom provider」是較實用的選項:它需要 provider ID、顯示名稱、base URL、API protocol 和 credential,並使用 OpenAI-compatible protocol,因此任何實作該 protocol 的 gateway 或 local server 都能運作。Custom provider 也可以查詢 OpenAI-compatible GET /models endpoint,自動填入模型清單。

這就是將 harness 指向同一台 VPS 上模型的方式。Ollama 在 http://127.0.0.1:11434/v1/ 提供 OpenAI-compatible API。API key 欄位必須填入任意字串,依慣例使用 ollama,因為該欄位為必填,之後會被忽略。能在 VPS 上容納的模型,是否足以驅動 agent,才是較難回答的問題;Ollama 與 vLLM 作為本機模型伺服器的差異會決定這個答案需要耗用多少 RAM。

在 UI 中輸入的 key 只能寫入,無法讀回。Harness 會將它們儲存在 $DSH_HOME/.credentials.yaml,並只在 settings.yaml 中保留 credential reference。$DSH_HOME 的預設值為 ~/.dsh。請將該檔案視為 password file,因為它確實是:任何能讀取該檔案的人,都可以使用你的 API 預算。

安裝前的準備

  • 執行 Ubuntu 24.04 或其他目前版本 Linux 的 VPS,並可透過 SSH 存取
  • 22.x 系列的 Node.js 22.19 或更新版本,或 Node.js 24 以上版本;專案會以這些版本進行建置與測試
  • 一般使用者帳戶,而非 root,因為 agent 會以啟動程序的使用者身分執行 shell 命令
  • 如果計畫安裝 plugins,請確保 pnpm 位於 PATH 中,因為 plugin 命令會呼叫該程式
  • 在防火牆及供應商獨立的網路防火牆中關閉 3080 埠

Ubuntu 內建的 nodejs 套件版本低於 harness 的需求,因此請從 NodeSource 或 nvm 安裝 Node,不要使用 apt install nodejs。如果 VPS 是新建的,先強化 SSH,再進行其他設定 值得花十分鐘處理,因為你即將依賴的 tunnel,其安全性取決於後端的 SSH server。

在 VPS 上安裝 DeepSeek Harness,固定使用單一版本

node --version
npx @deepseek-ai/dsh@0.1.0-rc.6 web

npx 會下載套件並執行其中的 dsh 二進位檔。web--profile web 的別名,會啟動瀏覽器應用程式,且程序會輸出其監聽中的位址。預設值為 http://127.0.0.1:3080

固定版本。npx @deepseek-ai/dsh web 會解析你執行時 latest 標籤所指向的版本,而該專案已發布數個 release candidate,並表示即將進行不相容變更。0.1.0-rc.6 是 13 August 2026 當天 latest 所指向的版本。固定版本後,今天設定的伺服器下個月仍會以相同方式運作,因此升級會變成由你決定的操作,而不是事後才發現的意外變更。

日常使用時,請安裝一次,不要在每次啟動時重新解析版本。

npm install -g @deepseek-ai/dsh@0.1.0-rc.6
dsh --profile web --help

第二行值得執行,因為 launcher 與 web app 使用不同的旗標集合。dsh --help 會顯示 launcher 自身的選項。dsh --profile web --help 會顯示 web application 接受的旗標;--port--host 及可重複指定的 --trusted-host 都屬於這些旗標。

現在確認它正在監聽的位址。

ss -tlnp | grep 3080

local address 欄位應顯示 127.0.0.1:3080。如果顯示 0.0.0.0:3080,表示 UI 可從網際網路存取。此時應先停止程序,再進行其他操作。

為什麼絕對不能公開連接埠 3080

Web server 沒有驗證層。其設定只會公開監聽主機與監聽連接埠,這就是全部的暴露面。非 loopback 部署的存取控制由獨立的 trusted-host 設定負責,並不是登入畫面。

接著看這個連接埠後方的功能。agent 會編輯 workspace 中的檔案並執行 shell commands,而 provider credentials 就存放在旁邊的磁碟上。因此,開放的連接埠 3080 等同於附帶聊天介面的 remote shell,以啟動它的使用者身分執行,並附帶你的 API key。攻擊者不需要 exploit。他們只需要知道連接埠號碼,而掃描器通常會在主機上線後數小時內找到連接埠。

CLI(command line interface)也反映了這項設計。自 0.1.0-rc.6 起,它刻意不支援 --host 0.0.0.0,而是顯示 usage error 後結束,不會啟動。這項拒絕行為是安全功能,因此不要尋找移除它的 patch。

當 tunnel 不適用時,另外有兩種合理的部署方式。將主機放在 private overlay network 上,使其只擁有你自己的裝置能夠路由到的位址;自架 Headscale control server 就能提供這種架構。或者,在前方放置 reverse proxy,在請求抵達連接埠 3080 前先完成驗證,例如由 Authentik single sign-on server 執行 forward auth。前方的 reverse proxy 若沒有 auth,就不是安全控制,而只是較長的 URL。

透過 SSH tunnel 存取 Web UI

請在 laptop 上執行,不要在 server 上執行。

ssh -N -L 3080:127.0.0.1:3080 you@your-server

-L 會在 laptop 上開啟 3080 埠,並透過加密的 SSH 工作階段轉送所有連入的連線。127.0.0.1:3080 部分會在 server 上解析,因此連線會從 loopback 抵達 harness,效果與直接在該機器上操作完全相同。-N 表示不要啟動遠端 shell,因為只需要連接埠轉送功能。

接著在本機瀏覽器開啟 http://127.0.0.1:3080。如果 laptop 上的 3080 埠已被占用,請變更左側的數字:ssh -N -L 3180:127.0.0.1:3080 you@your-server,然後瀏覽至 http://127.0.0.1:3180。左側數字屬於本機,右側數字屬於 server,因此只需變更左側數字。

將其儲存在 ~/.ssh/config,之後就不必再輸入。

Host dsh
  HostName 203.0.113.10
  User deploy
  IdentityFile ~/.ssh/id_ed25519
  LocalForward 3080 127.0.0.1:3080

完成後,ssh -N dsh 會啟動 tunnel。瀏覽器顯示連線被拒絕時,通常表示 tunnel 已建立,但遠端沒有任何程序正在監聽,因為 SSH 不論 harness 是否執行,都會轉送該埠。請使用上方的 ss command 檢查 server。

登出後讓 harness 持續執行

npx 指令會隨 shell 一起結束。systemd user service 可持續執行,並在 harness 當機或重新開機後將其重新啟動。

loginctl enable-linger $USER
mkdir -p ~/.config/systemd/user
command -v dsh

enable-linger 很重要,因為 user service 通常會在最後一個工作階段結束時停止。沒有這項設定,關閉 tunnel 的瞬間 harness 就會結束。請使用 command -v dsh 顯示的絕對路徑並填入 unit,因為 systemd 不會搜尋登入 shell 建立的 PATH。

[Unit]
Description=DeepSeek Harness web UI
After=network-online.target

[Service]
Type=simple
WorkingDirectory=%h/projects/site
ExecStart=/usr/local/bin/dsh web
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

WorkingDirectory 並非僅為了美觀。dsh 程序會將啟動時所在的目錄作為預設檔案系統位置,因此 service 若從錯誤目錄啟動,agent 就會取得錯誤的預設工作區。您仍可在 UI 中選擇工作區。

systemctl --user daemon-reload
systemctl --user enable --now dsh
systemctl --user status dsh

拒絕啟動的 unit 幾乎總是使用了錯誤的 ExecStart 路徑,或 binary 不接受目前的 Node 版本;journalctl --user -u dsh -n 50 會指出是哪一項。同樣的模式也適用於讓 VPS 上的任何 coding agent 持續執行,而且失敗模式完全相同。

外掛程式允許執行的操作

外掛程式是一個模組,可將服務、具型別的事件及可還原的效果加入共用內容。以下擴充點值得仔細閱讀:

  • ctx.llm 註冊模型提供者
  • ctx.tools 新增供模型使用的工具
  • 提供 ctx.shell 背後的 shell 後端
  • ctx.fs 提供檔案系統存取或政策
  • ctx.commands 註冊人類使用的命令
  • 透過 ctx.jobs 執行背景工作
  • 使用 ctx.sandbox 後端包裝產生的程序
  • 透過 agent/*tools/* 事件攔截請求與工具呼叫
  • 擴充持久化的工作階段狀態
  • 透過 ctx.agents 驅動 UI

請用攻擊者的角度閱讀這份清單。外掛程式可以提供檔案系統層和 shell 層,也可以介入模型發出的每個工具呼叫。外掛程式與這些介面之間沒有權限對話框,因為外掛程式就是一般的 Node 程式碼,會與其他元件載入至同一個程序。安裝外掛程式,就等同於以 agent 的權限執行陌生人的程式碼,而 agent 的權限就是 Unix 使用者的權限。

這與在 VPS 上將 MCP 伺服器連接至 agent 時所做的信任決策相同,其中 MCP 是模型內容協定。這也是為什麼在 VPS 上安全地執行 coding agent時,應先確認它使用的帳號,而不是先檢查模型;同樣地,這也解釋了npm 供應鏈攻擊為何會對伺服器造成嚴重影響:安裝步驟就是遭入侵的時機,而且不會出現任何提示。

外掛程式的來源

外掛程式儲存在 profiles 中。profile 是儲存在 $DSH_HOME 下的具名組合;其預設值為 ~/.dsh,而每個 profile 目錄都包含該 profile 所安裝的 out-of-tree 外掛程式。CLI 會將你的引數直接轉送給 pnpm,並以 profile 目錄作為工作目錄。

dsh plugin --profile web add github:deepseek-harness/turtle-ui
dsh plugin --profile web remove turtle-ui

由於引數會不變地傳遞給 pnpm,因此 addremoveupdatewhy 的行為與任何 pnpm 專案相同,外掛程式可以是 npm 套件或 GitHub 參照。pnpm 必須先存在於 PATH 中。在 Node 22 及更新版本中,corepack enable pnpm 會將它放入 PATH。

外掛程式的探索透過 GitHub topic 運作。外掛程式作者會將 dsh-plugin topic 加入自己的 repository,而瀏覽該 topic 是尋找現有外掛程式的方法。topic 是作者套用到自己 repository 的標籤。沒有人審查或簽署它,而 topic 頁面會依 stars 排序;stars 反映的是熱門程度,不是安全性。

以下 4 個習慣能讓管理維持在可控範圍內。安裝前先閱讀原始碼,因為大多數外掛程式都很小,10 分鐘內即可讀完。不要追蹤 branch,請鎖定確切版本或 commit。在你願意重建的 VPS 上,以不擁有其他資源的使用者執行 harness。為 agent 配置專用 API key 和專用支出上限,並與正式環境服務使用的 key 分開。

如果你想先比較不同設計,再決定採用哪一種,Omnigent 多代理程式 harness 會以不同結構處理相同問題;實際使用外掛程式後,兩者的取捨會很明顯。

第一個失效的環節

Node 太舊。 此專案以 Node 22.19 及 22.x 系列中更新的版本,或 Node 24 以上版本為目標,CI 也會使用這些版本進行測試。較舊的執行環境會因缺少程式碼使用的語法與 API,而在啟動時失敗。請先執行 node --version

3080 埠已被占用。 可能是第二個 harness、殘留程序,或其他同樣使用 3080 的應用程式。使用 ss -tlnp | grep 3080 找出占用者,然後停止該程序,或使用 dsh web --port 3180 將 harness 啟動在其他位置。--port 屬於 Web 應用程式,因此應在 web 之後執行。

瀏覽器無法透過 tunnel 連線。 確認你瀏覽的是 127.0.0.1,而不是伺服器的公開位址,因為轉送的埠只存在於你的筆記型電腦上。接著確認 harness 正在伺服器上監聽,因為無論遠端是否有服務回應,SSH 都會建立轉送。

dsh plugin 立即失敗。 此命令是 pnpm 的 wrapper,因此如果找不到 pnpm binary,會在任何 plugin 工作開始前停止。

agent 看不到你的專案。 workspace 預設為程序啟動時所在的目錄,因此若 unit 的 WorkingDirectory 是你的 home directory,agent 取得的就是你的 home directory。請在 UI 中選擇 workspace,或修正 unit 後重新載入。

FAQ

將 DeepSeek Harness Web UI 暴露在 3080 埠上是否安全?

不安全。Web server 本身沒有登入功能,後方的 agent 會以啟動程序之使用者身分編輯檔案並執行 shell 命令,而 provider API key 也儲存在同一個磁碟上。請讓 listener 保持在 127.0.0.1,並透過 SSH tunnel 存取。使用私有 overlay network,或使用 reverse proxy 在請求抵達該埠前驗證每一個請求,也可以達到相同效果。截至版本 0.1.0-rc.6,CLI 會拒絕 --host 0.0.0.0,並以 usage error 結束;這也反映出作者對此作法的看法。

我需要 DeepSeek API key,還是可以使用 local model?

兩者皆可,因為 harness 是 runtime,不是 model。在 Settings 中進入 Models,即可將 key 貼到 catalog provider card;也可以選擇 "Add a custom provider",並提供使用 OpenAI-compatible protocol 的 base URL。local Ollama server 會在 http://127.0.0.1:11434/v1/ 回應,且 API key 欄位可接受任意字串。Key 會儲存在 $DSH_HOME/.credentials.yaml,預設值為 ~/.dsh/.credentials.yaml

安裝 DeepSeek Harness plugin 後,plugin 實際上會取得什麼權限?

執行 harness 的帳號所擁有的權限。Plugin 是載入相同程序的 Node 程式碼,而 extension point 包括 shell backend、filesystem layer、tool registry,以及包裝每次 tool call 的 events。除非 plugin 自行提供 sandbox,否則沒有任何機制能將 plugin 與這些介面隔離。安裝前請先閱讀原始碼,並以不擁有任何重要資源的使用者執行 harness。

我應該安裝哪個版本?之後還能持續運作嗎?

請安裝指定版本,例如 npx @deepseek-ai/dsh@0.1.0-rc.6 web。在 13 August 2026,latest tag 指向的就是該版本。此專案自稱為 developer preview,並表示預期會有破壞相容性的變更,因此未固定版本的命令可能每天都產生不同結果。升級前請先檢查 repository,並預期 config key 與 plugin interface 會在版本仍以 0 開頭時持續變動。

#deepseek#agent-harness#self-hosting#nodejs#plugins