Skip to content

2026.07.10 Release v0.5.1

CubeSandbox 0.5.1 是一次面向生产落地的跟进发布,在 0.5.0 的 AutoPause / ARM64 / 集群部署基线上补齐关键能力与稳定性。本版本重点包括:cube-lifecycle-manager 独立控制面服务(从 CubeProxy sidecar 拆出,支持 CubeProxy 多副本扩展)、三值 timeout 语义重构(服务端默认 + NEVER_TIMEOUT / 立即超时 / TTL),以及 host-mount 路径白名单安全加固。同时修复 ARM64 64KB 页场景下的快照完整性问题,并显著提升出向策略与 TAP 回收的可靠性。共计 59 个提交,来自 18 位贡献者。

🎯 核心特性

cube-lifecycle-manager:AutoPause 协调器独立化

将原先内嵌在 CubeProxy 镜像中的 cube-proxy-sidecar 拆分为独立控制面服务 cube-lifecycle-manager(CLM),使 CubeProxy 可多副本水平扩展,而不再依赖单实例 sidecar。

  • 独立部署:CLM 作为独立服务接入 cube-sandbox-control.target;一键安装与腾讯云 Terraform 部署均已纳入。
  • Redis 服务发现:CubeProxy 各副本将 admin endpoint 注册到 Redis;CLM 通过注册表发现全部在线副本并协调 auto-pause / auto-resume,无需静态配置副本列表。
  • 协议兼容:Wire protocol、Redis schema、SDK 行为保持不变;现有 AutoPause / AutoResume 语义不受影响。
  • 腾讯云 Terraform (#814):控制面新增 cube-lifecycle-manager Deployment;支持 TENCENTCLOUD_CUBE_PROXY_REPLICAS 多副本,以及 CLM 副本数 / discovery refresh / admin token 等配置项。

三值 Timeout 语义 + 服务端默认

统一沙箱 idle timeout 语义,与 E2B 对齐,并将「未设置」与「显式默认值」区分开——默认超时决策从 SDK / CubeAPI 下沉到 CubeMaster。

取值含义
省略(None / nil由集群 default_timeout_insec 决定;未配置或 ≤0 时视为永不超时
NEVER_TIMEOUT-1永不因 idle 回收
0立即超时(首次 idle sweep 即回收)
N > 0idle TTL = N 秒
  • SDK:Go / Python 的 CreateOptions.Timeout 改为可选指针;Create / Connect / Resume 不再自动填入硬编码默认值。暴露 NeverTimeout / NEVER_TIMEOUT sentinel。
  • CubeAPI / CubeMaster:timeout 字段改为 Option / *int,透传「未设置」;EndAt 按三值语义计算(-1 → 无截止时间)。
  • RPC 截止与 idle TTL 解耦:新增 create_timeout_insec(默认 300s)仅约束创建调度 RPC,不再与沙箱 idle TTL 混用。
  • CLM sweeperTimeoutSeconds < 0 跳过回收;== 0 立即回收;旧数据 nil 回退到 DefaultIdleTimeout
  • 运行时调整:Python / Go SDK 新增 set_timeout() / SetTimeout(),支持将运行中沙箱改为 NEVER_TIMEOUT (#743, #850)。Web UI 创建沙箱时可传入 timeout (#798)。

Host-Mount 路径白名单安全加固

此前 host-mount 接受任意绝对路径,沙箱可 bind-mount 宿主机任意目录。现改为可配置前缀白名单(默认 /data/shared/),并用 filepath.Clean 消除 .. 路径穿越;配置中显式禁止根路径 / (#756)。

配套更新持久化存储指南(路径限制、权限、多租户隔离、多节点共享存储),示例路径对齐默认前缀 (#768)。

✨ 功能增强

SDK

  • Node.js / TypeScript SDK(预览) (#792):新增 @cubesandbox/sdk,API 面与 Python / Go 对齐;尚在验证中,生产使用请谨慎。
  • Python / Go set_timeout (#743, #850):对齐 E2B API;CubeAPI / CubeMaster 接受 -1NEVER_TIMEOUT),拒绝其他负值。
  • Go SDK allowOut 校验对齐 (#802):不再将 AllowPublicTraffic=false 误判为 deny-all;与 CubeAPI 一致,仅在 AllowInternetAccess=falsedenyOut0.0.0.0/0 时视为全拒绝。

网络与 Egress

  • CubeEgress 明文 HTTP 凭据注入 (#726):允许对纯 HTTP 上游注入凭据。安全边界是沙箱代码看不到密钥,而非要求 egress→upstream 必须 TLS。
  • CubeEgress 透明代理 IP 随 CIDR 推导 (#851):不再硬编码 192.168.0.1;从 CUBE_SANDBOX_NETWORK_CIDR 取网段首个可用 IP,自定义沙箱网段时 TPROXY / OpenResty 监听地址正确。
  • DNS 学习条目最小 TTL:对 DNS 学到的 egress allow 条目施加最小 300s TTL,避免短 TTL 导致重连被误拒。
  • 已建立会话跳过策略重检:CubeVS 对已存在的 CubeEgress TCP 会话跳过 egress 策略重检,避免 DNS 记录过期打断活跃连接;策略检查折叠进 create_nat_session,按会话缓存结果。
  • 默认 deny 基线统一回放:replace / flush 路径始终回放私网 / link-local 默认 deny 条目,create 与 replace 策略形态一致。

部署与安装器

  • CubeProxy 预发布多架构镜像 (#849):一键部署改为从 TCR 拉取预构建 multi-arch 镜像,不再本机构建;支持 MIRROR=cn|int 与 airgap 本地缓存回退。
  • 组件镜像发布流水线 (#795):新增 release-docker-images.yml,向 GHCR / TCR 推送 multi-arch 组件镜像;bump-image.sh 统一管理硬编码镜像标签。
  • CubeMaster Dockerfile (#813, #824):统一 Docker build args / context,修复 ARG 作用域;CubeAPI Dockerfile 改为单次构建并加安全门禁 (#854)。
  • 一键 DNS dnsmasq 回退 (#740):无 systemd-resolved 且 NetworkManager dnsmasq 插件未拉起子进程时,可选由脚本自管 dnsmasq,避免 cube.app 解析失败。
  • Cubelet 配置 patch 锚定 (#776):sed 替换锚定行首,避免改 CUBE_SANDBOX_NETWORK_CIDR 时误改空的 cube_router_cidr

Web UI / AgentHub / 其他

  • CubeAPI lifecycle snake_case (#772):接受 lifecycle.on_timeout / lifecycle.auto_resume 等 Python 风格字段名,避免静默落到 kill / 无 resume。
  • AgentHub OpenClaw bind=lan (#769):强制 gateway 绑定 lan,确保 cube-proxy 可通过 tap IP 访问,避免 auto 落到 loopback。
  • ARM64 运行时加固 (#807):dirty bitmap 粒度改用宿主机页大小(修复 64KB 页上快照严重不完整、恢复后 200% CPU);aarch64 vCPU 在无 PMUv3 主机上自动回退无 PMU 初始化。
  • 开发环境 QEMU 10.x (#713):显式 -drive if=none + -device virtio-blk-pci,修复 QEMU 10.2.2+ 的空 drive 错误。

🐛 Bug 修复

生命周期与沙箱

  • Resume 幂等 (#817):沙箱已处于 Running 时返回可识别的「已在目标状态」信号(CLM 视为成功),不再与真正不可 resume 的状态混为同一错误。
  • 删除不存在沙箱返回 404 (#759):CubeAPI / CubeMaster 对缺失沙箱的 delete 映射为 NotFound。
  • 沙箱列表稳定排序 (#762):按创建时间降序 + SandboxID 打破平局,避免 WebUI / SDK 刷新时顺序跳动。
  • 模板网络规则与资源默认值保留 (#581):从镜像创建模板时保留 egress 规则;CPU/内存同时超限时保留首个校验错误;请求侧 override 在 first-match-wins 下优先生效。

网络与数据面

  • TAP 回收安全(network-agent):清理与池准备完成前不归还 TAP;失败清理路径不把带残留策略的 TAP 放回池;复用前清理策略 / DNS allow 状态,避免跨沙箱泄漏。
  • Go SDK envd 端口 (#821):envd RPC(commands / files / filesystem / PTY)改走 49983,不再误打到 Jupyter 端口 49999;仅 RunCode//execute 仍走 Jupyter。

其他

  • 示例 host-mount 路径对齐 (#768):示例与文档路径改为 /data/shared/...,匹配默认白名单。

📚 文档

  • ARM64 支持公告博客 (#866):中英文 InfoQ 风格发布稿,介绍与 Arm 联合推进的多架构能力。
  • Pi Agent 集成指南 (#701):中英文集成文档 + 可运行示例(pause/resume、网络策略、凭据注入)。
  • 生命周期 / 配额文档 (#739):补充 ARM64 安装说明与 lifecycle 配额相关文档。
  • 持久化存储指南 (#756):host-mount 路径限制、权限、多租户隔离、多节点共享存储。
  • Roadmap (#731):README 与文档站增加 roadmap。
  • v0.5.0 发布相关 (#770, #781):发布博客与特性描述更新;Quickstart 注明 Multi-Arch 镜像可用性 (#806)。
  • 开发技能与文档规范 (#788, #789):Claude Code run-dev skill;i18n 同步检查与变更驱动文档审计规则。

⚙️ 工程改进

  • 版本矩阵允许平台后缀 (#747):版本检查兼容带平台后缀的版本号。
  • PVM guest 构建触发收紧 (#819):仅在 version tag 时触发 pvm-guest 构建。
  • 镜像标签 bump:发布候选过程中多次同步 one-click / Terraform 默认镜像至 v0.5.1-rc* (#826, #867)。
  • Python SDK 版本 bump 至 0.5.0 (#818)。
  • CubeAPI 死代码清理 (#796) 及其他小范围工程整理。

说明:Web Example Center(#615)曾合入后随即回滚(#778),不包含在本版本交付中。