背景:个人博客的困境
想搭个人博客,低成本的方案不少。但如果你关注这几个点——有评论系统、能上传图片、支持全文搜索——选择面一下就窄了。
静态博客生成器(Hexo、Hugo、Pelican 等)可以免费部署到 GitHub Pages 或 Cloudflare Pages,但在「博客」之上需要额外集成评论(通常靠第三方如 Giscus、Utterances),媒体文件也得另外找图床。如果只是写写字,这够用了;如果想做一个完整的、带后台管理的内容站点,这些方案的拼凑感会越来越重。
另一端是 WordPress 类的 CMS。功能完整,但要买服务器、维护 LNMP 环境、处理安全更新。个人博客用 WordPress,对多数人来说过于重了。
Flare Stack Blog 选了中间路线:运行在 Cloudflare Workers 上,零服务器成本,同时保留了完整的 CMS 能力。
什么是 Flare Stack Blog
Flare Stack Blog 是一个专为 Cloudflare 生态设计的全栈博客 CMS。作者 du2333 把它开源在 GitHub(MIT 许可),目前已有 803 次提交和 41 个版本发布。
它的架构很有意思——不依赖任何传统服务器,所有计算都在 Cloudflare Workers 边缘节点上执行:
- Workers:托管应用和处理 API 请求
- D1:SQLite 数据库(存储文章、评论、用户数据)
- R2:对象存储(保存图片和媒体文件)
- KV:缓存层(加速热点数据)
- Durable Objects:分布式限流
前端用 React 19 + TanStack Start(做 SSR),后端是 Hono 框架。包管理用的 Bun,部署走 Wrangler CLI。

演示站可以在这里体验:https://blog.dukda.com
它和静态博客的区别
| 维度 | 静态博客生成器 | Flare Stack Blog |
|---|---|---|
| 评论系统 | 需第三方集成 | 内置嵌套回复+审核 |
| 媒体上传 | 需额外图床 | R2 直接上传 |
| 后台管理 | 无 | 完整管理后台 |
| 全文搜索 | 需第三方 | 内置 Orama 搜索 |
| 主题系统 | 模板替换 | 契约解耦,可一键换 |
部署步骤
前置准备
本地需要安装 Bun 和 Wrangler CLI:
# 安装 Bun(macOS/Linux)
curl -fsSL https://bun.sh/install | bash
# 安装 Wrangler
bun add -g wrangler
# 登录 Cloudflare 账号
wrangler login
然后创建 Cloudflare 资源——打开终端执行:
# D1 数据库(记下返回的 database_id)
wrangler d1 create blog-db
# KV 命名空间(需要两个)
wrangler kv namespace create blog-kv
wrangler kv namespace create blog-oauth-kv
# R2 存储桶
wrangler r2 bucket create blog-r2
最后配置 GitHub OAuth App。去 GitHub Settings → Developer settings → OAuth Apps → New OAuth App,填入你的域名和回调地址,拿到 Client ID 和 Client Secret。
克隆和部署
git clone https://github.com/du2333/flare-stack-blog
cd flare-stack-blog
bun install
cp .env.example .env
编辑 .dev.vars(服务端密钥):
BETTER_AUTH_SECRET=<用 openssl rand -hex 32 生成>
BETTER_AUTH_URL=https://你的域名
GITHUB_CLIENT_ID=你的GitHub ClientID
GITHUB_CLIENT_SECRET=你的GitHub ClientSecret
ADMIN_EMAIL=你的邮箱
然后编辑 wrangler.jsonc,把刚才创建的 D1 数据库 ID、KV 命名空间 ID 填进去。
最后执行部署:
bun run build # 构建前端
bun db:migrate # 初始化数据库
wrangler deploy # 部署 Worker
wrangler secret bulk .dev.vars # 上传密钥
部署成功后,你会在命令行看到 Workers 分配的域名,访问它就能看到你的博客了。

踩坑记录
关键坑:wrangler deploy 之后必须上传密钥
这是最容易踩的坑。wrangler deploy 成功了不等于站点能跑了。.dev.vars 里的密钥(BETTER_AUTH_SECRET、GitHub OAuth 等)在本地开发时自动读取,但部署到生产环境后需要手动上传:
wrangler secret bulk .dev.vars
不执行这步,首页直接返回 500 Internal Server Error。
GitHub OAuth 回调 URL 必须用 https
GitHub 的 OAuth 回调 URL 必须是 https:// 开头。如果 Workers 分配的是 *.workers.dev 域名,这天然满足;如果用自定义域名,确保 SSL/TLS 已启用。弄错的话登录时会跳转到错误页。
本地开发使用远程资源
wrangler.jsonc 默认配置了 "remote": true,意味着本地 bun run dev 读取的是远程 D1/R2/KV 的数据,不是本地模拟。如果需要完全本地开发,移除 "remote": true,Miniflare 会模拟这些服务。不过要注意——本地模拟的数据和生产环境是隔离的,改了本地数据不会影响线上。
数据库迁移安全
Flare Stack Blog 提供了三种迁移命令:
bun db:migrate # 远程迁移(生产用)
bun db:migrate:local # 本地模拟校验(安全)
bun db:migrate:unsafe # 强制迁移(仅当懂了在做什么)
migrate:local 会在迁移前后检查文章数、评论数等关键计数,防止意外丢失数据。
部署模式选择
手动部署适合一台电脑搞定。如果团队协作或多环境部署,仓库内置了 GitHub Actions CI/CD 配置,fork 后在仓库 Secrets 中填入 CLOUDFLARE_API_TOKEN、CLOUDFLARE_ACCOUNT_ID、D1_DATABASE_ID 等变量,每次 push 自动构建部署。
域名绑定也有两种方式:用 custom_domain 直接绑定新域名,或用 routes 配置将博客部署到已有域名的子路径下(如 blog.example.com/*)。

同类方案对比
| 方案 | 类型 | 评论系统 | 维护状态 |
|---|---|---|---|
| Flare Stack Blog | 全栈 CMS | 内置+审核 | 活跃(803 commits) |
| cloudflare-worker-blog | 动态博客 | 无 | 更新较慢 |
| CF Pages + 静态生成器 | 静态博客 | 需第三方 | 活跃 |
| WordPress on CF | 全栈 CMS | 内置 | 活跃 |
Flare Stack Blog 的核心优势在于:它不是一个静态博客生成器,而是一个完整的 CMS——后台管理、评论审核、媒体库、主题系统一应俱全。如果你想要一个有完整功能的博客系统,又不想买服务器,它提供了一个非常合适的方案。
个人博客的免费额度用量(D1 读 5 万/天、写 5 万/天,KV 10 万/天,R2 10GB 存储),对绝大多数个人博客来说绰绰有余。