Flare Stack Blog:Cloudflare Workers 全栈博客部署指南,零服务器成本

2026-07-07

背景:个人博客的困境

想搭个人博客,低成本的方案不少。但如果你关注这几个点——有评论系统、能上传图片、支持全文搜索——选择面一下就窄了。

静态博客生成器(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_TOKENCLOUDFLARE_ACCOUNT_IDD1_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 存储),对绝大多数个人博客来说绰绰有余。