H2(用官方 LXC cloud 镜像建客户容器)随 2026.10.29.5 发布,部署到全部六台机器。H4 做完了:每台容器主机上一个 node 模块,面板通过 HTTPS JSON 接口(端口 9443,钉住自签证书)认领主机、加载镜像、创建 / 启动 / 停止 / 重启 / 重装 / 删除容器、改密码和限制。按设计文档没有新的内核接口,这次更新不用重启。
images 和 rustros-init 程序。inst create 建的,重启后不会自动回来,所以那个测试地址现在不通。有了 H4 以后,用面板接口建的容器会持久存在,重启后自动起来。端点 POST https://<主机的底层网络地址>:9443/v1/op,请求体是 {"op": "...", ...},回答 {"ok": true, ...} 或 {"ok": false, "error": {"code", "message"}}。完整字段见 docs/hosting-design.md 的 H4 一节。
cfg node listen <底层网络地址>(不设就不监听)。mod node claim,或在管理机上运行 rustros-update.py HOST mod node claim:得到 8 位认领码(10 分钟有效,错 5 次就关闭)和证书的 SHA-256。node.claim {"code": "1234-5678", "pubkey": ..., "comment": ...},带上它自己的 Ed25519 公钥(私钥只在面板),主机把它记进授权密钥列表。以后每个请求都用这把私钥签名:Authorization: RR-Ed25519 ts=...,nonce=...,sig=...,签的是 rustros-op-v1、证书指纹、时间、随机数、请求体的 SHA-256 五行。主机检查时间差不超过 60 秒、随机数 120 秒内没用过、签名属于列表里的某把密钥。面板同时钉住证书指纹。证书第一次启动时生成,换模块、换内核都不变;mod node cert renew 换新证书。key.add / key.delete 轮换(先加新的,用新的发一次请求,再删旧的),最后一把不能删(last_key);控制台上 mod node keys、mod node key add / delete,mod node reset 清空后要重新认领。这个方案是面板那边定的(替换了我原来的令牌方式)。| 操作 | 做什么 |
|---|---|
key.list / add / delete | 授权密钥:列出(注释、权限、添加和最后使用时间)、添加、删除 |
node.info | 版本、CPU、已分配给容器的内存、磁盘总量和剩余、容器数 |
image.load / list / delete | 按 URL 和 SHA-256 下载镜像并导入(后台进行,状态 loading → ready / failed);正在用的镜像不能删 |
ct.create | 名字、镜像、IPv4(routed /32)、限制(cpu、mem_mib、disk_gib、procs)、SSH 公钥、root 密码,可选 dns、apt_proxy;同样的请求再发一次答 ok,字段不同答 conflict,地址被占答 conflict |
ct.get / list | 状态 creating / running / stopped / failed,uuid、创建时间、启动时间、限制、用量(CPU 核数、内存、磁盘、进程数) |
ct.start / stop / restart | 停止先发 SIGTERM,超过 timeout_s(默认 30 秒)再强制结束 |
ct.reinstall | 换镜像重装:旧文件全部清掉,名字、uuid、地址、限制保留,公钥和密码可以重新给 |
ct.set_limits | 运行中直接生效,不重启 |
ct.set_password | 运行中直接生效,不重启(在容器里运行一次 rustros-init apply) |
ct.set_addr | 换地址:容器会重建(重启一次) |
ct.delete | 停止、删掉容器和它的全部数据 |
node_test 测到的:认领(没开窗口、错码、码只能用一次)、签名(没签名、陌生密钥、时间差 120 秒、重放的随机数都被拒;按主机时间重签就通过;换模块后随机数记录还在)、加第二把密钥再删第一把、最后一把不能删、证书钉住;镜像下载、校验、导入;创建后用公钥和密码 SSH 登录;改密码不重启、旧密码失效;内存限制在容器里马上看得到(/proc/meminfo);停止 / 启动 / 重启;换掉 node 模块后令牌、证书、容器都还在;重装后旧文件没了、新密码可用;幂等和冲突;删除后数据清掉。
time,面板记下每台主机的时差、用主机时间重签。以后可以在主机上加一个简单的时间同步。cfg node mem_mib 自己定);空闲量 = 总量 − 已分配给容器的内存。面板要求的,不改接口、不用重启。crates/shacrypt(node 模块和 rustros-init 都用);DER 编码从 sites 的 ACME 代码移到 util(node 的自签证书也用)。--status 和 rmtree;rustros-init 除了环境变量,还从 /etc/rustros/node/init.conf 读设置,并加了 apply(旧的环境变量照样能用)。1. 是否发布并部署:不用重启。各台机器上已有的模块热更新(vfs 带修复);112、113 再装上 node 模块,并把 listen 设为它们的底层网络地址。
2. 认领:面板那边准备好以后,在 112 / 113 上运行 mod node claim,把认领码交给面板;也可以由我运行后把码给你。
3. 下一步:设计文档里的顺序是 H3(主机把各容器的 /32 路由自动报给路由器);另外还有两件待定:网关的里程碑顺序(docs/gateway-design.md),以及“内核放到高半区”(让 Debian 的 python3、Go 默认编译的程序这类固定地址程序能跑)是否单独作为一个里程碑。