这个站点没有后台、没有数据库、没有构建服务器。整个更新流程只有三步:
- 在
content/posts/里新建一个 Markdown 文件 - 运行
python build.py生成本地页面 - 运行
bash publish.sh推到 Cloudflare
为什么不用手改 HTML
一开始确实是几个手写的 HTML 页面。但每加一篇文章,就得同时改四处:文章页本体、首页列表、sitemap.xml、feed.xml。改漏一处不会报错,只会安静地坏掉——RSS 里少一篇文章,或者首页列表永远停在三个月前。
所以改成内容与模板分离:Markdown 是唯一的内容源,HTML 是生成物。生成物(public/ 目录)不进 Git,随时可以整个删掉重新生成。
目录结构
blog/
├── content/
│ ├── posts/ 每一篇文章一个 .md
│ └── about.md 关于页
├── templates/
│ └── layout.html 页面外壳(head、页头、页脚)
├── static/ 需要原样拷过去的东西
│ ├── css/style.css
│ ├── _headers
│ └── favicon.svg
├── public/ 生成结果,只有这个目录会被部署
├── build.py 生成器,只用 Python 标准库
├── publish.sh 构建 + 部署
└── site.json 站点名、域名、首页文案
写一篇新文章
新建 content/posts/2026-11-12-hello.md:
---
title: 文章标题
date: 2026-11-12
summary: 一句话摘要,会显示在首页列表和 RSS 里。
tag: 随笔
draft: false
---
正文从这里开始,支持标题、列表、表格、代码块、引用。
文件名开头的日期决定排序,后面的部分是 URL:这个文件会生成 public/post-hello.html,对外地址是 /post-hello(Pages 会自动去掉 .html)。
draft: true 的文章默认不生成,本地想预览草稿就运行 python build.py --drafts。
发布
python build.py # 只构建,生成到 public/
bash publish.sh # 构建 + 上传到 Cloudflare Pages
publish.sh 里其实就两行:跑一次 build.py,然后跑 wrangler pages deploy public。项目名写在脚本顶部的变量里。
Windows 上也可以直接双击 publish.cmd。
让 AI 来写
这套结构是专门为「AI 写、人来发」设计的。对 AI 只需要说一句话:
帮我写一篇关于 xxx 的文章,加到博客里,然后发布。
AI 要做的动作是固定的:新建一个带 front matter 的 Markdown 文件、跑 build、跑 publish。不需要它去理解 HTML 结构,也就不会把首页列表改坏。
具体规则写在仓库根目录的 AGENTS.md 里,任何 AI 工具进到这个目录都能读到。
几个注意点
public/不要手改,下次构建会被覆盖- 图片放
static/assets/,Markdown 里写/assets/xxx.jpg(根路径,不是相对路径) - 改配色改字号:只动
static/css/style.css - 改站点名、域名、首页文案:只动
site.json - 换了域名:
site.json里的baseUrl改掉,重新 build,RSS 和 sitemap 里的链接会自动跟着变