DeepSeek Harness 端口冲突总览:dsh web 与桌面端的占用、改端口排查
DeepSeek Harness 的端口问题看起来只有一个症状「起不来」,但错误码分三类、修法完全不同:地址已在使用(被占)、权限被拒绝(权限或保留区间)、地址不可用(绑定地址不存在)。 顺序是先看错误码归类,再决定换端口还是处理占用者,最后确认绑定地址。三个入口各有自己的端口,冲突只发生在两个入口绑同一个端口时,改失败的那个即可。
DeepSeek Harness 的三种「端口不可用」要分清与三种处置
一句话结论:错误码决定了修法——认错类别会白折腾。
| 类型 | 典型提示 | 成因 | 修法 |
|---|---|---|---|
| 端口被占 | 地址已在使用 | 其它进程已绑定该端口 | 换端口 或 停占用者 |
| 权限 / 保留区间 | 权限被拒绝 | 低位端口、系统保留区间、非特权用户 | 换高位端口 |
| 地址不可用 | 无法绑定到指定地址 | 绑定的 IP 本机不存在(或已下线) | 修正绑定地址 |
- 别跳过归类这步:拿不到错误码时,先看启动输出的最后几行——它通常直接写明是哪一类。
- 三类都可能表现为「起不来」,所以「换端口试试」只能解决第一类与第二类的一部分。
方案 A:换端口(最快)
一句话结论:绝大多数情况下换端口比找占用者快得多——除非该端口已被写进反代配置或团队文档。
- 确认候选端口没人用(示例,macOS / Linux):
lsof -nP -iTCP:3180 -sTCP:LISTEN # 预期:无输出 = 该端口空闲
- 用新端口启动(参数名以
dsh web --help为准):
dsh web --host 0.0.0.0 --port 3180
# 预期:启动成功并打印监听地址
- 同步更新引用它的地方:反代配置、团队文档、书签——漏改一处就会表现为「服务正常但访问不到」。
- 验证:本机
curl -I http://127.0.0.1:3180有响应,再从反代/另一台设备访问一次。 - 挑选端口的建议:避开低位端口(权限)与常见服务端口(易撞),选 3000-9000 区间里不常用的一个。
方案 B:找出占用者并处理(要保留原端口时)
一句话结论:只有当端口被固定引用、必须复用时,才值得去查占用者——顺序是「查进程 → 判断能否停 → 再决定」。
- 查是谁在占:
# macOS / Linux
lsof -nP -iTCP:3080 -sTCP:LISTEN
# Windows(PowerShell)
# Get-NetTCPConnection -LocalPort 3080 | Select-Object OwningProcess
- 判断能否停:是上次没退干净的 DeepSeek Harness 进程 → 可以停;是别的服务 → 评估影响后再动。
ps -ef | grep -i dsh | grep -v grep # 确认是不是残留的 DSH 进程
- 停掉残留进程后再启动(优先用系统信号正常终止,不要一上手就强杀)。
- 验证:重启服务并确认端口已被自己占用(再次查
lsof应显示你的进程)。 - 顺手排查「为什么会有残留」:容器没删、上次异常退出、或同时开了多个入口——这三条是残留的主因。
方案 C:让端口分配避开保留区间(长期方案)
一句话结论:Windows 上「没人占用却起不来」多半是端口落在动态/保留区间——查清区间并固定用区间外的端口即可根治。
- 了解本机保留区间(Windows 可用系统自带命令查看动态端口范围,具体命令以官方文档为准)。
- 把 DeepSeek Harness 的端口固定在保留区间之外,并写进启动脚本,避免每次随机。
- 容器场景另有一层:容器内若以非 root 运行,低位端口同样绑不了——统一改用高位端口。
- 把端口写进文档:团队共享时,端口是配置的一部分,写清能避免「每人一个端口」导致的混乱。
- 验证:重启机器后再启动一次,确认不再出现权限类失败(重启最容易复现这类问题)。
DSH plugin 三个入口的端口关系
一句话结论:CLI、桌面端、dsh web 各有端口,冲突只发生在绑同一个端口时——改失败的那一个就够了。
| 入口 | 端口行为 | 常见冲突场景 |
|---|---|---|
| CLI | 常规情况下不长期占监听端口 | 与后台任务、脚本并发时偶有占用 |
| 桌面端 | 自有服务端口(可能随机或固定) | 与 dsh web 撞同一端口 |
dsh web | 由启动参数决定(默认与自定义) | 与以上两者或第三方服务撞端口 |
- 先确认哪个入口失败,只处理它——三个都改反而会引入新问题。
- 不要给两个入口配同一个端口,这是最直接的冲突来源。
- 反代在场时:反代监听一个端口、
dsh web监听另一个,两者不能相同(配置见 给 dsh web 配反向代理与 HTTPS)。 - 容器场景:宿主端口与容器内端口是两件事,映射关系写错也会表现为「端口冲突/连不上」(见 DeepSeek Harness 容器化安装)。
DeepSeek Harness 端口排查三步与判据表
一句话结论:归类 → 查占用 → 验绑定地址,三步走完必有结论。
- 第一步(归类):看启动输出里的错误码/提示,对照第一节三类。
- 第二步(查占用):
lsof(POSIX)或Get-NetTCPConnection(Windows)确认端口状态。 - 第三步(验地址):
ipconfig/ip addr确认你绑定的地址在本机存在(写错 IP 会出现「地址不可用」)。 - 判据表:
| 现象 | 结论 | 下一步 |
|---|---|---|
| 报地址已在使用 + lsof 有进程 | 被占 | 换端口或停占用者 |
| 报权限被拒绝 + 端口 < 1024 | 权限 | 换高位端口 |
| 报权限被拒绝 + 端口在保留区间 | 保留区间 | 换到区间外 |
| 报地址不可用 | 绑定地址错 | 修正绑定地址 |
- 验证修复:重启服务并实际访问一次,而不是只看启动输出没有报错。
DSH plugin 排查注意事项
一句话结论:端口问题与插件无关——先把它排除掉,再去查插件侧,能省一半时间。
- 服务起不来是端口层问题;服务能起但插件功能异常才是插件层问题(见 DeepSeek Harness 插件冲突总览)。
- 别急着改鉴权配置:端口类失败与鉴权无关,混着改会让问题更难定位。
- 容器里先分清宿主端口与容器端口,映射写错常被误报为冲突。
- 团队共享时把端口写进文档,并保留一个备用端口。
- 重启能复现的问题要记下来:只在重启后出现的端口失败,多半与保留区间或开机自启服务抢占有关。
- 修复状态如实:本文三类错误码的分类与处置属通用操作系统行为的归纳;DeepSeek Harness 侧的具体默认端口与参数名请以你机器上
dsh web --help的输出为准,Windows 保留区间的查看命令以微软官方文档为准确来源。
如果 dsh web 暂时起不来,也可以先用桌面端或 CLI 顶上,并在 DSH Plugin Hub 里确认插件状态——端口问题不该阻塞你手头的事。

只遇到 3080 被占用这一种情况,可直接看3080 端口冲突的定位与释放。
来源:apps/cli/README.md、apps/desktop/README.zh.md、Microsoft Learn · netsh。
常见问题
在 DeepSeek Harness 里,看错误码分三类:提示「地址已在使用」是端口被别的进程占了;提示「权限被拒绝」是权限不足或端口落在系统保留区间;提示「地址不可用」通常是绑定的地址在本机不存在。三类修法完全不同——第一类换端口或停占用者,第二类换到高位端口,第三类检查绑定地址写对没有。
在 DeepSeek Harness 里,用系统自带的端口查询工具列出占用该端口的进程,再决定是停掉它还是换端口。多数情况下最快的解法是换一个端口启动 dsh web,而不是花时间排查占用者;只有当你必须保留该端口(例如已经写在反代配置或团队文档里)时才值得去动占用者。
在 DeepSeek Harness 里,因为低位端口(通常指 1024 以下)需要更高权限才能绑定。在容器里以非 root 用户运行、或在本机以普通用户运行时,绑低位端口会被拒。解决办法是改用高位端口,或者(不推荐)以更高权限运行——后者会放大安全风险,通常不值得。
在 DeepSeek Harness 里,可能是端口落在系统的动态端口范围或保留区间里,这类端口不会被普通程序占用但仍会拒绝绑定,且返回的往往是权限类错误码,看起来像「权限问题」。处置方式是换一个明显在保留区间外的端口,或按官方文档了解本机保留区间的查看方式后避开它。
在 DeepSeek Harness 里,取决于各自绑定的端口:如果三者都绑不同端口就不会冲突;如果都尝试绑同一个默认端口,后来者会失败。排查时的关键是先确认「谁先占了哪个端口」,再看失败的是哪一个入口;改端口只改失败的那一个即可,不必三个都动。
相关术语
- 端口占用(EADDRINUSE)
- 端口占用指某个端口已被其它进程绑定,新进程再绑同一端口会被拒绝。它是 DeepSeek Harness 启动失败最常见的一类原因,修法是换端口或停止占用进程。— https://learn.microsoft.com/windows-server/networking/technologies/netsh/netsh-introduction
- 权限型绑定失败(EACCES)
- 权限型绑定失败指因权限不足或端口处于系统保留区间而无法绑定端口,通常出现在低位端口或系统受限区间。它的修法是改用高位端口,而不是反复重试。— https://learn.microsoft.com/windows-server/networking/technologies/netsh/netsh-introduction
- 动态端口 / 保留区间(dynamic and reserved ranges)
- 动态端口与保留区间是操作系统为临时连接或特定服务预留的端口范围,普通程序绑定这些端口可能失败。它解释了「没人占用却仍起不来」这类看似矛盾的现象。— https://learn.microsoft.com/windows-server/networking/technologies/netsh/netsh-introduction
- 绑定地址(bind address)
- 绑定地址是服务监听的本机接口地址。地址写错(例如填了本机不存在的 IP)会导致「地址不可用」,这也是三类端口问题中最容易被忽略的一类。— https://github.com/deepseek-ai/deepseek-harness/blob/master/apps/cli/README.md
来源
- deepseek-ai/deepseek-harness — apps/cli/README.md(dsh web 端口与绑定参数)· deepseek-ai(GitHub)
- deepseek-ai/deepseek-harness — apps/desktop/README.zh.md(桌面端端口与更新路径)· deepseek-ai(GitHub)
- Microsoft Learn — Windows 服务的动态端口范围与保留区间(netsh 相关说明)· Microsoft