博客站点跑起来之后,下一个自然问题是:文章到底在哪里写?

一开始我可以直接在编辑器里写 Markdown,再手动提交到 GitHub。这个方式很稳定,但不够顺手。尤其是日记、图片、修改旧文章这些场景,如果每次都要打开项目目录、找文件、改 Markdown、提交推送,写作这件事本身就会被流程打断。

所以我单独做了一个写作后台:lys-blog-writer

它和公开博客是两个项目:

  • lys-blog:Astro 静态博客,只负责展示文章和日记。
  • lys-blog-writer:私有写作工具,负责写作、预览、读取旧内容、发布到 GitHub。

第一版:先把写作流程跑通

最开始的目标很简单:打开一个页面,填标题、日期、标签、摘要和正文,然后自动生成符合博客仓库结构的 Markdown。

生成路径大概是:

src/content/blog/xxx.md
src/content/diary/xxx.md

这样博客仓库不需要改变太多,只要保持 Astro 内容集合的结构,新的文章一提交,Cloudflare Pages 就会自动重新构建。

第二版:从本地工具变成发布后台

后来我加了 Cloudflare Worker。

Worker 在这个项目里相当于一个轻量后端。前端不直接暴露 GitHub Token,而是把发布请求交给 Worker,再由 Worker 调 GitHub API,把 Markdown 写进博客仓库。

这个阶段主要有几个接口:

GET  /api/list
POST /api/read
POST /api/publish

这样写作后台就可以从 GitHub 仓库读取已有文章,点击某一篇后再拉取原文进行编辑。公开博客仍然是静态站,后台只负责管理内容。

第三版:加登录

发布功能能用了之后,就必须考虑权限。

我给 Worker 加了登录接口:

POST /api/auth/login
GET  /api/auth/me
POST /api/auth/logout

目前账号配置放在 Worker Secret 里,用 USERS_JSON 管理。账号分成两类:

owner  最高权限
author 普通作者

登录后,浏览器会拿到一个由 Worker 签名的 Cookie。之后读取文章、发布文章都不再需要填写发布密码,而是由 Worker 检查登录状态。

这一步完成后,写作后台终于不像一个临时工具,而更像一个真正的小型内容系统。

第四版:缓存和发布队列

已有内容越来越多之后,只能“点开编辑、点发布”还不够。我又加了一层本地缓存。

现在 writer 会把打开过的文章缓存在浏览器本地,用来判断:

  • 这篇有没有被缓存过
  • 本地有没有修改
  • 修改是否已经发布
  • 哪些内容还在待发布状态

已有内容页会显示状态:

未缓存
已同步
待发布
已发布修改

也可以选择特定内容发布,或者一键发布全部待发布内容。发布完成后,writer 会继续轮询博客公开页面,尝试确认 Cloudflare Pages 是否已经完成重新部署。

现在的结构

目前整体流程是:

写作后台
  -> Cloudflare Worker
  -> GitHub 博客仓库
  -> Cloudflare Pages
  -> 公开博客

公开博客保持轻量,写作后台负责处理更复杂的编辑和发布逻辑。

后面可能继续做什么

接下来更值得做的不是立刻开发原生 App,而是先把 writer 做成手机上好用的 PWA。

之后可以继续扩展:

  • 私密日记,只允许 owner 查看和写入
  • Cloudflare R2 图片托管
  • 用户头像和附件管理
  • 多设备同步草稿和发布队列
  • 更细的 author 权限

这个小后台现在还很早期,但它已经解决了一个很关键的问题:写作不再依赖手动找文件和手动推送。博客还是静态博客,但写作入口开始变得像一个真正属于自己的工具。