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

项目地址:github.com/xieqifei/FlyBlogAdmin

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:

一键部署 FlyBlogAdmin 到 Vercel

运行所需的核心环境变量如下:

变量 作用
SECRET_KEY 签名登录 Cookie 的长期随机密钥
ADMIN_USERNAME 后台管理员用户名
ADMIN_PASSWORD_HASH 推荐使用的管理员密码哈希;也可以改用 ADMIN_PASSWORD
GITHUB_TOKEN 对目标博客仓库具有 Contents 读写权限的细粒度 Token
GITHUB_REPOSITORY 目标博客仓库,格式为 owner/repository

默认情况下,后台读写 main 分支的 source/_posts 目录;可以使用 GITHUB_BRANCHPOSTS_PATHPOST_EXTENSIONS 调整。图床和 AI 所需的变量都是可选项。

首次打开时,如果必需配置不完整,系统会显示设置引导页,并逐项标出变量状态。页面还提供只在浏览器本地运行的 SECRET_KEY 与密码哈希生成器,以及细粒度 GitHub Token 的最小权限配置说明。补齐变量并重新部署后,就可以进入登录页。

GitHub Token、密码和密钥都应放在部署平台的加密环境变量中,不要提交到仓库,也不要添加会让它们暴露到浏览器的 VITE_ 前缀。

本地开发

项目需要 Node.js 22 和 npm:

1
2
3
4
git clone https://github.com/xieqifei/FlyBlogAdmin.git
cd FlyBlogAdmin
npm install
npm run dev

Vite 开发服务器默认运行在 http://localhost:5173。它只启动前端;如果要在本地验证登录、文章读写等完整功能,需要配置环境变量并使用 npx vercel dev 启动前端和 API。

可以通过下面的命令执行测试和生产构建:

1
2
npm test
npm run build

适合谁使用

如果你的博客文章保存在 GitHub,喜欢 Markdown 和 Git 带来的可控性,但又希望随时在浏览器里管理文章,FlyBlogAdmin 会是一个轻量的选择。它没有额外的数据层,不改变原有的静态站点发布方式,又把写作、内容总览、关系图谱、图床和 AI 辅助集中到了一个界面中。

FlyBlogAdmin 目前以 GPL-3.0 协议开源,欢迎到 GitHub 仓库 查看源码、部署体验或提交建议。

评论