Repository navigation
[Desktop] Startup fails permanently after ~70 launches: per-port dsh-auth-* cookies overflow Node 16 KB header limit (host returns 431)
#12585
beileibu322
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
环境
@deepseek-ai/dsh-desktop0.2.2-rc.1(Electron 44.7.0 / Chromium 152 / Node 24.21.0)desktop,DSH_HOMEC:\Users\youyo\.dshdownload.deepseek.com/dsh-desk/...,nightly 通道)现象
启动直接失败,弹出「DeepSeek Harness 无法使用」,
logs/crash-*-host.log:重试无效,永久失败;日志里没有任何指向真实原因的信息(无 401/431/网络错误),
用户从 UI 上无法自救(没有「清除本地会话」入口)。
根因
宿主每次启动绑定随机端口,桌面端签发的认证 cookie 名字绑定 host:port:
于是 每启动一次就多一条 cookie,且永不清理。单条实测 227 字节(name 52 B + value 173 B,
传输时连分隔符约 229 B)。累积到 约 70 条时,带 Cookie 的请求达到 16.4~16.6 KB,
超过 Node HTTP 服务端默认
maxHeaderSize = 16384,宿主返回:Electron 侧的
net.fetch拿到非 2xx,就抛出与真实原因无关的desktop welcome: Web authentication failed。同一条启动链路里,先在哪个请求上越线,就报哪个错误
authenticateWebHost()(Node fetch,不带 Cookie)先拿到 303 + Set-Cookie,这一步永远成功;随后 Chromium 带着全部 Cookie 依次请求 token URL、
/、/api/*(RPC)。启动链路上有三处会带 Cookie,越线发生在哪一处,错误文案就不同:
desktop welcome: Web authentication faileddesktop welcome: Web request failed两者根因相同,日志里都不出现
431。本机 A/B 对照实验(可复现,实测字节数)
用「归一化灌入 N 条同形状 cookie → 启动 → 抓 netlog」的方式做了三组对照
(cookie 形状与真实签发的一致:name 52 B + value 173 B ≈ 227 B/条):
//api/*RPCWeb request failed❌Web authentication failed❌结论:每多一条 ≈ +229 字节,越过 Node 默认
maxHeaderSize = 16384后启动必挂;60 条与 69 条的差异只在于「崩在第几个请求」。
为什么崩了之后永远修不好
越线的请求在签发新 cookie 之前就被 431 拒绝,所以计数不再增长、也永远降不下来 →
之后每次启动都稳定复现,用户没有任何 UI 手段可以清除这些 cookie。
证据
1. Chromium netlog(
--log-net-log=... --net-log-capture-mode=IncludeSensitive)2. Cookie 库统计(
Network/Cookies)3. 服务端本身完全正常(排除鉴权/令牌问题)
手工拉起宿主后直接 curl:
确定性复现(不需要真启动 70 次)
已在本机验证通过:应用完全退出后,向 cookie 库灌入 N 条形状相同的假 cookie,再启动即复现。
N = 60正常,N = 69报Web request failed,N = 70报Web authentication failed。启动即得到同样的
Web authentication failed(N=70)。(先备份
Network/Cookies;恢复时把dsh-auth-%行删掉即可。)建议的修复(按性价比排序)
启动时清理过期 authority 的 cookie(最省事,且能修复存量坏机器)
在
apps/desktop调connectDesktopWelcome之前,取出session.defaultSession.cookies.get({ url }),把名字匹配
dsh-auth-*但不属于当前 authority 的全部remove()。升级到修复版即可自动解除卡死。cookie 不再绑定端口
用固定名(如
dsh-auth)作用域到 origin host,authority 放到 cookie 值的 claim 里校验,从根上消除「每端口一条」的膨胀。
提高宿主头上限并区分错误
宿主是以参数启动的(
spawn(node, [--expose-internals, entry, ...])),加
--max-http-header-size=65536可立刻止血;同时把 431 与 401 区分开,别都落到「authentication failed」。
错误文案带上状态码
desktop welcome: Web authentication failed→ 建议附HTTP <status>,这次排查如果日志里有
431,定位时间可以从两小时缩到两分钟。用户侧临时绕过(供其他遇到的人参考)
完全退出应用后删除
%APPDATA%\@deepseek-ai\dsh-desktop\Network\Cookies(该库只有 127.0.0.1 的这类 cookie;账号登录态在
~/.dsh/.credentials.yaml,不受影响)。约 70 次启动后会复发。
影响面
不是个例:凡是长期使用桌面端(累计启动约 69
70 次,按每天 34 次约 3 周)的用户都会撞上,且表现为「昨天还好好的,今天突然打不开」,日志无有效信息,极易被误判为账号/网络/插件问题。
建议按「启动可靠性」优先级处理。
All reactions