699 字
3 分钟
部署过程:用 Cloudflare 免费搭建带后台的博客
这个博客使用开源项目 Rin,跑在 Cloudflare 上,全程免费。记录一下部署过程和踩过的坑。
为什么选 Rin
一开始用的是静态博客 Fuwari(Astro),但它没有后台,发文章要改代码再重新部署。我想要的是:
- 有后台,账号密码登录;
- 浏览器里直接写文章、传图;
- 能部署在 Cloudflare,不用自己的服务器。
Rin 正好满足:前端 React,后端 Cloudflare Workers(Hono),数据库用 D1(SQLite),MIT 开源。WordPress 需要 PHP + MySQL 服务器,不适合 Cloudflare,排除。
准备工作
- 一个 Cloudflare 账户,域名
suohx.org已托管在 Cloudflare; - 一个 API Token(Workers、Pages、D1、DNS 等权限),用于命令行部署。
坑 1:命令行连不上 Cloudflare API
官方流程是 bun install 后执行 bun run deploy,脚本会用 wrangler 自动创建 D1、队列和 Worker。但我的部署环境访问 api.cloudflare.com 一直失败,wrangler 无法使用。
坑 2:GitHub Actions 路线也走不通
Rin 自带 GitHub Actions 部署流程(fork 仓库 → 填 Secrets → 运行 Build/Deploy)。但我使用的自动化授权没有 fork 和设置 Secrets 的权限,需要手动在手机上点很多步,放弃。
最终方案:控制台拖拽上传(Pages 高级模式)
Cloudflare Pages 的拖拽上传支持根目录放一个 _worker.js(Advanced mode),它会接管所有请求,静态文件通过 env.ASSETS 提供。Rin 的后端正好就是这么读静态资源的,于是:
- 本地构建前端:
cd client && bun run build,产物在dist/client; - 打包后端:用
wrangler deploy --dry-run --outdir把server/src/_worker.ts打成单文件_worker.js(这一步不需要联网); - 把
_worker.js放进dist/client根目录,整体压缩成 zip; - 合并数据库迁移:把
server/sql/0000~0012.sql合并成一份建表 SQL,并写入migration_version = 12; - 控制台 D1 → 创建数据库
rin,在 Console 里执行上面的 SQL; - Workers & Pages → 创建 → Pages → 上传资产,项目名
suohx-blog,上传 zip; - 项目 设置:
- 绑定 D1:变量名
DB→ 数据库rin; - 兼容性日期
2026-01-20; - 环境变量:
NAME、DESCRIPTION、FRONTEND_URL、CACHE_STORAGE_MODE=database、ADMIN_USERNAME; - 加密 Secret:
ADMIN_PASSWORD、JWT_SECRET(随机 64 位十六进制);
- 绑定 D1:变量名
- 重新上传一次 zip,让配置生效;
- 自定义域 添加
suohx.org,Cloudflare 自动生成 CNAME 指向suohx-blog.pages.dev。
几点说明
- 不需要 R2:图片存储(R2/S3)是可选的,缓存改用
database模式即可;不过后台上传图片需要配置对象存储,目前文章里的图片放在静态目录。 - 队列可选:Rin 的任务队列只用于 AI 摘要等后台任务,不配置不影响写文章和评论。
- 管理员账号:Rin 用环境变量里的用户名密码登录,首次登录自动创建管理员。
结果
部署完成后访问首页就能看到博客,右上角登录后即可写文章。这篇文章就是通过后台 API 发布的。
部署过程:用 Cloudflare 免费搭建带后台的博客
https://blog.suohx.org/posts/deploy-rin-on-cloudflare/