sandbox云端沙箱排障终极指南:5类高频错误怎么快速定位
【免费下载链接】sandboxCode editing environment with an AI copilot and real-time collaboration项目地址: https://gitcode.com/GitHub_Trending/san/sandbox
sandbox 是把 AI copilot 与实时协作结合在一起的云端代码编辑环境,每个项目跑在独立的 E2B 容器里。遇到 "Error: container creation" 弹窗、文件保存失败或终端连不上时,这份排障指南给你一条可直接执行的路径。
🔍 错误速查表:5类高频故障的即时处置动作
| 前端现象 | 常见原因 | 立即动作 |
|---|---|---|
Error: container creation | E2B_API_KEY 缺失、额度耗尽或容器服务网络异常 | 核对密钥与网络,翻服务器日志拿完整报错 |
Error: file size too large | 单次保存内容超过 5MB 上限(MAX_BODY_SIZE) | 拆文件,把构建产物挪出源码目录 |
Rate limited: file saving等限流提示 | 保存超 2次/秒,新建/重命名/删除超 1次/2秒 | 稍等几秒重试,把批量操作改成串行 |
Rate limited: project size exceeded | 项目总体积超过 200MB | 调 size 接口查占用,先删无用文件 |
Error: terminal creation或终端无响应 | 已达 4 个终端上限,或容器尚未创建完成 | 关闭闲置终端,等容器就绪后重建 |
🛠️ 排障工作流:从日志到配置的4步定位路径
主排查路径固定为:看日志 → 查网络 → 核资源 → 对配置。
- 先读后端日志。index.ts 里每个分支都是成对处理:
console.error打完整堆栈,同时io.emit("error", ...)把短消息推给前端。你在页面上看到的只是摘要,真相在服务器端。
console.error("Error saving file:", e); io.emit("error", `Error: file saving. ${e.message ?? e}`);- 再查网络。后端会分别请求三个 Cloudflare Workers 地址(DATABASE_WORKER_URL、STORAGE_WORKER_URL、AI_WORKER_URL),每个请求都带 WORKERS_KEY 鉴权。文件树加载慢或保存失败时,先确认这几个地址可达、密钥正确。
- 核对资源硬上限:容器是否已创建、终端是否到 4 个、项目是否逼近 200MB,逐个排除。
- 最后对配置,确认环境变量齐全:
grep -E "E2B_API_KEY|DATABASE_WORKER_URL|WORKERS_KEY" .env协作成员收到 "The sandbox owner has disconnected." 时不属于网络故障:owner 的最后一个连接断开,后端就会关闭容器并清掉终端,等 owner 重连即可恢复。
📡 日志与监控实战:三路信息的查看方式与分工
- 后端服务器日志(真相来源):每条错误都带上下文,如 "Error creating terminal"、"Closed container",能直接定位是哪个 sandboxId 出的问题。
- 浏览器 DevTools(前端视角):在 Console 与 Network 面板过滤 Socket.io 帧,
error、disableAccess、previewURL等事件的载荷可以和服务器日志逐条对账。 - 沙箱内终端(真实输出):命令结果的第一手现场。预览服务固定跑在 5173 端口,终端默认 80x20;画面卡住时先确认该终端是否已被后端回收。
⚡ 性能与资源调优:绕过速率限制与硬上限的3个习惯
ratelimit.ts 用 rate-limiter-flexible 按用户做了分级限流:保存 2次/秒,新建/重命名/删除 1次/2秒。三条落地建议:
- 定期清理:新建文件前先删构建产物和废弃文件,项目体积逼近 200MB 时新建会被直接拒绝。
- 配额监控:批量导入依赖前,用 getProjectSize 查一下当前占用,预留空间。
- 及时释放:终端上限 4 个,用完就发
closeTerminal;owner 断开时后端会兜底清理,会话中仍要自己管好。
🔒 并发与锁机制深入:LockManager 如何保证原子操作
同一个人开多个标签页、或多人协作时,可能对同一个沙箱并发操作。utils.ts 的 LockManager 按 sandboxId 做串行化:
await lockManager.acquireLock(sandboxId, async () => { containers[sandboxId] = await Sandbox.create(); });同一 key 已有任务执行时,后来的调用会挂起等待 Promise,任务结束自动释放——这就是并发点"新建终端"不会出现重复资源的原因。上线前的预防性加固清单:
- E2B_API_KEY 有效且剩余额度充足
- DATABASE_WORKER_URL、STORAGE_WORKER_URL、AI_WORKER_URL、WORKERS_KEY 全部就位
- 重要项目代码定期导出备份,别只依赖 R2 远端
- Node 20 运行时与 e2b SDK 版本确认无误
排障的核心动作只有一个:把前端收到的短报错,还原成服务器日志里的完整堆栈,再沿"日志 → 网络 → 资源 → 配置"逐步收敛。上手几次后,多数故障都能在几分钟内定位。动手试一次,问题就解了一半。💪
【免费下载链接】sandboxCode editing environment with an AI copilot and real-time collaboration项目地址: https://gitcode.com/GitHub_Trending/san/sandbox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考