AI News HubLIVE
站内改写2 分钟阅读

Show HN:Concord,一些开源内容

Concord 认知引擎的 PR 修复了裸机部署、连接断开、LLM 管道稳定性和运维耐久性问题,包括静态资源持久化、状态保存优化、安全漏洞修复和 GPU 内存管理。

来源Hacker News AI作者: dutchtropez

近日,Concord 认知引擎项目发布了一个重要的 PR,解决了其从 Docker 迁移到裸机部署时遇到的一系列问题。该 PR 涵盖了基础设施、性能、安全性和可靠性等多个方面的改进,分为多个波次逐步实施。

第一波主要解决了裸机部署的阻塞问题。首先修复了静态资源无法加载的 bug,确保 Next.js 前端在启动时正确复制静态文件到独立 bundle 中,避免了页面无样式渲染。其次,Cloudflare 隧道配置得到修正,此前由于环境变量命名错误(CF_TUNNEL_TOKEN 未读取)导致隧道静默未启动,现改为 CLOUDFLARE_TUNNEL_TOKEN 并重写了入口规则,使 /socket.io、/godot-ws 和 /api 直接路由到后端 :5050,其余流量指向前端 :3000。同时,系统服务配置进行了优化,以支持重启后持久化:pm2 resurrect 无法恢复五个 Ollama 大脑,因此添加了 startup.sh 在重启时重新运行。还新增了 bootstrap.sh 用于新机器的一键部署。此外,嵌入模型被移到了专门的实用实例上,不再占用推理用的显存,避免了之前每次嵌入调用都会卸载约 9GB 的 14B 模型、导致聊天时频繁冷加载的问题。

第二波和第三波着重解决了连接频繁断开的问题和安全性改进。后端方面,移除了每 2 分钟无条件执行的全状态保存器(每次约 28MB 序列化+SQLite 重写+WAL 检查点,导致每天约 40GB 磁盘写入和事件循环阻塞),改为基于变化序列的 5 秒前窗合并机制,将稳态序列化次数降低约 20 倍。关键状态保存增加了速率限制(2 秒窗口+尾部追赶同步),避免市场购买爆发时多次全量序列化。强制垃圾回收也被移除,因为它会加长事件循环阻塞。Godot 网关的 ping 检测调整为允许丢失 2 次 pong(约 50 秒),匹配 socket.io 的 60 秒预算,解决了之前因事件循环延迟导致误杀所有 Godot 客户端的问题。前端连接状态检测不再依赖可能被代理绕过的 /health 轮询,而是使用 socket 的 onConnectionLost/onReconnected 生命周期。安全方面修复了一个关键漏洞:用户通过作业队列提交的任务原本会获得内部上下文特权,可绕过权限检查(如跳过议会门控),现在用户作业只使用其自身权限。此外,生产环境禁用了速率限制绕过开关,为 /metrics 接口添加了令牌保护,并将 Stripe Webhook 路径豁免于速率限制,以避免支付回调失败。

第四波聚焦于 LLM 管道的稳定性。嵌入模型不再逐出 14B 意识大脑(已由第一波解决)。关键改进是现在在所有 Ollama 调用路径上显式发送 num_ctx 参数,之前每个调用都静默使用 Ollama 的 2k/4k 小默认值,导致提示被截断。VRAM 预算经过重新计算,KV 缓存现在按配置的上下文大小合理扩展,之前由于错误假设而过度配置的显存(设为 16384 MB)已被修正为 8192 MB。路由方面,ctx.llm.chat 现在在本地路由中尊重请求的 slot,避免工具或潜意识工作消耗 14B 意识模型。流式聊天(默认聊天 UX)现在通过 BYOK 和 _llmQueue 以 CRITICAL 优先级进行,而不是之前未受保护的原生 fetch。LLM 队列为 CRITICAL 预留了一个并发槽,防止后台任务占满所有槽导致实时聊天请求无槽可用。

第五波增强了运维耐久性。健康检查增加了对挂起但在线进程的强制重启机制,并带有 10 分钟宽限期(避免迁移中途被杀)和 5 分钟冷却期(避免反复重启)。迁移编号解析修复:原正则只匹配三位数,当迁移号达到四位数(如 1000)时被错误解析为 100 并静默跳过,现已改为可变宽度捕获和数值排序。SQLite 页面大小设置的错误被纠正:之前设置 page_size 在 WAL 模式之后执行(实际无效),现移除该设置并重新计算 wal_autocheckpoint。还修复了两个硬编码 busy_timeout 的数据库句柄。告警 Webhook 配置统一为单一变量 ALERT_WEBHOOK_URL。

这些修复显著提升了 Concord 在裸机环境中的稳定性和安全性,为后续开发奠定了坚实基础。