mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-21 01:32:44 +08:00
169 lines
7.7 KiB
Markdown
169 lines
7.7 KiB
Markdown
# ADR-0006:Node.js 24 与多架构支持分层
|
||
|
||
- 状态:Proposed
|
||
- 日期:2026-07-18
|
||
- 决策者:QingLong Maintainers
|
||
- 关联 RFC:[QL-RFC-0001](../QINGLONG_3_0_ARCHITECTURE_RFC.md)
|
||
- 关联决策:D-05、D-14、D-16、D-17
|
||
|
||
官方参考:
|
||
|
||
- [Node.js v24.18.0 release binaries](https://nodejs.org/en/blog/release/v24.18.0)
|
||
- [Node.js official Docker image manifest](https://github.com/docker-library/official-images/blob/master/library/node)
|
||
- [Node.js supported platforms](https://github.com/nodejs/node/blob/main/BUILDING.md)
|
||
- [Node.js 24 node:sqlite](https://nodejs.org/download/release/latest-v24.x/docs/api/sqlite.html)
|
||
|
||
## 1. 上下文
|
||
|
||
QingLong 当前发布矩阵包含 `amd64`、`arm/v6`、`arm/v7`、`arm64`、`ppc64le`、`s390x` 和 `386`。这些架构不仅是 CI 标签,也代表真实的路由器、NAS、旧服务器和异构节点用户。
|
||
|
||
QingLong 3.0 同时提出:
|
||
|
||
1. ql-core 固定 Node.js 24 LTS,使用一致的 Web/SQLite 行为。
|
||
2. 优先保持现有多架构覆盖,不让小设备成为二等部署环境。
|
||
|
||
截至 2026-07-18,上游供给不能同时满足这两个承诺:
|
||
|
||
- Node.js 24 官方 release binary 提供 x64、arm64、ppc64le、s390x,不提供 ARMv6、ARMv7 或 386。
|
||
- 官方 Node 24 Docker image 的架构集合还会因 Debian/Alpine variant 不同而变化。
|
||
- Node.js BUILDING 将 ARMv7 列为实验级平台;ARMv6 和 32-bit x86 不属于 Node 24 官方发布基线。
|
||
- `node:sqlite` 属于 Node 运行时本身,不能在缺少受支持 Node 24 的架构上单独安装来解决问题。
|
||
|
||
因此,“所有现有架构继续发布 3.0”与“所有 3.0 都是官方 Node 24”当前是冲突目标。继续依赖 Alpine 仓库的浮动 `nodejs` 只会隐藏差异,不能解决冲突。
|
||
|
||
## 2. 决策
|
||
|
||
3.0 使用显式支持 Tier,不再用一个无条件 multi-arch manifest 暗示所有平台获得同等测试、恢复和安全承诺。
|
||
|
||
### 2.1 Tier 1:正式支持的 ql-core
|
||
|
||
候选架构:
|
||
|
||
- `amd64`
|
||
- `arm64`
|
||
- `ppc64le`,前提是选定镜像 variant 有固定 Node 24 产物并通过数据库门禁
|
||
- `s390x`,前提同上
|
||
|
||
要求:
|
||
|
||
- 固定同一 Node 24 exact patch,不从发行版仓库浮动安装 Node。
|
||
- 每个 libc/arch 组合通过安装、启动、migration、backup/restore、最小任务和 edge 资源门禁。
|
||
- 发布 manifest 只包含实际通过门禁的组合;不能为追求列表完整度加入未验证平台。
|
||
- 安全更新升级 Node patch 后重新运行完整矩阵。
|
||
|
||
### 2.2 Tier 2:实验支持
|
||
|
||
ARMv7 只有在项目拥有以下全部资产时才发布 3.0 experimental image:
|
||
|
||
- 可重复且受版本控制的 Node 24 toolchain/build recipe。
|
||
- 独立设备或可信模拟环境上的启动、SQLite、任务和恢复测试。
|
||
- 明确标注无上游官方 binary、支持周期和已知限制。
|
||
- 不阻塞 Tier 1 安全更新,不进入默认 `latest` manifest。
|
||
|
||
仅在某台 Maintainer 设备上构建成功,不足以进入 Tier 2。
|
||
|
||
### 2.3 Legacy-only
|
||
|
||
ARMv6、386,以及未通过 Node 24 门禁的 ARMv7 继续由有明确 EOL 的 2.x legacy support line 服务。它们不得被标记成满足 D-16 的完整 3.0 ql-core。
|
||
|
||
Legacy-only 不是静默停止维护:
|
||
|
||
- 继续接收约定窗口内的安全、任务执行和数据兼容修复。
|
||
- 升级页必须在修改数据库前说明设备无法进入完整 3.0 的原因与可选路径。
|
||
- 2.x 数据库保持可备份、可导出,未来迁移到受支持 3.0 控制面时不锁死。
|
||
|
||
### 2.4 老设备参与 3.0 集群
|
||
|
||
旧架构设备仍可作为执行节点参与 3.0,但不能假装运行完整 ql-core:
|
||
|
||
- 短期:由受维护的 2.x 节点通过明确兼容协议接收受限任务;协议范围、身份和 EOL 另行 ADR。
|
||
- 长期:评估不依赖 Node 控制面的轻量 Worker Agent;在安全模型、升级成本和资源基准成立前不承诺实现语言。
|
||
- 控制面必须展示 Worker 的 arch、runtime、capability、协议版本和支持 Tier,调度前阻止不兼容任务。
|
||
- Legacy Worker 不获得插件 Host、任意 Tool 或控制面数据库访问权。
|
||
|
||
该路径保留旧路由器的执行价值,但不把完整 Web/API/数据库控制面复制到无法获得受支持运行时的平台。
|
||
|
||
## 3. 发布命名与元数据
|
||
|
||
每个镜像/二进制至少声明:
|
||
|
||
qinglongVersion
|
||
nodeVersion
|
||
architecture
|
||
libc
|
||
deploymentProfiles
|
||
supportTier
|
||
databaseDriver
|
||
builtAt
|
||
|
||
建议 tag 语义:
|
||
|
||
next / 3.0.x 只指向 Tier 1 manifest
|
||
3.0.x-experimental-* 单独的 Tier 2 tag,不进入 latest
|
||
2.x-legacy-* 明确 legacy line 与 EOL,不冒充 3.0
|
||
|
||
UI、诊断包和升级日志必须展示这些字段,不能只输出应用版本号。
|
||
|
||
## 4. 为什么不把 Node 22 作为隐式 3.0 回退
|
||
|
||
Node 22 能覆盖更多 32-bit ARM 镜像,但把同一个 3.0 tag 在不同架构上静默切换 Node major 会造成:
|
||
|
||
- `node:sqlite` API/stability/options 不一致。
|
||
- 数据库 adapter、备份和 defensive mode 行为分叉。
|
||
- 插件 engine、Web API 和安全修复周期不同。
|
||
- 用户无法从版本号判断真实能力。
|
||
|
||
若 Maintainers 决定让 Node 22 成为正式 3.0 compatibility runtime,必须先修改 D-16,并为两条 runtime 建立独立 capability 与测试矩阵;不能作为 Dockerfile 中的条件分支偷偷发生。
|
||
|
||
## 5. 被拒绝的方案
|
||
|
||
### 5.1 继续从 Alpine 仓库安装浮动 nodejs
|
||
|
||
同一 QingLong tag 会随构建时间获得不同 Node major/patch,无法重现数据库和插件行为。
|
||
|
||
### 5.2 QEMU 构建成功即视为支持
|
||
|
||
交叉构建不能覆盖真实内核、seccomp、VFS、内存压力、信号和断电恢复行为。QEMU 可以是 smoke 层,不能替代设备门禁。
|
||
|
||
### 5.3 为了 multi-arch 数量放弃 Node 24 固定基线
|
||
|
||
这会把运行时差异转嫁给数据库、插件和用户,且没有清晰支持边界。若要修改 Node 基线,应显式修订 RFC,而不是由镜像脚本决定架构政策。
|
||
|
||
### 5.4 立即新增另一种语言的 Worker
|
||
|
||
轻量 Worker 可能是长期方向,但现在决定语言会扩大构建、协议、安全和维护面,且不能替代 3.0 控制面核心切片。
|
||
|
||
## 6. 影响
|
||
|
||
正面:
|
||
|
||
- 发布承诺与上游运行时供给一致。
|
||
- ARMv7/ARMv6/386 用户能在升级前看到真实路径和支持周期。
|
||
- Node patch、数据库 driver 与恢复报告可重现。
|
||
- 集群调度可以基于真实 capability,而不是只看 arch 字符串。
|
||
|
||
负面:
|
||
|
||
- 完整 3.0 的首发架构可能少于 2.x。
|
||
- 若维护 ARMv7 experimental,需要额外 toolchain、设备和安全成本。
|
||
- Legacy line 与兼容 Worker 协议会增加一段时间的双线维护。
|
||
|
||
## 7. 进入 Beta 的门禁
|
||
|
||
1. Maintainers 明确接受、修改或拒绝本 Tier 方案。
|
||
2. 发布流水线固定 Node 24 exact patch,不使用浮动发行版 Node。
|
||
3. Tier 1 的每个 arch/libc 组合有可重复 CI 或设备报告。
|
||
4. ARMv7 是否进入 Tier 2 有明确 owner、toolchain 和支持周期;否则归入 legacy-only。
|
||
5. ARMv6、386 的 2.x EOL、迁移和备份说明可见。
|
||
6. 镜像、UI 和诊断信息能展示 supportTier、Node、arch、libc 和 databaseDriver。
|
||
7. 多架构 manifest 不包含未通过门禁的组合。
|
||
|
||
## 8. 接受标准
|
||
|
||
- 接受 3.0 架构支持按 Tier 声明,而不是无条件延续旧 manifest。
|
||
- 接受 Tier 1 固定官方 Node 24 exact patch。
|
||
- 接受 ARMv7 只有在自维护 toolchain 和设备门禁齐备后才能作为 experimental 发布。
|
||
- 接受 ARMv6、386 默认进入有 EOL 的 2.x legacy line,而不是伪装成 Node 24 3.0。
|
||
- 接受旧设备可通过受限 Worker 兼容路径参与 3.0,但不拥有完整 ql-core 权限。
|
||
- 接受任何 Node 22 的 3.0 compatibility runtime 都必须先显式修订 RFC。
|