🎉

Opencode-CN on Node.js — 大功告成!

从 Bun 生态彻底移植到 Node.js 22,服务器 8099 端口稳定运行,返回完整 HTML 文档 ✅

15
改造项
14
数据库表
8099
监听端口
📊 最终状态

最终状态报告

pnpm install 1293包
bun:* 模块全部替换为 Node(20+处)
.txt 文件导入改为内联(20处)
@opentui/core 5个bundle bun:ffi✅ stub
循环依赖 __name is not a function✅ 惰性初始化
Migration路径错误 src/migration✅ import.meta.dirname
Migration SQL 分隔符处理✅ statement-breakpoint
db.run() 不能跑多语句✅ $client.exec()
14张数据库表全部创建✅ project,message,session...
服务器 HTTP 200 响应✅ 端口 8099
🏗️ 架构迁移

改造清单

🔴
bun:* 模块导入
全部替换为 Node.js 等价物 — node:sqlite, fs, path
🔴
.txt 文件导入(20处)
脚本批量内联为模板字符串
🟡
Bun.stringWidth()(3处)
替换为 .length
🔴
Bun.file() / Bun.write()
替换为 fs 操作
🔴
import.meta.dirname
替换为 import.meta.filename + dirname
🟢
@opentui/core 中 5 处 bun:ffi 导入
全部 stub 为 throw Error("native not available")
🟢
@opentui/solid bun 包依赖
2 处 stub 为 const registerBunPlugin = () => {}
🟢
@opentui/core-linux-x64 top-level await
替换为返回 libopentui.so 路径
🟣
循环依赖 __name is not a function
解除 instance.ts 顶层 makeRuntime() 调用,改为惰性初始化
🟡
pnpm workspaces / catalog: 引用
全部硬编码实际版本号
🗄️ 数据库迁移

数据库迁移全记录

🟢
Migration路径修正
Bun 的 import.meta.dirname 替换为 Node.js 的 import.meta.filename + dirname,修正 src/migration 路径查找
🟢
SQL 分隔符处理
Drizzle Kit 生成 SQL 用 --> statement-breakpoint 分隔多条语句,需分割后逐条执行
🟢
db.run() → $client.exec()
Node.js node:sqlitedb.run() 不支持多语句,需改为 $client.exec()

🚀 大功告成!国内首个 Node.js 上的 Opencode

从 Bun 生态移植到 Node.js 的改造涉及了大量底层工作——@opentui/core@opentui/core-linux-x64 等依赖深度依赖 Bun 的 bun:ffiimport...with{type:"file"}、top-level await 等特性,需要逐个 patch。数据库层也需要适配 node:sqlite 的 API 差异。

🔥 pnpm install 1293 包 ✅
🔥 20+ 处 bun:* 模块替换 ✅
🔥 14 张数据库表全部创建 ✅
🔥 服务器 HTTP 200 响应 ✅

最终服务器成功跑起来,Web 界面正常渲染 ✅
这是国内首个在 Node.js 上跑起来的 Opencode 发行版,摆脱了对 Bun 运行时的依赖。

⚙️ 服务化部署

Systemd 服务化

systemd 服务opencode-cn.service ✅
开机自启enabled ✅
当前运行active (running) ✅
端口监听127.0.0.1:8099 ✅
HTTP 响应200 OK ✅
内存占用~270MB(tsx开发模式)

# 服务管理命令

# 状态查看
sudo systemctl status opencode-cn

# 停止/启动/重启
sudo systemctl stop opencode-cn
sudo systemctl start opencode-cn
sudo systemctl restart opencode-cn

# 查看日志
sudo journalctl -u opencode-cn -n 50 -f

# 服务文件位置

# 服务文件
/etc/systemd/system/opencode-cn.service

# 工作目录
/opt/opencode-cn-v106/packages/opencode

# 数据库
/root/.local/share/opencode/opencode-local.db