一直以来,我的博客文章都以 Markdown 文件保存在 GitHub 仓库中。这种方式简单、透明,也方便迁移,但每次写文章都要打开本地编辑器、处理 Git 提交,再等待站点构建。为了让日常写作更轻松,我做了 FlyBlogAdmin:一个专门面向 Hexo 等 Git 仓库博客的无数据库管理后台。
项目地址:github.com/xieqifei/FlyBlogAdmin

为什么要做 FlyBlogAdmin
传统博客后台通常需要单独的数据库和服务端,文章数据与 Git 仓库也可能存在两份。FlyBlogAdmin 选择了另一条路线:GitHub 仓库就是唯一的数据源。
后台通过 GitHub Contents API 读取 source/_posts 中的 Markdown 文件,保存文章时直接提交回指定分支。这样既保留了 Git 的版本历史,也不需要同步数据库;仓库后续的构建、发布流程仍然可以照常工作。
整个项目使用 Node.js 和 TypeScript:前端基于 React、Vite 与 Ant Design,服务端由 Vercel Node.js Functions 提供 API。部署后只需要浏览器,就能完成大部分博客维护工作。
首页内容看板
登录后的首页不是简单的菜单,而是一张博客内容看板。它会汇总文章、分类、标签和已标注日期数量,并展示:
- 分类分布和常用标签;
- 可以切换年份的写作贡献日历;
- 最近更新的文章;
- 适配桌面端与手机端的响应式布局。
打开后台就能看到博客当前的内容结构和写作节奏,比只看文章列表更直观。
更适合 Markdown 的文章编辑体验
文章管理支持按标题、分类和标签搜索,也可以对列表进行多列排序。编辑器采用 Obsidian 风格的单栏实时预览,在同一个编辑区域内完成书写和渲染,支持标题、列表、任务、引用、代码、脚注、图片和表格等常用 Markdown 内容。
为了提升长文编辑效率,FlyBlogAdmin 还加入了不少细节:
- 吸顶工具栏、快捷键和右键菜单;
- 表格单元格直接编辑,以及行列增删和对齐设置;
- 图片拖入或粘贴后自动上传,并在光标处插入 Markdown 链接;
- 浏览器本地草稿恢复,降低误关页面造成的内容丢失;
- 首次发布自动写入发布日期,后续保存自动更新编辑时间;
- 保存时检查远端文件的 blob SHA,避免静默覆盖他人已经提交的新版本。
从文章列表延伸到关系图谱
除了常规的文章管理,项目还提供了 Obsidian 风格的文章关系图谱。页面会根据文章之间的链接生成节点和连线,并支持拖拽、缩放、筛选和局部图谱。
当博客内容越来越多时,图谱能帮助发现文章之间已有的联系,也能提醒我哪些主题值得继续补充,而不只是把文章当成一条按时间排列的列表。
S3 兼容图床
FlyBlogAdmin 可以连接 Cloudflare R2 等 S3 兼容对象存储。配置完成后,可以在图床页面切换存储桶、上传和分页浏览图片、复制 Markdown 链接或删除文件。
如果同时配置默认存储桶和公开访问地址,编辑器中的拖拽、粘贴图片也会直接走图床上传流程,不必先到另一个页面处理素材。
可选的 AI 写作辅助
配置 OpenAI 兼容的大模型接口后,编辑页面可以生成标题和内容、校对文字、改善结构、精简内容或优化大纲。AI 功能采用“建议稿”工作流:先对比原文和优化结果,确认后手动应用到编辑器,最后仍需点击保存才会提交到 GitHub。
因此,模型不会绕过作者直接改写远端文章。不需要 AI 时,也可以完全不配置相关变量,登录和文章管理功能不会受到影响。
部署到 Vercel
FlyBlogAdmin 不需要单独准备数据库,最方便的方式是从 GitHub 一键导入 Vercel:
运行所需的核心环境变量如下:
| 变量 | 作用 |
|---|---|
SECRET_KEY |
签名登录 Cookie 的长期随机密钥 |
ADMIN_USERNAME |
后台管理员用户名 |
ADMIN_PASSWORD_HASH |
推荐使用的管理员密码哈希;也可以改用 ADMIN_PASSWORD |
GITHUB_TOKEN |
对目标博客仓库具有 Contents 读写权限的细粒度 Token |
GITHUB_REPOSITORY |
目标博客仓库,格式为 owner/repository |
默认情况下,后台读写 main 分支的 source/_posts 目录;可以使用 GITHUB_BRANCH、POSTS_PATH 和 POST_EXTENSIONS 调整。图床和 AI 所需的变量都是可选项。
首次打开时,如果必需配置不完整,系统会显示设置引导页,并逐项标出变量状态。页面还提供只在浏览器本地运行的 SECRET_KEY 与密码哈希生成器,以及细粒度 GitHub Token 的最小权限配置说明。补齐变量并重新部署后,就可以进入登录页。
GitHub Token、密码和密钥都应放在部署平台的加密环境变量中,不要提交到仓库,也不要添加会让它们暴露到浏览器的
VITE_前缀。
本地开发
项目需要 Node.js 22 和 npm:
1 | git clone https://github.com/xieqifei/FlyBlogAdmin.git |
Vite 开发服务器默认运行在 http://localhost:5173。它只启动前端;如果要在本地验证登录、文章读写等完整功能,需要配置环境变量并使用 npx vercel dev 启动前端和 API。
可以通过下面的命令执行测试和生产构建:
1 | npm test |
适合谁使用
如果你的博客文章保存在 GitHub,喜欢 Markdown 和 Git 带来的可控性,但又希望随时在浏览器里管理文章,FlyBlogAdmin 会是一个轻量的选择。它没有额外的数据层,不改变原有的静态站点发布方式,又把写作、内容总览、关系图谱、图床和 AI 辅助集中到了一个界面中。
FlyBlogAdmin 目前以 GPL-3.0 协议开源,欢迎到 GitHub 仓库 查看源码、部署体验或提交建议。
