Bolt.diy 迁移到 Cloudflare Containers
TL;DR
将 Hostinger VPS 上运行的 Bolt.diy (StackBlitz Labs 开源 AI 编程工具) 迁移到 Cloudflare Containers,释放 VPS 约 700MB 内存。通过 CF Containers 的 scale-to-zero 机制,闲置时零费用,访问时自动唤醒(2-3秒冷启动)。
现状:✅ 已完成。bolt.gottenergy.com 由 CF Container 提供服务,VPS 原容器已停止。AI 代码生成正常,文件写入问题是 Bolt.diy 上游 bug(VPS 和 CF 均有)。
🎯 背景:为什么需要这个
- 需求:释放 Hostinger VPS 内存,为 OpenDroneMap + Blender 部署腾出空间
- 卡点:VPS 15GB 内存被 18 个 app 吃满,Swap 全满。Bolt.diy 占用约 700MB-1GB,且有个 wrangler esbuild 进程长期占 15% CPU
- 约束:不能影响 bolt.gottenergy.com 的正常访问,零停机迁移
✅ 前置条件
- Cloudflare Workers Paid Plan ($5/月)
- CF API Token (Workers Scripts:Edit + Containers:Edit + Workers Routes:Edit)
- bolt.gottenergy.com 域名在 CF 托管
- VPS SSH 访问权限
- Wrangler CLI (VPS 上已安装 4.110.0)
🏗️ 最终架构
用户浏览器 → bolt.gottenergy.com
→ CF Workers (bolt-diy)
→ Durable Object (BoltContainer)
→ Firecracker 微虚拟机 (standard-1: 1 vCPU, 2GB)
→ ghcr.io/stackblitz-labs/bolt.diy:latest
→ wrangler pages dev (端口 5173)
与原来 VPS 上的区别:
- 不再需要 Dokploy 管理
- 闲置 10 分钟自动休眠,访问时唤醒(2-3秒)
- 按 CPU 实际使用量计费,空闲零费用
- 不再有 wrangler esbuild CPU 泄漏问题
🛠️ 部署步骤
第 1 步:查 VPS 当前 Bolt 配置
docker inspect gott-energy-boltdiy-t2ovpy-app-1 --format '{{json .Config.Env}}'
docker inspect gott-energy-boltdiy-t2ovpy-app-1 --format '{{json .Mounts}}'查到了什么
确认:所有 API Key 为空、零挂载卷、端口 5173、默认启动命令
pnpm run dockerstart。
第 2 步:创建 CF Container API Token
CF Dashboard → API Tokens → 自定义:
- Gott Energy (Account): Workers Scripts:Edit, Containers:Edit
- gottenergy.com (Zone): Workers Routes:Edit
第 3 步:安装依赖 + 初始化项目
export CLOUDFLARE_API_TOKEN=你的Token
mkdir -p /opt/cf-containers/bolt-diy/src
cd /opt/cf-containers/bolt-diy
npm init -y
npm install wrangler @cloudflare/containers@0.3.7为什么需要 @cloudflare/containers
@cloudflare/containers是 CF 官方 npm 包(0.3.7),提供 Container 和 getContainer API。它是运行时依赖,必须安装。
第 4 步:写 Dockerfile
FROM ghcr.io/stackblitz-labs/bolt.diy:latest
RUN apt-get update && apt-get install -y ca-certificates && update-ca-certificates && rm -rf /var/lib/apt/lists/*
ENV NODE_ENV=production
ENV PORT=5173
ENV HOST=0.0.0.0
ENV RUNNING_IN_DOCKER=true
ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt
ENV SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
RUN npm install -g wrangler@4.44.0
EXPOSE 5173
CMD ["pnpm", "run", "dockerstart"]Dockerfile 解析
- ca-certificates: 修复 wrangler workerd 的 TLS 证书验证
- NODE_EXTRA_CA_CERTS / SSL_CERT_FILE: 强制 workerd 使用系统 CA 证书
- wrangler@4.44.0: 原镜像缺少 wrangler(是 devDependency),必须全局安装
- CMD 保留 pnpm run dockerstart(wrangler pages dev 提供 API 代理)
第 5 步:写 wrangler.toml
name = "bolt-diy"
main = "src/index.ts"
compatibility_date = "2025-07-10"
compatibility_flags = ["nodejs_compat"]
[[containers]]
class_name = "BoltContainer"
image = "./Dockerfile"
instance_type = "standard-1"
[[durable_objects.bindings]]
class_name = "BoltContainer"
name = "BOLT"
[[migrations]]
tag = "v1"
new_sqlite_classes = ["BoltContainer"]配置要点
[[containers]]2026 最新格式,class_name 必须和 Durable Object 一致instance_type = "standard-1"选 1 vCPU + 2GB(Bolt 运行需 700MB+)- 不需要
[[routes]],域名在 Dashboard 手动绑定更安全
第 6 步:写 Worker 代码
import { Container, getContainer } from "@cloudflare/containers";
export class BoltContainer extends Container {
defaultPort = 5173;
sleepAfter = "10m";
}
export default {
async fetch(request: Request, env: any): Promise<Response> {
const instance = getContainer(env.BOLT, "default");
return instance.fetch(request);
},
};第 7 步:部署
npx wrangler deploywrangler 做了什么
自动执行:Docker build → push 到 CF Registry → 创建 Durable Object → 创建 Worker。全程无需 docker login 或 docker push。
第 8 步:绑定域名
CF Dashboard → Workers & Pages → bolt-diy → Settings → Domains → 添加 bolt.gottenergy.com
第 9 步:停止 VPS 原容器
docker stop gott-energy-boltdiy-t2ovpy-app-1↩️ 回滚 / 卸载
- 回滚:Dokploy 重新 Start
gott-energy-boltdiy-t2ovpy-app-1,CF Dashboard 切回原 DNS - 清理 CF:删除 Worker bolt-diy、Durable Object namespace、Container application
- 验证回滚:bolt.gottenergy.com 恢复 VPS 服务
🔍 验证方法
- 页面可访问:
curl -s -o /dev/null -w "%{http_code}" https://bolt.gottenergy.com→ 200 - AI 可用: 登录后选择 DeepSeek → 发送 “Hello” → 收到回复
- CF 日志:
npx wrangler tail查看请求正常到达
🕳️ 踩过的坑
坑 1: docker login 401
现象:
docker login registry.cloudflare.com始终返回 401 根因: CF Container Registry 不支持直接 docker push,必须通过 wrangler deploy 推送 解决: 使用 Dockerfile + wrangler deploy,无需手动 docker login
坑 2: @cloudflare/containers 导入失败
现象:
Could not resolve "@cloudflare/containers"根因: 包存在 (npm 0.3.7) 但未安装 解决:npm install @cloudflare/containers@0.3.7
坑 3: wrangler 未安装
现象:
sh: 1: wrangler: not found→ 容器 exit code 1 根因: wrangler 是 devDependency,生产镜像中不包含 解决: Dockerfile 加RUN npm install -g wrangler@4.44.0
坑 4: TLS 证书错误
现象:
failed: TLS peer's certificate is not trusted; reason = unable to get local issuer certificate根因: Debian 镜像缺少 ca-certificates,wrangler workerd 无法验证 HTTPS 解决:apt-get install -y ca-certificates+ 设置 NODE_EXTRA_CA_CERTS 和 SSL_CERT_FILE 环境变量
坑 5: wrangler.toml 格式过时
现象: 文档和社区有多种 wrangler.toml 格式 根因: CF Containers 2026 年 4 月 GA,配置格式快速演进 解决: 对齐 2026-07 官方文档格式 (containers + class_name + durable_objects)
⚠️ 已知限制 / 副作用
- 冷启动 2-3 秒: 闲置 10 分钟后容器休眠,首次访问有延迟
- WebContainer 文件写入问题: Bolt.diy 上游 bug,工作台无法写入文件(VPS 和 CF 均有此问题)
- 无本地 Ollama: 迁移后 127.0.0.1:11434 不再可用,用户需通过 API Key 使用云端模型
- standard-1 规格: 1 vCPU + 2GB,高并发时可能需要升级
🔒 安全 & 成本速查
- API Token: 独立创建 (bolt-diy-container),Worker Scripts + Containers + Routes
- 月度成本: Workers Paid 0.000020/秒 + 内存 0.00000007/GB/秒)
- 免费额度: 375 vCPU-分钟 + 25 GiB-小时 + 200 GB-小时
📌 待办 / 未来优化方向
- 追踪 Bolt.diy 上游修复 WebContainer 文件写入问题
- 评估是否需要升级到 standard-2 (1 vCPU + 6GB)
- 其他低频应用 (Vaultwarden, Linkstack, AnythingLLM) 同样适合迁 CF Containers
📋 速查命令合集
# 重新部署
cd /opt/cf-containers/bolt-diy
export CLOUDFLARE_API_TOKEN=你的Token
npx wrangler deploy
# 查看日志
npx wrangler tail --format pretty
# 停止 VPS 容器
docker stop gott-energy-boltdiy-t2ovpy-app-1
# 恢复 VPS 容器
docker start gott-energy-boltdiy-t2ovpy-app-1
# 查看容器状态
npx wrangler whoami📝 更新日志
| 日期 | 改动 | 原因 |
|---|---|---|
| 2026-07-12 | 首次创建,完成 Bolt.diy 从 VPS 到 CF Containers 的完整迁移 | 释放 VPS 内存,熟悉 CF Containers 流程 |