开源一个 CDN 个人博客模板:让 AI 一键部署到 Cloudflare Pages
最近把这个个人博客整理成了一个可以公开复用的模板仓库:
这个模板的目标很简单:用 Astro/Fuwari 保持静态博客的轻量和可维护,再把部署、配置、验收这些容易出错的步骤沉淀成一个 Codex Skill,让 AI 可以按固定流程把博客部署到 Cloudflare Pages。
新增功能亮点
这次整理不只是把源码公开出去,还补了几项更适合个人长期维护的能力:
-
AI 一键部署 Skill
仓库里内置了
skills/deploy-astro-blog。它会约束 AI 先本地 scaffold、安装依赖、跑检查、构建,再创建 GitHub 仓库、配置 Cloudflare Pages,并在每次外部变更前确认操作范围。 -
AI 写作发布 Skill
skills/post-astro-blog把资料核验、文章起草、Frontmatter、图片、构建、预览和上线验收串成一条流程。它默认先保留草稿,只有文章内容和发布范围确认后才允许提交并推送。 -
D1 公开评论
评论区不加载第三方 iframe,优先通过 Cloudflare Pages Function 写入 D1,让所有访客看到同一套评论。D1 未绑定、接口失败或额度超限时,会降级保存到访客当前浏览器,避免内容丢失,也避免继续消耗远端额度。
-
随机昵称和英雄头像
如果评论者没有设置昵称,会自动随机生成一个王者荣耀英雄昵称,并优先显示对应的官方英雄头像。头像加载失败或昵称不是英雄名时,才会回落到昵称末尾两个字和稳定底色,不需要上传头像,也不会收集额外账号信息。
-
公开脱敏模板
模板仓库里已经把域名、邮箱、部署 ID、仓库名等个人信息替换成
example.com、Example Lab这类示例值,并配了脱敏截图,方便别人直接参考。 -
完整发布质量门
文档里固定了
pnpm check、pnpm type-check、Biome、生产构建、Pagefind、Pages 预览和自定义域验收流程,避免部署时靠记忆操作。
模板长什么样
首页大致是这样:

文章页会保留 Fuwari 的阅读体验,并在底部挂载评论区:

如何用这个模板搭建自己的博客
最短路径是直接克隆模板仓库:
git clone git@github.com:geekyfoxlab/cdn-blog.git my-blogcd my-blogcorepack enablepnpm install --frozen-lockfilepnpm dev然后改 src/config/site.ts 里的站点信息:
const siteUrl = "https://blog.example.com";const mainSiteUrl = "https://example.com";const githubUrl = "https://github.com/example";const contactEmail = "hello@example.com";文章放在 src/content/posts/。新建文章可以用:
pnpm new-post my-first-post发布前补齐 description,并把 draft 改成 false:
---title: "文章标题"published: 2026-07-31description: "用一到两句话概括文章。"tags: ["Astro", "博客"]category: "工程实践"draft: false---让 AI 一键部署
如果想让 AI 直接从空目录帮你部署,可以安装仓库里的 Skill:
mkdir -p ~/.codex/skillscp -R skills/deploy-astro-blog ~/.codex/skills/deploy-astro-blog然后给 AI 一段结构化输入:
使用 deploy-astro-blog skill,帮我部署一个 Astro/Fuwari 个人博客到 Cloudflare Pages。
输入:- 模式:new- 项目目录:/absolute/path/my-blog- 博客名称:Example Lab- 项目 slug:example-blog- 博客 URL:https://blog.example.com- 主站 URL:https://example.com- 描述:记录技术实践与学习笔记。- 主题方向:技术写作,项目记录,学习笔记,工程实践- GitHub 仓库:example/example-blog- 仓库可见性:Private 或 Public- 是否绑定自定义域:是/否- 自定义域:blog.example.com
请先本地 scaffold、验证构建,再创建 GitHub 仓库、推送 main、配置 Cloudflare Pages Git 集成,并在每次外部变更前确认。Cloudflare Pages 的构建参数保持固定:
| 设置 | 值 |
|---|---|
| Production branch | main |
| Root directory | / |
| Build command | pnpm build |
| Output directory | dist |
| Node.js | 22 |
| pnpm | 9.14.4 |
绑定自定义域时,只处理明确授权的博客子域,例如 blog.example.com。不要为了博客部署去改根域、www、MX/TXT、Nameserver 或其他无关记录。
让 AI 写作并发布文章
把写作流程也交给 AI 时,可以安装同仓库的另一个 Skill:
mkdir -p ~/.codex/skillscp -R skills/post-astro-blog ~/.codex/skills/post-astro-blog然后提供主题、读者、素材和期望结果。比如:
使用 post-astro-blog skill,把下面的项目记录整理成一篇中文技术文章:
- 主题:如何为 Astro 博客接入 Cloudflare Pages- 读者:第一次部署静态博客的开发者- 素材:README、部署日志和我提供的截图- 目标:给出可复现步骤、关键设计原因、风险和验收方法
先创建 draft: true 的草稿,核验代码与链接并完成本地预览。未经我确认,不要改成公开文章,不要提交或推送。这个 Skill 不负责凭空生成经历或数据。它会先区分仓库中可验证的事实、作者观点和仍需确认的假设,再按照当前项目的 Schema 生成文章。正式发布前,它还会检查桌面与移动端渲染、Pagefind、RSS、Sitemap 和生产文章 URL。
为什么这样设计
这个模板继续保持纯静态输出。这样做有几个好处:
- 没有数据库和后端运维压力。
- GitHub + Cloudflare Pages 的免费组合就能跑起来。
- Markdown 写作、Git 提交和 Pages 自动构建形成一条清晰链路。
- 隐私边界更明确:评论不依赖第三方 iframe,D1 不可用时只在访客浏览器本地降级保存,统计和第三方评论默认关闭。
后续如果需要公开评论、访问统计、Newsletter 或账号系统,可以单独评估,不让这些功能成为博客上线的默认依赖。
发布检查清单
每次正式发布前,我会至少跑:
pnpm checkpnpm type-checkpnpm exec biome check ./srcpnpm build如果部署到 Cloudflare Pages,再检查首页、文章页、归档、RSS、Sitemap、robots、404、搜索和移动端布局。这样麻烦一点,但可回滚、可复现,也更适合长期写下去。
正在加载评论。