Teable Agent Runtime 为 AI 对话 和 应用构建器 提供沙箱及应用运行时服务。本指南介绍如何使用 Docker Compose,在一台 Linux 服务器上部署完整服务栈。
部署内容包括 AI 沙箱引擎、App Runtime、Git 仓库服务、制品存储和 TLS 网关。本文提供全部配置文件,无需 Kubernetes 或额外的代码仓库。
Agent Runtime 的私有化部署仍处于早期阶段。本指南面向愿意率先体验的用户,并会根据实际部署反馈持续迭代。当前运行时通过 Teable Infra 使用 OpenSandbox,不再使用 Vercel Sandbox 或 Vercel Snapshot。如需部署协助,请联系 support@teable.ai。
如需使用应用构建器预览和发布应用,请部署本文提供的完整服务栈。只运行 opensandbox-server 无法提供应用构建器所需的应用运行时、Git 仓库、制品存储和网关。
对外只暴露 Caddy 网关的 80/443 端口,其余服务均在内部 Docker 网络中:
| 服务 | 说明 | 内部端口 |
|---|
| caddy | TLS 终止 + 全部路由(控制台、沙箱/应用预览、S3、git) | 对外 80/443 |
| opensandbox-server | AI 沙箱引擎(Docker 模式),通过宿主 docker.sock 按需创建沙箱容器 | 8090 |
| infra-service | 控制台 UI + Infra API + App Runtime Docker 后端 + 内置应用网关 | 8080 |
| git-registry | App Builder 的 git smart-http 服务(与 infra-service 共用镜像) | 8080 |
| minio (可选) | 内置 S3 兼容制品存储(可换成外部 S3,请参阅选择制品存储) | 9000 / 9001 |
| minio-init (可选) | 一次性任务:等待 MinIO 就绪并创建制品桶 | 不适用 |
域名路由(均由根域名 BASE_DOMAIN 自动拼出):
| 地址 | 用途 |
|---|
https://<BASE_DOMAIN> | 控制台 UI + Infra API + 沙箱引擎 API(/v1/*) |
https://{appId}.app.<BASE_DOMAIN> | 已部署应用的访问入口 |
https://{sandboxId}-{port}.sandbox.<BASE_DOMAIN> | 沙箱端口预览 |
https://s3.<BASE_DOMAIN> | 制品存储(内置 MinIO 模式;预签名 URL 指向这里) |
https://git.<BASE_DOMAIN> | git smart-http(外部手动 clone 用,可选) |
开始前的准备
服务器要求
| 最低 | 推荐 |
|---|
| vCPU | 4 | 8 |
| 内存 | 8 GB | 16 GB |
| 磁盘 | 80 GB NVMe | 120+ GB NVMe |
| 操作系统 | Ubuntu 22.04/24.04(x86_64) | 同左 |
| 软件 | Docker Engine 24+、Docker Compose v2.24+、OpenSSL | 同左 |
容量背景:每个活跃的构建会话运行一个沙箱容器(上限 2 vCPU / 4 GiB);每个已部署应用同样上限
2 vCPU / 4 GiB(实际常用几百 MB)。基础服务共占约 1 到 1.5 GiB 内存。磁盘大头是容器镜像
(预热后约 15 到 20 GB)加沙箱/应用的可写层,建议监控剩余空间。
DNS 与防火墙
在 DNS 供应商处添加 4 条 A 记录,全部指向云主机公网 IP(通配证书只覆盖一级子域名,
所以 4 条都需要):
域名托管在 Cloudflare 时,这 4 条记录请设置为仅 DNS(灰云),不要开代理(橙云)。
防火墙只放行入站 22(SSH)、80、443,其余端口一律不对外。
容器镜像
本部署默认使用 GHCR + Docker Hub。所有镜像均为公开仓库,无需
docker login。Teable 镜像中的 <tag> 不是固定值;请分别打开对应的 GHCR Package 页面,
使用该页面 Installation 命令中显示的版本标签。不同镜像的标签需要分别确认,不要假设相同。
Docker Compose 管理的镜像
| 用途 | 镜像模板 | Package page |
|---|
| 控制台 + Infra API + App Runtime(infra-service 与 git-registry 共用,后者只是换了启动入口) | ghcr.io/teableio/teable-infra-service:<tag> | GHCR |
| AI 沙箱引擎本体(OpenSandbox,Docker 运行时模式;Teable 构建版) | ghcr.io/teableio/opensandbox-server:<tag> | GHCR |
| TLS 边缘网关(自备证书模式用官方镜像;Cloudflare 模式本地构建,请参阅选择 TLS 模式) | caddy:2.9.1 | Docker Hub |
| 内置制品存储(仅内置 MinIO 模式;生产建议钉 digest) | minio/minio:latest | Docker Hub |
| 一次性建桶工具(仅内置 MinIO 模式) | minio/mc:latest | Docker Hub |
运行时镜像
以下镜像不由 compose 启动,而是由服务在运行期通过宿主 docker.sock 按需创建容器时使用。
均为公开镜像,守护进程可直接匿名拉取;建议按照预拉取运行时镜像预拉到本地,避免首次创建沙箱/部署应用时的
冷启动拉取延迟:
| 用途 | 镜像模板 | Package page |
|---|
| 沙箱基准镜像(每个 AI 构建会话在其中运行) | ghcr.io/teableio/teable-sandbox-agent:<tag> | GHCR |
| 应用运行基准镜像(每个已部署应用的容器镜像;不配置则应用无法部署) | ghcr.io/teableio/teable-app-runtime:<tag> | GHCR |
| 沙箱内执行代理 execd(引擎自动注入进每个沙箱容器) | ghcr.io/teableio/opensandbox-execd:v1.0.19-fix-1064 | GHCR |
| 沙箱出网 sidecar egress(DNS 模式,引擎按需为每个沙箱创建) | opensandbox/egress:v1.0.12 | Docker Hub |
execd 必须使用上表中由 Teable 构建的修复版镜像 opensandbox-execd:v1.0.19-fix-1064,不要替换为上游的 opensandbox/execd 镜像。
选择制品存储
| 模式 | 配置 | 说明 |
|---|
| 内置 MinIO(默认) | .env 中 S3_ENDPOINT 留空、COMPOSE_PROFILES=minio | 自动启动 MinIO 并建桶;预签名 URL 统一走 https://s3.<BASE_DOMAIN>。 |
| 外部 S3 | S3_ENDPOINT 填供应商 URL、COMPOSE_PROFILES=(置空) | 内置 MinIO 不再启动;S3_ACCESS_KEY / S3_SECRET_KEY / S3_BUCKET 须填供应商签发的值,桶要预建;供应商若仅支持 virtual-host style 另填 S3_FORCE_PATH_STYLE=false。 |
创建部署文件
部署目录
在服务器上创建一个部署目录(下文以 teable-runtime/ 为例),配置文件部分提供前四个文件的完整内容:
含密钥的文件是 .env 与 compose.override.yaml,请勿外发、勿提交到版本库。
配置文件
.env
compose.yaml
原样复制,无需修改(所有环境相关的值都取自 .env):
Caddyfile
默认按 static(自备证书)模式写好;cloudflare 模式按照文件顶部注释和选择 TLS 模式调整两处:
opensandbox.toml
原样复制:
部署 Agent Runtime
配置 .env 并生成密钥
编辑配置文件中的 .env,填写以下必填项:
BASE_DOMAIN / INFRA_HOST:填写根域名,INFRA_HOST 通常与 BASE_DOMAIN 相同。
- 镜像:按照容器镜像中的清单填写;每个 Teable 镜像的
<tag> 从对应 GHCR package 页面的 Installation 命令复制;
- 密钥项,用下面的命令生成后填入:
选择 TLS 模式
| 模式 | 准备 | 证书续期 |
|---|
| static(自备证书,默认) | 把 fullchain.pem + privkey.pem 放进 certs/。须为单张多 SAN 证书,覆盖 <BASE> / *.<BASE> / *.app.<BASE> / *.sandbox.<BASE> 四个名字(通配符只盖一级)。 | 手动:替换 certs/ 文件后执行 docker compose exec caddy caddy reload -c /etc/caddy/Caddyfile |
| cloudflare(DNS-01 自动签发) | 域名 DNS 托管在 Cloudflare;准备一个 API Token(权限 Zone:Read + DNS:Edit)。 | Caddy 全自动 |
static 模式:上方配置文件默认使用此模式,放好证书即可,无需其他改动。
可用以下命令自检证书与私钥是否匹配、SAN 是否覆盖四个名字:
cloudflare 模式需做 4 处调整:
-
官方 Caddy 镜像不带 DNS 插件,先把下面内容存为
Dockerfile.caddy 并在本机构建一次:
-
.env:CADDY_IMAGE=teable-caddy-cloudflare:2.9.1,并填 ACME_EMAIL 与 CLOUDFLARE_API_TOKEN;
-
Caddyfile:按文件顶部注释,取消全局块(email + acme_dns cloudflare)的注释;
-
Caddyfile:删除 (site_tls) 片段里的 tls /certs/... 一行(证书改由 ACME 全自动管理)。
Cloudflare 模式必须持久化 caddy-data 卷。该卷用于存储证书和 ACME 账号;如果丢失,Caddy 会在重建后重新申请证书,可能触发 Let’s Encrypt 的频率限制。
生成 Git 服务签名密钥
git 服务使用一对 Ed25519 密钥签发/验证访问令牌。多行 PEM 放不进 .env,因此通过
compose.override.yaml 注入(Docker Compose 会自动加载它)。在部署目录执行:
生成的 compose.override.yaml 结构如下(PEM 内容为你生成的密钥):
要轮换密钥,重新执行本节命令即可。
若 openssl genpkey 报 Algorithm ed25519 not found(如 macOS 自带的 LibreSSL),
可改用 Docker 生成密钥对,再执行上面的拼装命令:
创建共享工作区卷
Agent 共享工作区使用一个外部卷(compose 声明为 external,不会自动创建/删除):
预拉取运行时镜像
全部为公开镜像,无需 docker login:
execd 和 egress 的镜像地址必须与 opensandbox.toml 中的配置完全一致。
启动服务
验证部署
检查服务状态
控制台 UI:浏览器打开 https://<BASE_DOMAIN>(或你填的 INFRA_HOST),用 api-key 登录,
key 即 .env 中的 OPENSANDBOX_API_KEY。
对接 Teable
在 Teable 部署中添加以下环境变量:
TEABLE_INFRA_API_KEY 必须与 Agent Runtime .env 中的 OPENSANDBOX_API_KEY 使用相同的值。SANDBOX_OPENSANDBOX_IMAGE 也必须与 Agent Runtime 配置的沙箱镜像一致。
TEABLE_INFRA_API_URL 必须指向 Teable Infra 根地址,不能包含路径。更新环境变量后,重启 Teable。
故障排查
| 问题 | 检查项 |
|---|
| Teable 提示 Agent Runtime 未配置 | 确认上方 4 个 Teable 环境变量均已设置,然后重启 Teable。 |
| 沙箱或应用预览出现 DNS、TLS 或 404 错误 | 确认 4 条 DNS 记录均指向服务器,并且证书覆盖所有必需域名。 |
| 首次创建沙箱或部署应用较慢 | 在首次使用前预拉取全部运行时镜像。 |
| 服务状态异常 | 运行 docker compose ps,再通过 docker compose logs <service> 查看对应服务日志。 |
日常运维
查看日志和管理服务
修改 .env 中的镜像 tag,然后执行 docker compose pull && docker compose up -d。
沙箱、应用基准镜像或 execd/egress 更新后,请按照预拉取运行时镜像重新拉取。
备份数据
建议定期备份以下数据卷,尤其是 minio-data 与 caddy-data。
| 卷 | 内容 |
|---|
opensandbox-state | 沙箱引擎状态(SQLite) |
infra-state | App Runtime 状态与草稿 |
git-registry-data | git 仓库数据 |
minio-data | 制品文件(内置 MinIO 模式) |
teable-agent-juicefs | Agent 共享工作区(external 卷,部署时创建) |
caddy-data / caddy-config | TLS 证书、ACME 账号、Caddy 配置 |
docker compose down -v 会同时删除数据卷,包括制品、Git 仓库和证书。请谨慎使用。
安全与限制
安全须知
- 含密钥的文件只有
.env 与 compose.override.yaml,切勿提交到版本库或外发。
- 整栈共用一把
OPENSANDBOX_API_KEY;如需分权,请分别替换各服务的对应环境变量。
docker.sock 挂载进 opensandbox-server 与 infra-service(Docker 后端必需),等价于宿主 root
权限,请只在专用、可信的主机上部署。
- 唯一公网面是 Caddy 的 80/443;MinIO 控制台(9001)不对外,需要时用 SSH 隧道访问。
- 沙箱与宿主共享内核,不是多租户强隔离边界;对外开放多租户场景请为沙箱引擎配置
gVisor / Kata 等强隔离运行时。
能力边界
可用:沙箱引擎全功能;应用主链路(创建 → 激活 → 网关访问 → 删除,含 dashboard、日志、
S3 制品);git 推拉;控制台 api-key 登录 + Infra API;文件页与 S3 兼容接口。
不可用 / 受限(Docker 模式取舍):应用 host-prefix 改名(返回 501)、scale-to-zero
闲置缩容(no-op)、引擎 key 轮换 / server 滚动升级、控制台 Kubernetes 观测页(显示为空属正常)。