Skip to content

Repository files navigation

FlyBlogAdmin

FlyBlogAdmin 是一个面向 Hexo 等 Git 仓库博客的无数据库管理后台。文章直接通过 GitHub Contents API 读取和提交,前端使用 React、TypeScript 与 Ant Design,服务端使用 Vercel Node.js Functions。项目完全使用 Node.js/TypeScript,不包含 Python 或 Django 运行时。API 按功能合并入口以控制 Serverless Function 数量,同时避免刷新或无痕访问时被前端路由误接管。

登录后即可在首页查看文章、分类、标签、写作贡献和最近更新,也可以继续管理文章、友链和关于页面,浏览关系图谱、使用 S3 兼容图床,以及按需启用 AI 写作辅助。桌面端与手机端共用同一套响应式界面。

首次访问时,必需环境变量未齐全会一直显示设置引导页;配置齐全并重新部署后进入登录页。设置页会逐项显示必需与可选变量的实际配置状态。 设置页内置仅在浏览器本地运行的 SECRET_KEYADMIN_PASSWORD_HASH 生成器,并提供细粒度 GITHUB_TOKEN 的创建和最小权限配置教程。 AI 接口变量始终是可选项,不参与引导页判断;即使完全不配置 AI,也可以正常登录并管理文章。

Deploy with Vercel

界面预览

FlyBlogAdmin 桌面端首页内容看板

功能

  • 首页内容看板:汇总文章、分类、标签和已标注日期数量,展示分类分布、常用标签、按年份切换的写作贡献日历及最近文章。
  • 文章管理:支持按标题、分类和标签搜索,多列排序,新建、编辑及删除文章,并在保存后立即刷新列表。
  • Hexo 独立页面管理:友链可逐条新增、编辑和删除,并保存为通用 Markdown 表格;关于页面使用完整 Markdown 编辑器。默认对应 source/links/index.mdsource/about/index.md,也可自定义路径。
  • Obsidian 风格单栏实时预览编辑器:支持浅色语法高亮、标题、列表、任务、引用、代码、脚注、图片及表格预览,长文光标定位保持准确。
  • Markdown 高效编辑:提供吸顶工具栏、快捷键和右键菜单;表格可直接编辑单元格,并可插入或删除行列、设置列对齐。
  • 图片写作体验:可拖入或粘贴图片并自动上传到默认图床;公开图片和需要鉴权的私有图片都能在编辑器中预览。
  • 首次发布时自动写入发布日期,每次保存时自动刷新编辑日期,均精确到秒且不在编辑器中手动修改(旧文章缺少时间时补为 00:00:00);列表只展示日期。
  • Obsidian 风格文章关系图谱,支持拖拽、缩放、筛选和局部图谱。
  • S3 兼容图床:支持 Cloudflare R2 等对象存储的存储桶浏览、图片上传、Markdown 链接复制、分页加载及删除。
  • 可选 AI 写作辅助:支持生成标题和内容、校对、改善结构、精简及优化大纲;先对比预览再手动应用,不会自动覆盖文章。
  • 浏览器本地草稿自动恢复;单管理员 Cookie 登录及写请求安全校验。
  • 完整的环境变量配置引导,并内置 SECRET_KEYADMIN_PASSWORD_HASH 本地生成器。
  • 中文、英文和德文界面;桌面端与手机端响应式布局,移动端菜单、表格、编辑器和贡献日历均针对窄屏适配。

本地运行

需要 Node.js 22 和 npm。

git clone https://github.com/xieqifei/FlyBlogAdmin.git
cd FlyBlogAdmin
npm install
npm run dev

Vite 开发服务器默认地址为 http://localhost:5173。它只启动前端,因此会停留在设置引导页;验证登录、文章读写等完整功能时,请使用 npx vercel dev 启动前端和 /api Node Function,并提供下列环境变量。

执行生产构建:

npm run build
npm run preview

构建产物位于 distnpm test 会执行 TypeScript 类型检查。

环境变量

变量 必需 说明
SECRET_KEY 登录 Cookie 签名密钥,请使用长期随机值
ADMIN_USERNAME 管理员用户名
ADMIN_PASSWORD_HASH 二选一 推荐,支持 Django pbkdf2_sha256sha256$<hex>
ADMIN_PASSWORD 二选一 管理员明文密码,仅应存放在部署平台的加密变量中
GITHUB_TOKEN 对目标仓库具有 Contents 读写权限的细粒度 Token
GITHUB_REPOSITORY 目标博客仓库,格式为 owner/repository
GITHUB_BRANCH 文章分支,默认 main
POSTS_PATH 文章目录,默认 source/_posts
POST_EXTENSIONS 可编辑扩展名,默认 .md,.markdown
LINKS_PAGE_PATH 友链 Markdown 文件路径,默认 source/links/index.md
ABOUT_PAGE_PATH 关于 Markdown 文件路径,默认 source/about/index.md
SESSION_AGE 登录有效秒数,默认 7 天
LANGUAGE 界面语言:zhende,默认 zh
LLM_API_KEY AI 可选 OpenAI 兼容大模型服务的 API Key
LLM_MODEL AI 可选 模型名称
LLM_BASE_URL AI 可选 接口根地址,默认 https://api.openai.com/v1
LLM_API_STYLE AI 可选 autochatresponses,默认自动兼容
S3_ENDPOINT 图床可选 手动填写完整的 S3 兼容端点
S3_ACCESS_KEY_ID 图床可选 R2 API Token 的 Access Key ID
S3_SECRET_ACCESS_KEY 图床可选 R2 API Token 的 Secret Access Key
S3_BUCKET 图床可选 编辑器拖拽图片时使用的默认存储桶
S3_PUBLIC_URL 图床可选 图片公开访问基础地址(自定义域名或 r2.dev 地址)

不要把 Token、密码或密钥提交到仓库,也不要为这些变量添加会将其暴露到浏览器的 VITE_ 前缀。

部署到 Vercel

一键导入

点击文首的 Deploy with Vercel 按钮,Vercel 会克隆本仓库并提示填写必需变量。部署完成后打开站点;若配置不完整,设置引导页会列出缺少的变量。

手动导入

  1. 在 Vercel 新建项目并导入此 GitHub 仓库。
  2. Framework Preset 可保持自动检测;仓库中的 vercel.json 已指定 npm run builddist
  3. 在 Settings → Environment Variables 中添加必需变量,并应用到 Production 和需要使用的 Preview 环境。
  4. 重新部署。环境变量变更不会自动进入已经完成的旧部署。
  5. 打开站点登录,确认文章列表能够从目标博客仓库载入。

推送到连接的 GitHub 分支后,Vercel 会按项目的 Git 集成设置自动创建新部署。本项目不需要数据库,也不会在 Serverless Function 的临时磁盘中保存文章。

AI 优化工作流

配置 LLM_API_KEYLLM_MODEL 后,在文章编辑页面中选择“AI 优化”。可选择生成标题和内容、校对、改善结构、精简内容或优化大纲,并补充自定义要求。系统会展示原文和建议稿;只有点击“应用到文章”后,建议才进入编辑器,仍需再次点击“保存并提交”才会写入 GitHub。

这一流程借鉴 Obsidian Smart Composer 的 Apply Edit 与提示模板体验:让用户控制上下文、预览建议并明确应用,而不是让模型直接改写远端文件。

S3 兼容图床

配置 S3_ENDPOINTS3_ACCESS_KEY_IDS3_SECRET_ACCESS_KEY 后,左侧“图床”会通过标准 AWS S3 SDK 连接 Cloudflare R2 等 S3 兼容对象存储,支持存储桶切换、上传、分页浏览、复制 Markdown 链接和删除图片。建议同时设置 S3_BUCKETS3_PUBLIC_URL;编辑器会把拖入或粘贴的图片上传到默认桶,并在光标处插入 Markdown 图片链接。

安全说明

  • 使用只授权目标博客仓库的细粒度 GitHub Token。
  • 优先使用 ADMIN_PASSWORD_HASH,并定期轮换 Token 与密钥。
  • 服务端会校验写请求来源、文章相对路径和当前 GitHub blob SHA,避免跨站写入、路径穿越及静默覆盖远端新版本。
  • AI 功能会把当前文章发送到配置的大模型服务;敏感文章应先确认服务商的数据处理政策。

License

本项目沿用仓库中的 GPL-3.0 许可证。

About

Resources

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages