OpenBerth 完全指南:用自托管部署平台把 AI 应用一键送上生产环境
概述
当你用 AI 编程工具(Claude Code、Codex、Cursor)快速生成了一个 Web 应用——一个数据分析面板、一个 API 服务或一个原型工具——接下来的问题永远是同一个:怎么把它丢到一个公开可访问的 URL 上?
传统的选择无非是:Vercel(只支持前端)、Railway(免费额度有限)、自购 VPS 然后手撸 Nginx + systemd。OpenBerth 给开发者多了一个选择——一个完全自托管的部署平台,你在一台 Ubuntu 服务器上运行它的服务端,然后一条命令就能把任意项目部署成 HTTPS 子域名。
OpenBerth 是 MIT 许可的开源项目,由 Go 编写,三个静态二进制文件零运行时依赖。它对 AI 工作流的特殊之处在于:HTTP API、MCP 服务器和 stdin pipe 三种集成方式,意味着你的 AI 编程工具可以直接把生成的应用部署出去。
架构:三个二进制,两个容器
OpenBerth 的架构相当简洁。部署后服务器上运行三个 Go 二进制文件:
berth-server:主守护进程,包含 API 服务、容器生命周期管理、SQLite 数据库、Caddy 反代配置、MCP 端点和 Web 管理界面berth:客户端 CLI,开发者通过它提交部署berth-mcp:独立的 MCP 服务器(stdio 传输),专用于 Claude Desktop 和 Cursor
每次部署创建两个 gVisor 沙箱容器:一个用于构建(安装依赖、运行构建脚本),一个用于运行(启动生产服务器)。两阶段让构建阶段的资源不受运行时限制,而运行时容器默认只有 512MB RAM 和 0.5 CPU 的紧凑限制。
更新采用蓝绿部署模式——旧容器继续服务,新容器构建完成后无缝切换,失败时自动回滚。
安装与服务端配置
安装分三步走。先准备一台 Ubuntu 22.04 或 24.04 的服务器(或本地 VM/远程 VPS)。你需要一个域名和一个通配符 DNS 记录:
A openberth.example.com -> 你的服务器IP A *.openberth.example.com -> 你的服务器IP
然后 SSH 到服务器运行安装脚本:
curl -fsSL https://openberth.io/install-server.sh | bash berth-server install --domain openberth.example.com
安装过程大约两分钟,自动配置 Docker、gVisor、Caddy、SQLite 和 systemd 服务。结束时打印管理 API 密钥。
最后在本地安装 CLI:
curl -fsSL https://openberth.io/install.sh | bash berth config set server https://openberth.example.com berth config set key sc_你的管理密钥
核心功能详解
1. 一键部署
最基本的用法:进入项目目录,执行 berth deploy。OpenBerth 自动检测语言和框架——从 package.json 识别 Node.js 项目,从 requirements.txt 识别 Python,从 go.mod 识别 Go,找不到这些则按静态 HTML 处理。
berth deploy berth deploy --name my-app berth deploy --ttl 7d berth deploy --memory 1g --cpus 1.0 berth deploy --env API_KEY=xxx --env DB_URL=xxx
部署完成后输出 https://my-app.openberth.example.com——立即可以访问,自动 TLS 证书由 Caddy 申请。
2. 单文件快速部署
对原型阶段特别有用——直接部署一个 .jsx 或 .tsx 文件:
berth deploy App.jsx # React 文件,自动脚手架 berth deploy dashboard.tsx berth deploy README.md # Markdown 渲染为静态页面 berth deploy analysis.ipynb # Jupyter Notebook 渲染为 HTML
CLI 会解析导入语句检测依赖、从 class 名检测 Tailwind、生成可构建的项目结构。
3. 访问控制
部署的应用默认公开访问。可以添加四层保护:
berth protect--mode basic_auth --username admin --password xxx berth protect --mode api_key berth protect --mode user --users alice,bob berth protect --mode public
4. 持久化数据
部署是无状态的,但 OpenBerth 提供了两种持久化手段。/data 目录在重建时保留:
const db = new Database(process.env.DATA_DIR + '/app.db');
还有一个内置的文档存储 API,静态页面也能用:
// 写入数据
await fetch('/_data/votes', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({option: 'pizza'})
});
// 读取数据
const {documents} = await fetch('/_data/votes').then(r => r.json());
5. 管理与运维
berth list berth logs--follow berth update berth update --memory 2g berth destroy berth lock berth unlock
AI 集成方式
OpenBerth 有三个 AI 集成接口,让你在 AI 编程工具中直接部署:
HTTP API:从 AI 生成的代码直接 POST 到服务器:
curl -X POST https://openberth.example.com/api/deploy/code \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{"files": {"index.html": "Hello
"}, "name": "my-app"}'
MCP 服务器:在 Claude Desktop 或 Cursor 的 MCP 配置中添加:
{
"mcpServers": {
"openberth": {
"command": "berth-mcp",
"env": {
"BERTH_SERVER": "https://openberth.example.com",
"BERTH_KEY": "sc_your_key"
}
}
}
}
然后 AI 可以直接调用 berth_deploy、berth_status、berth_logs 等工具来管理部署。
Stdin Pipe:适用于终端型的 AI 编程工具:
echo '{"index.html": "Hello
"}' | berth deploy --stdin --json
安全模型
所有容器运行在 gVisor(runsc)中——系统调用被拦截在用户态内核层。容器逃逸撞上的是 gVisor 的合成内核,而不是宿主机的真实内核。安全层次包括:
| 层级 | 保护措施 |
|---|---|
| 沙箱 | gVisor 用户态内核隔离系统调用 |
| 权限 | 全部 --cap-drop=ALL |
| 资源 | 容器级内存、CPU、PID 限制 |
| 网络 | 仅绑定 localhost;Caddy 处理外部流量 |
| 认证 | 每用户独立 API 密钥;可选每部署访问控制 |
| 过期 | 默认 72 小时自动销毁 |
| 配额 | 可选每部署网络流量限制 |
排错
构建卡住:
berth logs# 查看构建输出 journalctl -u openberth -f # 查看守护进程日志
TLS 证书失败:检查 DNS 是否已指向服务器 IP,且默认模式下 DNS 不能处于 Cloudflare 代理(灰云)状态。
语言版本错误:在项目中添加 .nvmrc、.python-version 或 go.mod 中的版本指令——OpenBerth 会自动选择对应的基础镜像。
总结
OpenBerth 解决了一个真实存在的痛点:AI 编程工具生成应用越来越快,但部署依然要手动配服务器、域名和证书。它把从代码到 URL 的过程压缩到一个命令里,同时保留了自托管带来的数据主权和成本控制。如果你经常自建应用原型或给客户做演示,值得一试。
- 项目地址:https://github.com/AmirSoleimani/openberth
- 官网:https://openberth.io
- 许可证:MIT