自托管的 AI 编程沙盒平台。基于 Daytona 提供一键式沙盒环境,内置 Claude Code + OpenHands。
开发者笔记本 服务器 (Ubuntu)
┌──────────┐ ┌──────────────────────────┐
│ mob CLI │───── API/SSH ─────▶│ mob-server daemon │
│ │ │ ├─ Daytona (9 services) │
│ mob init│ │ ├─ Traefik (TLS) │
│ mob ssh │ │ ├─ OpenHands │
│ mob ps │ │ └─ Guardian (保活) │
└──────────┘ └──────────────────────────┘
运行在服务器上,自动部署和维护沙盒平台。
mob-server init --domain example.com --dns-provider porkbun --dns-token xxx --llm-key sk-xxx
mob-server status
mob-server key create alice # Daytona API key
mob-server key list
mob-server key revoke alice
mob-server operator add alice -f alice.pub # SSH operator (root 登录)
mob-server operator list
mob-server operator revoke alice
mob-server operator worker-config # 输出 CF Worker 用的 JSON
mob-server daemon运行在开发者笔记本上,一键开沙盒 + VPS 开关机。无参数运行 mob 会进入交互式 TUI;也可以用下面的单次命令直接操作。
mob # 打开交互式 TUI
mob tui # 显式打开交互式 TUI
mob init # 连接服务器
mob create # 创建沙盒
mob ssh [id] # SSH 进沙盒(不给 id 自动创建)
mob ps # 列出沙盒
mob rm <id> # 删除沙盒
mob forward <id> <port> # SSH 隧道转发到 localhost
mob url <id> <port> # 预览 URL(域名模式)
mob expose <id> <port> [name] # 永久子域名路由(域名模式)
mob openhands # 打开 OpenHands 浏览器
mob power init # 配置 Cloudflare Worker URL + operator 名
mob power start # 开机(Vultr API 通过 Worker 调用)
mob power stop # 关机
mob power reboot # 重启
mob power status # 查看 VPS 状态TUI 基于 Charmbracelet Bubble Tea 构建,支持在同一个界面里刷新沙盒、创建沙盒、进入 SSH/Claude Code、保持 localhost 隧道、生成预览 URL、创建永久路由、删除沙盒、打开 OpenHands 和调用 VPS power 控制。SSH/Claude Code 会临时接管终端,退出远程会话后自动回到 TUI。
- 域名模式: 自动 TLS、预览 URL、永久子域名路由
- IP 模式: 裸 IP 直连,无需域名,用 SSH 隧道转发端口
make build # macOS 二进制
make build-linux # Linux amd64 二进制
make package # dist/ 下生成 release 资产和 checksums.txt
make install # 安装到 /usr/local/bin# 上传 mob-server 到服务器
scp bin/mob-server-linux-amd64 root@your-server:/usr/local/bin/mob-server
# SSH 到服务器运行 init
mob-server init --ssh-host your-server --ssh-key ~/.ssh/id_ed25519mob init # 输入服务器地址和 API key
mob # 打开 TUI,选择创建沙盒或进入 SSH/Claude Code每个沙盒包含:
- Claude Code 2.1.123
- Python 3.11 + Node 22
- ttyd (Web 终端)
- Git, curl, wget
| 方案 | 命令 | 适用 | 场景 |
|---|---|---|---|
| SSH 隧道 | mob forward |
所有模式 | 自己看效果 |
| 预览 URL | mob url |
域名模式 | 临时分享 |
| 永久子域名 | mob expose |
域名模式 | 长期对外 |
mob-sandbox/
├── cmd/mob-server/ 服务端 CLI
├── cmd/mob/ 客户端 CLI
├── pkg/
│ ├── config/ 配置读写
│ ├── ui/ 终端 UI(spinner、颜色)
│ ├── remote/ SSH 客户端 + 端口转发
│ ├── daytona/ Daytona REST API 客户端
│ ├── embedded/ go:embed 模板(compose/Dockerfile)
│ ├── dns/ DNS provider(cloudflare/porkbun/manual)
│ ├── deploy/ 20 步 init 部署流程
│ ├── guardian/ daemon 保活/修复/清理
│ ├── control/ HTTP 控制 API(expose 路由管理)
│ └── power/ 客户端 Vultr 开关机(SSH 签名 → CF Worker)
├── infra/
│ └── power-worker/ Cloudflare Worker:Vultr 开关机代理(SSH 验签)
├── poc/ PoC bash 脚本(deploy.sh 等)
├── docs/ 设计文档、实现报告、运维手册
├── Makefile
└── install.sh
任意一个新加入的 operator(人 / AI agent)都可以拿到 SSH + 开关机权限,无需共享私钥或 Vultr key。流程:
- operator 本机
ssh-keygen -t ed25519生成自己的 keypair - 把 pubkey 给管理员
- 管理员 SSH 到服务器跑
mob-server operator add <name> -f <name>.pub - 管理员把命令打印的
{"name":..., "pubkey_b64":...}加到infra/power-worker/wrangler.toml的AUTHORIZED_PUBKEYS数组里 - 管理员
cd infra/power-worker && npx wrangler deploy重新部署 Worker - operator 跑
mob power init填 Worker URL 和自己的 name - 测试:
mob power status✓
撤销:管理员 mob-server operator revoke <name>,从 Worker 配置里删掉对应条目,重新部署。
完整 onboarding 步骤见 docs/operator-onboarding.md。
- Go 1.23+
- Docker CE (服务端)
- cobra, golang.org/x/crypto/ssh, fatih/color, briandowns/spinner