把 DeepSeek Harness 部署到服务器上 7×24 运行

十三步截图实测:从一台空 VPS 到常驻的 dsh——拿到 root SSH 和浏览器终端、接上模型服务商和带上下文窗口的自定义模型、不离开标签页装插件,并让它构建的每个站点都有一个能发出去的链接。

最近更新: 2026-10-15

DeepSeek Harness 一键部署完成后的主机面板,应用卡片上能看到 admin 登录名、Manage App 按钮和用于连上服务器的 ssh root 命令
一张卡片给了后面要用的三样东西:登录用户名、运行中的应用、SSH 命令。

DeepSeek Harness 本质是一个带 agent 循环的 Web 应用,跑在哪台机器上其实是个可以改的参数。而把这台机器从笔记本换成服务器,你能对它提的要求就变了:合上盖子它还在继续构建,工作区扛得住重启,你打开的地址是服务器自己的域名而不是一个临时隧道。长任务不用再迁着你的电量来安排。

本页跟着一次完整的服务器实录部署走(来源见文末署名),只讲常驻服务器这一种情况:把 harness 装到 VPS 上、用 SSH 或浏览器终端连上去、配置笔记本部署根本不需要的那些模型设置,以及最让人意外的一件事——它回给你的预览链接在你自己的电脑上打不开。用手机通过隧道远程接入、用 Ollama 跑本地模型是另外两件事,文末有对应攻略。

走完你会得到什么

  • ▸同一套 Web UI,用 VPS 域名打开,登录名是面板给的 admin 而不是 root;需要 shell 时浏览器里就有一个终端。
  • ▸当天刚发布、模型列表里还没有的模型:把服务商的 slug 粘进自定义模型那一行,顺手给它设上下文窗口和最大输出 token。
  • ▸构建结果留在服务器上。告诉会话输出必须落在哪个目录,它就会回一个 8080 端口的公网链接,而不是一个在远端根本用不了的 localhost 地址。

十三步

把 harness 装到机器上

  1. 1

    一键部署后,先把面板上的 SSH 那行抄下来

    一键镜像会把 harness 作为一个现成应用装进 Ubuntu,完成卡片上列着你之后每一步都要用的信息:应用名和它跑的操作系统、登录用户名(admin)、重置密码入口、一个直接在新标签页打开运行中 harness 的 Manage App 按钮,以及 SSH access 里那条完整的 ssh root@<你的服务器IP> 命令。现在就把它复制下来——agent 以后就住在这台机器里。

    $ssh root@<YOUR_SERVER_IP>
    DeepSeek Harness 一键部署完成后的主机面板,应用卡片上能看到 admin 登录名、Manage App 按钮和用于连上服务器的 ssh root 命令
    一张卡片给了后面要用的三样东西:登录用户名、运行中的应用、SSH 命令。看视频 3:40
  2. 2

    进 VPS 概览页,拿到 root SSH 和浏览器终端

    概览页是控制室,应用跑起来之后也值得完整读一遍。DeepSeek Harness 卡片重复了 admin 这个登录名;Ubuntu 26.04 Running 那一行有 Reboot 和一个 Web console 按钮;下面一条给出 SSH username root、IPv4 地址、root 密码重置和完整的 ssh root@… 命令。最值钱的是 Web console:它在浏览器标签页里开一个 root shell,也就是说你在任何一台没装 SSH 客户端的机器上都能管理这套 harness。

    运行 DeepSeek Harness 的 VPS 概览页,Ubuntu 26.04 Running 那一行带着打开浏览器终端的 Web console 按钮,下面一行是 root SSH 地址
    浏览器里的 Web console 是那条退路——不用装 SSH 客户端就能拿到 root shell。看视频 8:20
  3. 3

    首次启动那个 API Key 弹窗,点 Configure later 跳过

    应用第一次加载会弹出 Add an API key to get started,让你配置官方 DeepSeek 服务商。实录里故意点了 Configure later。服务器部署的价值恰恰在于自己选服务商——一把 OpenRouter 的 key 背后是上百个模型,或者为某个特定模型单独接一家——而这件事属于 Settings,不属于这个弹窗。

    DeepSeek Harness 首次启动要求填写官方 DeepSeek API Key 的弹窗,Configure later 按钮用来跳过它、改到 Settings 里接别的服务商
    这里先跳过;选服务商是 Settings → Models 的事,不是首启弹窗的事。看视频 3:46
  4. 4

    开会话之前先建一个工作区目录

    会话跑在工作区里,而工作区就是服务器上的一个目录。Select Workspace Directory 弹窗浏览的是服务器自己的 home 目录,列出已有文件夹,Show hidden files 旁边就有 New folder 按钮;实录里新建了 deepseek-test 并打开它。在该工作区里开的每个会话都只在这个目录里读写,这是一台多人共用的机器不变成一堆散乱文件的唯一办法。

    DeepSeek Harness Web 端的 Select Workspace Directory 弹窗,浏览服务器 home 目录,底部有新建工作区用的 New folder 按钮
    工作区就是服务器上的一个目录,每个会话都从它继承读写范围。看视频 4:08

给服务器版接上模型

  1. 5

    Settings → Models → Add provider

    Settings 在 harness 侧边栏最底部。Models 标签页是服务商待的地方,Add provider 会展开一长串按字母排序的列表:amazon-bedrock、art-dog、atenloop、azure-openai-responses、cerebras、cloudflare-ai-gateway、cloudflare-workers-ai、deepseek、fireworks、github-copilot、google、google-vertex、groq、huggingface、kimi-coding、minimax、mistral、moonshotai、nvidia、openrouter 等等。实录选了 OpenRouter,因为它一把 key 就覆盖了上面大部分厂商的模型,还能在对话中途切换。

    DeepSeek Harness 的 Settings Models 标签页,Add provider 下拉展开后列出 amazon-bedrock、cerebras、google、groq、minimax、moonshotai 和 openrouter 等服务商
    列表长到一把 OpenRouter 的 key 就成了务实的选择。看视频 4:42
  2. 6

    拉取服务商的模型列表,一次全加进来

    粘好 key 之后,Customized settings 里会出现 Fetch available models。它打开一个 Choose models to add 弹窗,每个模型 slug 一个勾选框——a1zlj/jamba-large-1.7、aion-labs/aion-2.0、amazon/nova-2-lite-v1、amazon/nova-lite-v1、anthropic/claude-3-haiku 一路排下去——外加 Deselect all 和 Add selected 两个操作。全部保持勾选才是重点:模型选择器从此不再需要你维护,点 Apply 就把这一整批写进正在运行的服务器实例。

    DeepSeek Harness 的 Choose models to add 弹窗,逐条列出 OpenRouter 模型 slug 的勾选框,配 Deselect all 和 Add selected 两个按钮
    一次全部勾上,模型选择器以后就不需要你维护了。看视频 5:24
  3. 7

    添加一个列表里还没有的模型,并设置它的上下文窗口

    当天发布的模型不会出现在选择器里,因为拉取到的列表比它更早。解法就在同一个 Models 页面最底下的 Add model 那一行:把从服务商页面复制的 slug 粘进去(视频里是 google/gemini-3.8-flash),给会话下拉框起个显示名(gemini-3.8-flash),这一行会展开出另外两个字段——Context window 和 Max output tokens,占位提示分别是 256K 和 32K。实录里两个都留空走默认值,但在一个按 token 计费的服务器上,这里就是给失控输出封顶的地方。

    $google/gemini-3.8-flash
    DeepSeek Harness 的自定义模型那一行,填着 google/gemini-3.8-flash 和显示名 gemini-3.8-flash,下面还有 Context window 与 Max output tokens 两个字段
    这就是添加当天新发布模型的办法——在任何一份拉取到的列表知道它之前。看视频 7:12

在任何地方都能打开

  1. 8

    问它一句话,然后看运行数据那一行

    冒烟测试就一句话。回复下面跟着一行元数据——时间、Ran for 1s、TTFT 1.7s,以及这次会话里被特意圈出来的 5167 tok/s。这一行同时确认了四件事:服务商 key 通了、模型答了、agent 循环跑在服务器上、从你浏览器到机房的往返快得足以全天干活。

    DeepSeek Harness 服务器实例对测试提问的回复,下面那行元数据给出运行时长、首 token 延迟和 5167 tokens/s 的吞吐
    一个被圈出来的数字,同时证明 key、模型和服务器都通了。看视频 7:28
  2. 9

    用域名打开 harness,而不是 localhost

    应用由服务器提供之后,浏览器地址栏读到的就是 VPS 域名而不是 127.0.0.1:3080,同一个地址在笔记本、手机、同事的机器上都一样能用。侧边栏最能说明问题:服务器上所有工作区都列在那里——用来跑定时任务的 Morning Brief、两个并行的建站 demo、那个测试用的工作区——因为状态存在服务器,不在你的浏览器里。

    DeepSeek Harness 的 Web UI 直接在浏览器里用 VPS 域名打开而不是 localhost,左侧工作区栏列着服务器上所有项目目录
    同一个应用、不同的地址——左边那串工作区就是证据。看视频 18:40

不离开浏览器就能扩展

  1. 10

    在浏览器终端里跑装插件的命令

    插件是用 dsh 命令行装的,而在全新的 shell 里第一次执行必然失败:终端会打 Command 'dsh' not found, did you mean…,后面还附上它猜测的 apt 包名。实录给出的修法是先装一个 Node 包管理器(npm install -g pnpm),再重跑那条添加插件的命令并重启 harness 服务。同一个终端也会回答 hostname、hostname -f 和 curl 到 ipinfo.io 的结果——你待会儿粘进浏览器的那个地址就是这么来的。

    $hostname; hostname -f; curl -s https://ipinfo.io/ip
    $npm install -g pnpm
    DeepSeek Harness 所在服务器的浏览器终端里打印出 Command dsh not found,正是这一步逼着你先装 pnpm 才能添加插件
    装插件是命令行动作,而一台新机器上 PATH 里还没有那条命令。看视频 8:56
  2. 11

    硬刷新,然后从插件市场点安装

    插件装完不会有任何提示:服务没重启、标签页没硬刷新之前它就是不动,没有弹窗也没有报错,这一点特别坑人。做完之后 Settings → Plugins → Plugin Market 就是活的插件目录,每个条目一个 Install 按钮(dsh-git-graph、dsh-skill-explorer、modlens、dsh-context),上面有 Discover / Themes / Installed / Advanced 四个标签,还有一个 Update the plugin market。实录里的警告值得原样转述:只装有人审过的插件,因为市场里的东西是社区代码,跑起来用的就是你 agent 的权限。

    DeepSeek Harness 设置里的 Plugin Market 页面,Discover、Themes、Installed 三个标签下,dsh-git-graph 和 dsh-skill-explorer 等社区插件各带一个 Install 按钮
    重启服务再硬刷新之后,终端就不再需要了。看视频 9:52

构建的东西也能对外访问

  1. 12

    在 VPS 上,localhost 链接一定是打不开的

    你问它刚构建好的东西怎么看,它会回一个 http://localhost:3000,外加启动服务用的 python3 -m http.server 或 npx serve 命令。点开就是 Chrome 那句 This site can't be reached——127.0.0.1 refused to connect,ERR_CONNECTION_REFUSED。什么都没坏:在服务器上,localhost 指的是服务器自己,而你笔记本上的浏览器是在问它自己。这就是本地部署和服务器部署最大的那处差别。

    在远程服务器上打开 DeepSeek Harness 生成的 localhost 预览链接后,Chrome 报出 This site can't be reached 和 ERR_CONNECTION_REFUSED
    在 VPS 上,localhost 指的是那台 VPS——这个预览链接在你笔记本上不可能打开。看视频 15:56
  2. 13

    把输出目录钉死,换回一个公网链接

    绕行办法是一句追加指令,告诉它会话必须把文件落在哪里、该打印哪个地址——视频里那句是 the final output should be at http://<你的域名>:8080/<构建名>/。于是它把站点复制到 /var/www/preview/<构建名>/,自己 curl 一遍端口确认资源返回 200,然后回一个 Final Live URL,外加 index.html、styles.css、menu-data.js、app.js 逐个文件的说明。预览目录设置一次,这个工作区之后每次构建都会以一条能发给客户的链接收尾。

    $the final output should be at http://<YOUR_HOSTNAME>:8080/<BUILD_NAME>/
    DeepSeek Harness 会话回复里给出挂在服务器域名上的 Final Live URL,并列出 /var/www/preview 下逐个文件,前提是事先规定了构建产物的落盘目录
    追加一句话,以后每次构建都变成一条能发出去的链接。看视频 16:24

多人共用一台 dsh 怎么办?

上面这一切给的是一个共享 admin 登录、一套 harness,实录也到此为止——它没有做过任何按用户隔离的配置。个人自用没问题,团队用就是真问题:任何能访问那个地址并通过登录的人,看到的都是同一批工作区、同一份会话历史和同一套 API Key。按人隔离不是服务器设置能解决的,得靠插件:社区里有一个把公网服务器变成多租户托管平台的插件,用户注册、管理员审核,每人一套互相隔离的 dsh 环境和自己的 key,具体做了什么写在它的 详情页上.

隔离与沙箱

自托管回答的是服务器跑在哪,沙箱回答的是 Agent 跑起来之后允许碰什么。两个意图经常一起出现,但不是同一件事——「跑在自己机器上」图的是数据主权,「把 Agent 关进隔离环境」图的是爆炸半径。2026-09-27 实测「dsh 沙箱插件」26.4(容易),供给也终于撑得起独立一节。

strukto-ai/mirage(★3,663)

簇内头牌:为 AI Agent 打造的虚拟终端——Agent 拿到的是一个模拟的 shell 和文件系统,而不是你真实的那个。如果你担心的是「Agent 跑了 npm install,只能听天由命」,它把听天由命换成可回放的沙箱。

sandbaseai/sandbase-harness(★674)

本地优先的自托管 Agent 运行时:沙箱会话、凭据存储、审计日志,经 MCP 桥接输出。它是本页两半之间的那座桥——自托管(你的硬件)与隔离(它的动作),一次装齐。

SeaOf0/dsh-redteam-model(★637)

光谱的进攻端:面向授权安全研究的 stage-gate 强制流程加扫描器包装——渗透测试、红队评估、代码审计。沙箱假设 Agent 可能闯祸,红队工具假设 Agent 会被攻击。同一张威胁模型的同一页,坐的是对面的位子。

团队与企业部署

同一台服务器,另一张组织架构图。个人 VPS 只对你负责,企业部署要对身份、审计与共享工作区负责。官方讨论 #8045(「面向企业场景」)本周刚开帖,2026-09-27 实测「dsh 企业部署」33.3(容易)——对照「docker 部署」67.4、「VPS」62.4 两座困难大山,这个角度无人把守。

Devin-AXIS/iPolloWork(★6,785)

面向人与 Agent 团队的企业级本地优先工作台:统一的多引擎工作区,带角色与共享上下文。本页轨道里最重的一个仓库,也说明需求的落点不在更多面板,而在治理。

himovo/movo(★164)

把 DSH 变成自托管企业 Agent 平台:在同一运行时之上加知识库、深度研究与协作。介于「一人一台 VPS」与全套工作台落地之间的中间路线。

真正变的是什么

三件事,没有一件是硬件:身份(上面的多租户登录服务从可选变成必选)、审计(谁在什么时候让 Agent 跑了什么)、配置即代码(工作区可以重建)。从沙箱一节过来的读者可以这样理解:企业部署就是治理的成文化——带着组织架构图的爆炸半径问题。

用 Docker 部署 DeepSeek Harness:现状与可行路径

2026-10-15 对照官方仓库核实:dsh 没有发布 Dockerfile、docker-compose.yml——仓库里唯一的 Dockerfile 是 sshd 辅助器的测试夹具——Docker Hub 上也没有官方镜像。官方文档的部署路线是 Node.js 加反向代理:public-deployments 文档讲 --public-url、--trusted-host 与 TLS,也就是上面整套图文走的路。两份公开请愿希望官方改变现状:discussion #9440(「强烈建议支持docker部署」,2 个赞,2026-10-11)与 #9654(「希望补充/更新 Docker 部署方式」,2026-10-14,勾画出一份生产级 compose 的轮廓——DSH_HOME 持久化、显式运行 uid、--trusted-host/--public-url 可配置)。在官方方案落地之前,以下内容全部属于社区实践口径,不是官方支持。

容器化的配方,本质上是给官方命令套一层容器。基础镜像:较新的 Node.js——仓库自己的 engines 字段要求 Node ^22.19.0 或 >=24。运行命令:官方文档的 npx @deepseek-ai/dsh web,再加上官方 CLI 帮助里对容器生活很关键的三件事:--no-open(容器里没有浏览器)、--host 必须是具体接口地址(文档写明 0.0.0.0 这类通配地址会被拒绝)、以及默认端口是 3080。真正要保住的状态都在 DSH_HOME 下——这是官方的 harness 主目录环境变量,默认 ~/.dsh——也正是卷挂载要保住的东西。

# Community-practice sketch — DSH publishes no image, Dockerfile or
# compose file (checked 2026-10-15). Containerization is not official.
services:
dsh:
image: node:22-bookworm # repo engines field: ^22.19.0 || >=24.0.0
environment:
DSH_HOME: /data/dsh-home # official env var; default is ~/.dsh
command: >-
npx @deepseek-ai/dsh web # the documented run command
--no-open # no browser inside the container
--host 172.17.0.2 # concrete interface literal - 0.0.0.0 is
# rejected per the official CLI help
--public-url http://dsh.example.com/
--trusted-host dsh.example.com
ports:
- "3080:3080" # the documented default web port
volumes:
- dsh-data:/data/dsh-home # profiles, config and sessions live here
volumes:
dsh-data:

读这份示例:把主机名与绑定地址换成你自己的。信任栅栏只放行 --trusted-host 点名的 authority(主机名[:端口])——浏览器用其他主机名访问时,每个 API 调用都会吃 403,其余配置再对也没用。因为通配绑定地址被拒绝,社区做法要么在启动时解析容器网卡的真实 IP(容器里跑 hostname -i),要么直接用宿主网络。命名卷才是整套练习的意义所在:DSH_HOME 放在卷上,容器换代时会话、配置与工作区文件都还在。

升级就是把命令重跑一遍:npx 路线会拉取最新版本,所以刷新基础镜像后重建容器,就是全部的升级路径——和 Linux 安装指南教的「重跑即更新」是同一条规则。容器里的安全姿态也不会放松:打印出来的 URL 当密码对待,3080 端口别直接暴露公网、按官方文档在前面加反向代理,并且记住没有按用户隔离这回事——与上面裸机教程的告诫完全相同。

DeepSeek Harness 服务器部署:常见问题

把 dsh 搬出笔记本之前,大家都会问的几件事。

跑 DeepSeek Harness 需要多大的服务器?

很小。这次实录把整套 harness 跑在 2 核 8 GB 的 KVM 套餐上,所有模型都走 API 调用,所以这台机器只负责提供 Web UI、跑 agent 循环和存文件,推理发生在服务商那边。只有当你还想在机器上自己跑权重时,才需要更大的配置——那是另一篇攻略的事。

这和用手机远程连 DeepSeek Harness 是一回事吗?

不是,而且区别很关键。远程接入是隧道:harness 仍然跑在你自己的机器上,那台机器必须一直开着,公网地址是随机的、隧道一重启就失效。服务器部署是把 harness 本身搬到一台全天开机的机器上,于是合上笔记本之后夜间任务照跑,你收藏的那个地址就是服务器自己的域名。

必须用视频里那家主机的服务吗?

不必。厂商是次要的——任何跑 Ubuntu 镜像、带 harness 模板的 VPS 都行。你需要主机面板提供的是同样三样东西:一条 ssh root@ 命令用来要真正的终端,一个浏览器 Web 控制台用来跑一次性命令,一个 Manage App 链接用来打开正在运行的实例。

我用的又不是 DeepSeek 的模型,为什么第一次打开就要它的 API Key?

那个弹窗只负责配好官方 DeepSeek 这一个服务商,点 Configure later 跳过也不会坏任何东西。服务商是在 Settings → Models 里添加的,每家一把自己的 key,所有服务商的模型最后都会汇进同一个会话选择器——这也正是你能在对话中途换模型的原因。

能按模型分别设置上下文窗口吗?

可以。Settings → Models 里的自定义模型那一行,模型 ID 和显示名下面就是 Context window 和 Max output tokens 两个字段,占位提示写着 256K 和 32K。留空就沿用服务商默认值;填上就能给按输出 token 计费的模型封顶,或者在一台多人共用的机器上把成本按住。

把 harness 挂在公网 IP 上安全吗?

请把那个网址当成密码看待。应用登录用的是 admin 这个用户名加你的 VPS 密码,而且没有按用户隔离,所以任何过了这道门的人共享的都是你的工作区、你的会话历史和你的 API Key。密码要够强,前面套一层 HTTPS 而不是直接暴露裸端口,插件只装审过的——实录把这点讲了两遍,其中一遍还是边演示一个主题边把它卸载掉。

自部署 dsh 需要 Docker 吗——能用 Docker Compose、从 Docker Hub 拉镜像、或者跑在树莓派上吗?

Docker 不在官方文档路线里:官方文档部署 dsh 用的是服务器上的 Node.js 和 npm——就是上面分步教程的步骤——而且官方仓库带的是 Makefile,不是 Dockerfile 或 compose 文件。如果你们团队统一用容器,那等于自己打包;Docker Hub 上能搜到的 dsh 镜像都是社区做的——按第三方插件的标准审查再用。compose 文件只需要带齐本教程本来就要求的两样:端口和一个持久化的工作区目录。树莓派一级的硬件可以跑同样的步骤——前提是 Node.js 20+,给板子装 64 位系统,并且预期 Web UI 表现平平;第 4 步「先建工作区目录」的规矩在小磁盘上更重要。

相关攻略

相邻的几件事:连一台你没搬走的 harness、在机器上自己跑推理、以及怎么安全地装。

来源与署名

本页所有截图都取自下方链接那条实录里的画面,为去掉讲解者的摄像头浮窗做过裁剪,并注明出处。每一步都深链回它来源的精确秒数;操作步骤、风险提示和结论是本页自己写的。

DSH Plugins 是独立的 DeepSeek Harness 插件市场,与 DeepSeek 官方无关,也不代表官方背书。第三方插件未经安全审计,安装前请审查源码。

每周获取最新的 DeepSeek Harness 插件,绝不滥发。