发布日期:2026年8月24日 | 话题分类:DeepSeek 开发实战 | 时效性:本文基于 deepseek-harness 官方 CLI reference(2026年8月)

DeepSeek Harness 每次修改插件后端口无法访问,根因是其底层 Cordis 框架的架构设计:插件(Bundle)变更后必须完整重启进程,旧进程若未退出则占用 3080 端口导致新进程无法启动。官方 CLI reference 明确指出:"A live cordis.patch.yml edit re-evaluates expressions against services that are still up, so it cannot reset a served port."——在进程还在运行时修改配置,不会释放已绑定的端口。解决方法是先彻底终止旧进程,再重新启动,以下是完整的平台分步操作与预防建议。



为什么修改插件后端口 3080 进不去?

DeepSeek Harness(简称 dsh)是 DeepSeek AI 开源的插件化 Agent 编排框架,采用 "everything is a plugin" 架构,底层由 Cordis 内核驱动。所有能力——模型、工具、会话、沙箱、UI——都是以插件形式挂载的。

这个设计导致了一个关键约束,官方 CLI reference 文档中明确写明:

"The successful pnpm operation changes the Profile manifest and Bundle list on disk; a running Profile keeps the Bundle set from its current start. Restart that Profile after adding, removing, or updating a Bundle."

翻译过来:在命令行安装或删除插件,改变的只是磁盘上的配置;当前运行中的 Harness 进程保持的是启动那一刻加载的插件集,不会自动生效。你必须重启进程。

问题出在"重启"这一步上。


端口被占用的完整触发链

用户修改插件 → 尝试重启 dsh → 旧进程仍在占用 3080 → 新进程 EADDRINUSE 报错退出 → 浏览器显示"无法访问此网站"

具体场景:

  1. 旧进程未完全退出:直接关闭终端标签页而非正确终止进程,dsh 进程仍在后台运行并持有端口

  2. Cordis 处置超时:官方文档说明进程关闭给插件树最多 5 秒处置时间,若某个插件清理缓慢,端口不会即时释放

  3. 插件损坏导致启动失败但端口未释放:一个写法有误的插件可能让新进程在监听端口后立即崩溃,但系统来不及回收绑定

  4. cordis.patch.yml 热重载的误解:dsh 会监视配置文件的有效修改并热重载,但这不能重置已服务的端口——这是官方明确的行为边界


修复步骤:分平台操作

macOS / Linux

# 第一步:找到占用 3080 端口的进程
lsof -ti:3080

# 第二步:强制终止(替换为实际 PID)
kill -9 $(lsof -ti:3080)

# 或者直接用进程名终止
pkill -f "dsh web"

# 第三步:确认端口已释放
lsof -i:3080
# 无输出即为释放成功

# 第四步:重新启动
npx @deepseek-ai/dsh web

Windows(PowerShell)

# 查找占用 3080 的进程 PID
netstat -ano | findstr ":3080" | findstr LISTENING

# 终止进程(替换 <PID>)
Stop-Process -Id <PID> -Force

# 重新启动
npx @deepseek-ai/dsh web

换端口启动(最简单的临时方案)

如果上述步骤麻烦,或旧进程暂时无法终止,可以直接换一个端口:

npx @deepseek-ai/dsh web --port 8080

访问 http://127.0.0.1:8080 即可使用。注意:--port 参数必须在 web 子命令之后传入,写在前面无效。


插件修改的正确工作流

根据官方 CLI reference,插件变更分为两种情况,处理方式不同:

情况 A:修改 cordis.patch.yml 配置(无需重启)

dsh 会实时监视 profile 目录和 home 目录下的 cordis.patch.yml,合法的修改会自动热重载——但有一个硬限制:不能重置已绑定的端口、不能改变已挂载 Bundle 的插件集

配置文件路径:

作用范围

路径

当前 profile 专用

~/.dsh/profiles/<name>/cordis.patch.yml

所有 profile 共用

~/.dsh/cordis.patch.yml

临时调试

dsh web --patch ./extra.yml

适合热重载的修改:调整工具开关、切换 Shell 类型(bash/pwsh)、修改超时参数等。

情况 B:安装/删除/更新 Bundle 插件(必须重启)

# 安装插件
dsh plugin --profile web add <package-name>

# 删除插件
dsh plugin --profile web remove <package-name>

# 确认配置树(不启动进程,仅查看)
dsh --profile web --dump-config

安装或删除 Bundle 后,必须执行完整的进程终止 → 重新启动。否则新安装的插件不会加载,删除的插件也还在运行。

完整的安全重启脚本(macOS/Linux)

#!/bin/bash
# 安全重启 dsh:先终止旧进程,再重新启动
pkill -f "dsh web" 2>/dev/null && sleep 2
lsof -ti:3080 | xargs kill -9 2>/dev/null
echo "端口 3080 已释放,正在启动..."
npx @deepseek-ai/dsh web

插件安装后不显示怎么办?

"装了插件但没变化"是另一个常见问题,与"端口进不去"的根因一致——都是进程没有重新加载新的 Bundle 集。排查步骤:

第一步:确认安装到了正确的 profile

# --profile 值必须与实际启动命令一致
dsh plugin --profile web add dshmarket   # 对应 dsh web 或 dsh --profile web

第二步:检查配置树

dsh --profile web --dump-config
# 确认新插件出现在输出中

第三步:硬刷新浏览器

部分 UI 变化需要浏览器缓存失效后才可见(Cmd+Shift+R / Ctrl+Shift+R)。

第四步:确认已重启进程

涉及 Node 宿主端逻辑的插件,刷新页面无效,必须重启进程。


一个插件破坏整个系统怎么恢复?

写法有误或存在运行时错误的插件可以导致整个插件树启动失败,进而让 Harness 完全无法访问。社区推荐提前安装防护插件:

dsh plugin --profile web add github:aokamoaki/dsh-startup-guard

该插件会在启动前预检插件组合,对崩溃包进行隔离处理,防止单个损坏插件拖垮整体。

如果已经进入无法访问的状态,直接编辑配置文件回退:

# 打开 profile 的 cordis.patch.yml,注释掉新增的插件行
nano ~/.dsh/profiles/web/cordis.patch.yml

# 然后重新启动
npx @deepseek-ai/dsh web

关于端口安全与远程访问

DeepSeek Harness 默认只监听 127.0.0.1:3080(本地回环),官方 CLI 不支持 --host 0.0.0.0(直接报错退出),这是有意为之的安全设计——Web UI 可以执行 bash、读写文件,暴露到公网等同于开放远程代码执行接口。

如果需要从其他设备访问,官方推荐 SSH 端口转发:

# 在本地执行,将远程服务器的 3080 转发到本地
ssh -N -L 3080:127.0.0.1:3080 user@your-server
# 然后浏览器打开 http://127.0.0.1:3080 即可

使用需要多模型 API 管理的场景,可以通过支持标准 OpenAI 接口的统一接入平台管理不同提供商的密钥。七牛云 Token Plan(qiniu.com/ai/plan)支持多款主流大模型的统一 API 管理,对需要在 Harness 中切换模型提供商的开发者可参考其配置文档。


常见问题

Q:dsh 启动报 EADDRINUSE: address already in use 127.0.0.1:3080,是 bug 吗? 不是 bug,是旧进程仍在运行。官方文档说明这不是错误——如果旧实例是正常运行的,直接在浏览器打开 http://127.0.0.1:3080 即可使用已有进程。若确认需要重启,按本文步骤终止旧进程后重新启动。

Q:修改了 cordis.patch.yml 保存后变化没生效,需要重启吗? 取决于修改类型。dsh 会热重载配置文件中的参数调整(如开关工具、修改超时),但不会热重载端口配置,也不会重载插件集的增减。如果修改涉及新增/删除插件行,必须重启进程。

Q:dsh plugin add 成功了但进插件设置页没看到,怎么排查? 按以下顺序检查:① --profile 参数是否与启动命令匹配;② 运行 dsh --profile web --dump-config 确认新插件在配置树里;③ 硬刷新浏览器;④ 确认已完整重启进程(不只是刷新页面)。

Q:能不能设置开机自启,避免手动重启问题? 可以用 systemd(Linux)或 launchd(macOS)配置服务,但需注意:服务重启时仍然需要旧进程完全退出后新进程才能绑定端口,建议在服务定义中加入 ExecStartPre=/bin/sh -c 'pkill -f "dsh web"; sleep 2'

Q:Harness 处于 developer preview 状态,端口行为会不会变? 官方明确表示"THERE WILL BE COMPATIBILITY-BREAKING CHANGES",当前的端口绑定行为和热重载边界在正式版本中可能调整。建议在生产环境使用前固定版本号(npx @deepseek-ai/dsh@x.x.x web)而非每次拉取 latest。


结语

DeepSeek Harness 的"修改插件后端口进不去"问题,本质是 Cordis 插件框架的架构边界——插件 Bundle 的增删需要进程级别的重启,而旧进程若未正确终止就会持续占用端口。官方 CLI reference 文档已明确这一行为,标准操作是:安装/删除/更新 Bundle 后,先 pkill -f "dsh web" 终止旧进程,再重新启动

临时换端口(--port 8080)是最快的应急方案,但长期来看建议配置一个一键重启脚本,并安装 dsh-startup-guard 预防因插件错误导致整体启动失败。

本文内容基于 deepseek-harness 官方 CLI reference(2026年8月24日)及社区实测,Harness 仍处于 developer preview 阶段,建议持续关注官方 GitHub 更新。


延伸阅读