Skip to content

feat(sandbox): 以 E2B 协议为唯一接入契约,打通自建 E2B 兼容控制面 - #57

Draft
lyingbug wants to merge 2 commits into
mainfrom
cursor/unify-sandbox-on-e2b-protocol-6870
Draft

feat(sandbox): 以 E2B 协议为唯一接入契约,打通自建 E2B 兼容控制面#57
lyingbug wants to merge 2 commits into
mainfrom
cursor/unify-sandbox-on-e2b-protocol-6870

Conversation

@lyingbug

@lyingbug lyingbug commented Aug 11, 2026

Copy link
Copy Markdown
Owner

背景

反馈两点:CubeSandbox 需要更深入的测试与说明;Docker/Local 都是一次性执行,希望统一行为,最好 WeKnora 只对接 E2B 一种协议,其它后端(含容器后端)通过现成的开源实现接入。

调研结论

E2B 协议这一层不需要自研,成熟实现已经覆盖三类隔离:

实现 隔离 前提
CubeSandbox KVM MicroVM /dev/kvm 或 PVM 内核;/data/cubelet 为 XFS;K8s 部署仍是 preview
Agent-Sandbox Kubernetes Pod(容器),可叠加 gVisor/Kata 一个 K8s 集群
e2b-dev/infra Firecracker Nomad/Consul + 云厂商 Terraform
E2B Cloud 托管 API Key

因此不为 Docker 自研控制面:想要“容器隔离 + E2B 协议”,用 Agent-Sandbox 这类 K8s 原生实现即可,WeKnora 侧零改动。内置 docker/local 保持一次性语义,明确定位为本机开发调试后端。e2bgatewaycirclesac/sandboxCage 等虽然也宣称 E2B 兼容且支持 Docker,但维护强度都在个位数量级,不适合作为生产依赖。

代码改动

打通自建 E2B 兼容控制面

  • 数据面网关:新增 e2b.proxy_url。原本只服务 Cube 的分流传输层泛化为 SandboxGatewayTransportPool,控制面走共享连接池、数据面直拨网关并保留沙箱 Host;网关是 http:// 时同步降级数据面 scheme(SDK 把它写死为 https),省掉为泛域名申请证书。
  • envd 协议兼容层envd_compat_transport.go):envd 要求 Authorization: Basic base64("<user>:")POST /files 必须是 multipart,而 go-e2b 发的是 X-User-ID 头与裸 body。E2B Cloud 宽容,其它实现直接报 unauthenticated / 500。
  • 健康探针与执行账号:Health 改用 GET /v2/sandboxes(旧接口部分实现未提供,会把健康后端判成不可用);文件操作显式声明执行账号,与脚本运行账号一致。标准沙箱镜像的非 root 账号相应改名为 user(Docker 后端按 1000:1000 数字寻址,不受影响)。

真实 CubeSandbox 控制面暴露的两个缺陷

  • 标准模板会被重复创建:构建失败的模板在 Cube 的列表里 aliases 为空,仅按名字匹配识别不出来,EnsureStandardTemplate 于是每次都新建一个构建任务——恰好在构建本来就失败的集群上不断堆积。改为同时按镜像识别。
  • 构建失败没有原因:Cube 返回了 lastError(实测是 CubeEgress root CA is missing),此前被丢弃,界面只显示 FAILED。现在透传到模板卡片。

测试

E2B 协议一致性套件TestE2BCompatibleControlPlaneConformance):面向任意 E2B 兼容控制面,覆盖会话内状态保持、shell_exec 复用同一沙箱、附件暂存、产物收集、执行超时。在 kind 单节点集群 + Agent-Sandbox(容器后端,无 KVM)上全部通过。

--- PASS: TestE2BCompatibleControlPlaneConformance (8.75s)
    --- PASS: .../SessionScopedStatePersistsAcrossExecutions (3.68s)
    --- PASS: .../ShellExecSharesTheSessionSandbox (0.01s)
    --- PASS: .../AttachmentStagingAndArtifactCollection (0.04s)
    --- PASS: .../TimeoutIsReportedAsKilled (5.01s)

Cube 控制面冒烟测试TestCubeIntegrationControlPlane,新增):在真实部署的 CubeSandbox v0.6.0 控制面上通过,覆盖健康检查、模板列表、标准模板自动创建、未知模板/未知沙箱的错误分类。它只依赖控制面,因此在计算面还没起来时就能用。

其余:传输层与兼容层单测、go test ./internal/sandbox/... ./internal/types/... ./internal/handler/...vue-tsc --buildcheck-i18n 均通过。

文档

  • 新增 docs/sandbox-protocol.md:协议统一方案、后端能力矩阵、开源实现选型、接入字段、envd 兼容性坑、一致性测试与本机复现步骤。
  • docs/sandbox-cluster.md 补齐 CubeSandbox 部署形态对比、环境自检清单(KVM 真可用、dummy/tun 内核能力、systemd、端口、网段、Docker 数据目录)、CubeEgress 前置条件、排障表与已知限制——每一条都对应一次实际踩过的失败。

未覆盖

CubeSandbox 的计算面没跑起来:本机内核缺 dummy/tun 且没有可加载模块目录(CoreDNS 与 network-agent 直接失败),KVM 创建 vCPU 会触发内核 BUG,因此 MicroVM 无法启动,模板构建与真实沙箱执行未能验证。

Open in Web Open in Cursor 

@lyingbug
lyingbug force-pushed the cursor/unify-sandbox-on-e2b-protocol-6870 branch from 9a57222 to 542350f Compare August 11, 2026 11:59
…support

- Add e2b.proxy_url gateway config and generic gateway transport layer
- Add envd compat layer for Basic auth and multipart /files uploads
- Support Dockerfile.sandbox runtime and e2b-backend build targets in CI
- Rename sandbox image non-root user to align with E2B template convention
- Add sandbox-protocol.md and extend cluster deployment / local repro docs

Enables connecting to any E2B-compatible control plane (E2B Cloud,
CubeSandbox, Agent-Sandbox, etc.) without per-backend client code.
@lyingbug
lyingbug force-pushed the cursor/unify-sandbox-on-e2b-protocol-6870 branch from 542350f to 9c5e049 Compare August 11, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant