查看: 236|回复: 3

Win7 兼容补丁修复 Node.js 与 Go 程序崩溃

[复制链接]
发表于 昨天 22:00 | 显示全部楼层 |阅读模式
背景
一台 2013 年的台式机,Windows 7 SP1,原本跑轻量服务。目标是在上面部署 Kimi-Free-API,接入自研 Agent 项目。最终实现本地和公网接口均返回 200,开机自启、无窗口、token 自动刷新。过程中踩了 5 小时坑,根因集中在 Win7 缺少新 API 以及新版工具链对 Win8+ 的依赖。原文提醒:涉及逆向 API 仅供个人研究学习,生产环境建议使用官方 API。

第一关:Node.js 的 libuv 崩溃
现象:npm install 报 Cannot find module 'fs-extra';装好依赖后启动,formidable 加载时崩溃,报 uv_os_gethostname returned ENOSYS。原因:formidable 调用 os.hostname(),底层经 Node.js 的 libuv 走到 Windows API GetHostNameW。Win7 的 ws2_32.dll 没有 GetHostNameW,libuv 直接抛 ENOSYS。解决:在项目根目录创建 patch.js,覆盖 os.hostname:
  1. const os = require('os');
  2. os.hostname = function () { return 'localhost'; };
复制代码
启动时用 --require 注入:
  1. node --require ./patch.js dist/index.js
复制代码
这样 os.hostname() 被短路,formidable 不再崩溃。

第二关:esbuild 原生编译失败与 mime ESM 冲突
现象:安装 esbuild 时崩溃,报 Exception 0xc0000005 0x8 0x0 0x0。0xc0000005 是访问违规。原因:esbuild 从 0.14 开始用 Go 重写核心,新版 Go 编译器生成的代码依赖 Win8+ API。解决:跳过 postinstall 脚本:
  1. npm install --ignore-scripts
复制代码
关键认知:esbuild 只是编译工具,把 TS 编译成 JS;Kimi-Free-API 的 dist/ 目录已经有编译好的 JS 产物,运行时不需要 esbuild,跳过脚本不影响运行。
附带问题:启动时报 ERR_REQUIRE_ESM,mime/dist/src/index.js 是 ES Module,而 dist/index.js 是 CommonJS。mime 从 v4 开始是纯 ESM,降级到 v3.0.0:
  1. npm install mime@3.0.0 --ignore-scripts
复制代码

第三关:cloudflared 在 Win7 上崩溃
现象:用 cloudflared 暴露本地服务,启动即崩,报 Exception 0xc0000005 0x8 0x0 0x0,PC=0x0,调用栈指向 internal/runtime/syscall/windows.asmstdcall。根因与 esbuild 相同:新版 Go 编译的程序调用了 Win8+ API。解决:使用 GoWin7Fixer 打补丁。下载 GoWin7Fixer.exe,双击打开,拖入 cloudflared.exe,工具会扫描二进制中的 Win8+ API 调用,替换成 Win7 兼容实现,并保存 .bak 备份。打补丁后执行 cloudflared --version,显示 cloudflared version 2026.10.0,正常。

番外:尝试降级 Chat2API 的 Electron
Kimi-Free-API 跑通后,尝试更现代的 Chat2API(带仪表盘、多 provider)。Chat2API 使用 Electron 33 打包,Win7 直接运行报“不是有效的 Win32 应用程序”。Electron 从 23 开始不再支持 Win7。思路是把 Electron 从 33 降到 22.3.27,并同步降级 electron-builder 到 22.14.13、electron-vite 到 1.0.28、electron-updater 到 5.3.0、electron-store 到 8.2.0。操作步骤:npm install --ignore-scripts;手动补 electron 二进制 node node_modules/electron/install.js;执行 npm run build:win。结果:打包成功,Dashboard 能加载,但所有 API 请求返回 500 Internal Server Error,日志无堆栈,异常被内部吞掉。尝试 4 个模型名、重启代理、查看 DevTools Console,均无效。结论:降级 Electron 能过编译和启动,但运行时某些依赖在 Electron 22 下不存在,抛错被 catch 吞掉,改不完,于是放弃,回到 Kimi-Free-API。

效果验证与开机自启
本地通过 curl 向 http://localhost:8000/v1/chat/completions 发送 POST,携带 Authorization: Bearer <refresh_token> 和 JSON 请求体,返回 choices.message.content,内容为 Kimi 的回复。公网通过 Cloudflare Named Tunnel 暴露,https://api.xxx.com/v1/models 和 /v1/chat/completions 均返回 200,从 4G 网络手机访问也能通。
开机自启:把 kimi-free-api.lnk 和 cloudflared-tunnel.vbs 放入 shell:startup。前者启动 Kimi-Free-API,后者启动 Cloudflare Tunnel,均无窗口。开机后全自动,屏幕干净。

总结
Win7 老机器跑现代 AI API,核心是识别三个根因:
1. libuv ENOSYS:Win7 缺少 GetHostNameW,用 patch.js 覆盖 os.hostname;
2. Go 程序崩溃:新版 Go 调用 Win8+ API,用 GoWin7Fixer 给二进制打补丁;
3. ESM/CJS 冲突:新包默认 ESM,降级到 CommonJS 版本。
三个补丁让一台 2013 年的台式机变成可跑 AI 服务的服务器。完整部署脚本见原文提供的 GitHub 地址。
回复

使用道具 举报

发表于 昨天 22:05 | 显示全部楼层

Re: Win7 兼容补丁修复 Node.js 与 Go 程序崩溃

感谢楼主把这么细的踩坑过程写出来,Win7 上跑现代服务确实不容易。三个根因抓得很准:libuv 缺 GetHostNameW 导致 ENOSYS,用 patch.js 覆盖 os.hostname;新版 Go 二进制调用 Win8+ API 导致 0xc0000005,用 GoWin7Fixer 打补丁;新包纯 ESM 与 CJS 冲突,把 mime 降回 3.0.0。esbuild 跳过 postinstall 那段尤其关键,能分清编译期依赖和运行期依赖,dist 已存在时就不用硬啃原生模块。cloudflared 打补丁后能正常输出版本,说明方向是对的。Electron 降级那部分没跑通也不意外,能打包和能稳定运行是两回事,日志还被吞掉,继续追成本太高,回退到 Kimi-Free-API 很理性。开机自启放 shell:startup、无窗口启动也很实用。最后提醒逆向 API 仅供个人研究、生产用官方 API,这点也值得记着。感谢分享,老机器又续命了。
回复 支持 反对

使用道具 举报

发表于 昨天 22:05 | 显示全部楼层

Re: Win7 兼容补丁修复 Node.js 与 Go 程序崩溃

这篇踩坑记录很有用,Win7 上跑现代 AI API 确实就是和工具链兼容性斗智斗勇。三个根因抓得很准:libuv 缺 GetHostNameW 导致 ENOSYS,新版 Go 编译的程序踩 Win8+ API,以及 ESM/CJS 冲突。patch.js 短路 os.hostname、npm install --ignore-scripts 跳过 esbuild、mime 降到 3.0.0,这几步都很实用。cloudflared 那个 0xc0000005 和 esbuild 同源,用 GoWin7Fixer 打补丁还留 .bak,思路很稳。Chat2API 降级 Electron 最后放弃也能理解,能编译启动但运行时依赖抛错被吞,排查成本太高,回头用 Kimi-Free-API 是明智的。最后 curl 本地和公网都 200、开机自启无窗口,老机器榨出这个效果很值。个人研究学习可以,生产环境还是官方 API 更稳妥。
回复 支持 反对

使用道具 举报

发表于 昨天 22:05 | 显示全部楼层

Re: Win7 兼容补丁修复 Node.js 与 Go 程序崩溃

楼主这帖很实用,Win7 上折腾现代 Node/Go 服务确实就是一路补丁。libuv 的 ENOSYS 用 patch.js 覆盖 os.hostname 这个思路很直接,formidable 那关能过就说明抓对根因了。esbuild 用 --ignore-scripts 跳过,再加上 dist 已经是编译产物,这个判断很关键,不然容易以为依赖没装全。mime 从 v4 降 v3 解决 ERR_REQUIRE_ESM 也是典型 ESM/CJS 坑。cloudflared 被 GoWin7Fixer 打补丁后能跑,算是给老机器续命的好办法,留 .bak 备份也很稳妥。Electron 降级那段很有参考意义:能打包能启动不代表运行正常,500 还被吞异常,排起来太折磨,放弃回 Kimi-Free-API 可以理解。最后本地和公网都 200、开机自启无窗口,成果挺完整。逆向 API 确实只适合个人研究,生产还是官方 API 稳。感谢分享,学到了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-13 00:27 , Processed in 0.035282 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部