个人博客维护手册

  • ~4.08K 字

这篇文章记录当前博客的日常维护方式和技术结构。它不是面向读者的功能介绍,而是一份给以后自己的运行手册:写文章应该从哪里开始,发布链路经过哪些地方,访问入口为什么有多个,换电脑或排查问题时又该看哪些文件。

当前维护目标

这个博客现在被拆成两件事:内容维护和访问分发。

内容维护尽量放在本地完成。我在 Obsidian 里写文章,通过本地的图形化工具同步到 Hexo 仓库;构建检查通过后,只需要把 source 分支推到 GitHub。真正的静态页面生成、GitHub Pages 发布,以及服务器托管版本的同步,都交给 GitHub Actions 处理。

访问分发则提供多个入口。主入口是 https://blog.orizhen.xyz/,它不是文章列表,而是一个选择页面。这里会根据网络环境引导到服务器托管版本、腾讯云 EdgeOne 加速版本,以及 GitHub Pages 版本。这样做的好处是:写作和部署保持统一,访问体验可以按线路分流。

日常写作流程

日常维护优先使用图形界面:

1
npm run blog

图形界面会自动寻找带 Qt 的 Python 环境。当前机器上使用的是 Anaconda 里的 PyQt 环境;如果以后换电脑,只要 npm run blog:check 能显示 Python 路径和 Qt binding,就说明 GUI 可以启动。

正常写文章的流程是:

  1. 在 Obsidian 的 Blog/Posts 目录写 Markdown。
  2. 确认文章 front matter 里 draft: false,否则同步时会被当作草稿跳过。
  3. 使用 GUI 的 同步到 Hexo,把 Obsidian 文章复制到仓库的 source/_posts
  4. 使用 构建检查,确认 Hexo 可以生成静态页面。
  5. 使用 发布全站一键完成,推送 source 分支,让 GitHub Actions 接管后续部署。

命令行也可以完成同样的事情:

1
2
3
npm run blog:sync
npm run blog:build
npm run blog:publish

其中 blog:publish 的本质是推送源码分支。它不会在本机直接上传每个线上站点,线上部署由 GitHub Actions 统一执行。

文章和图片

文章源文件以 Hexo 的 source/_posts 为准,Obsidian 是更舒服的写作入口。同步脚本会把 Obsidian 中的文章复制到 Hexo 目录。

封面字段可以写本地站内路径,也可以写图床链接:

1
2
cover: /images/posts/example.webp
cover: https://example.com/example.webp

如果封面为空,或者仍然是占位路径,同步时会自动使用默认封面:

1
cover: /images/theme/default-cover.webp

GUI 里也有两个辅助操作:

  • 选择封面:把本地图片复制到博客图片目录,并写入最近修改文章的 cover
  • 封面 URL:直接把图床链接写入最近修改文章的 cover

如果图片已经放在图床上,直接在 Obsidian front matter 里写 URL 就可以,不需要额外处理。

删除文章

删除文章不要只删仓库里的 Markdown。推荐用 GUI 的 删除文章

  • 可以按标题或文件名搜索。
  • 默认优先显示最近修改的文章。
  • 删除前会显示 Obsidian 原文路径、回收站路径和 Hexo 文件路径。
  • 确认后会把 Obsidian 原文移动到 Blog/Trash,同时删除 source/_posts 里的同名文件。
  • 随后构建并发布,让线上页面同步下线。

这个流程的目的不是复杂化删除,而是避免“本地删了,线上还在”的情况。

发布链路

当前仓库使用 source 分支维护博客源码。推送到 source 后,GitHub Actions 会运行 .github/workflows/deploy.yml

Actions 做三件事:

  1. 安装 Node.js 依赖。
  2. 使用 Hexo 构建 GitHub Pages 版本,并发布到 main 分支。
  3. 使用单独的 HK 配置构建服务器托管版本,并通过 SSH 同步到服务器目录。

GitHub Pages 是公开静态源站,访问地址是:

1
https://ori2333.github.io/

服务器托管版本部署在:

1
https://blog.orizhen.xyz/blog/

入口页面部署在:

1
https://blog.orizhen.xyz/

入口页展示三条线路:服务器托管版本、中国大陆加速访问、GitHub Pages 源站。这个顺序是有意安排的:默认入口优先给自有服务器版本,再给大陆 CDN 加速版本,最后保留 GitHub Pages 作为稳定备用。

服务器托管版本

服务器托管相关脚本在:

1
tools/hk_deploy/

关键文件包括:

  • deploy_hk.py:构建并上传服务器托管版本,同时生成入口页面。
  • _config.hk.yml:覆盖 Hexo 的 urlrootpublic_dir,让博客在 /blog/ 下正常工作。
  • hk_deploy.config.json:记录服务器、域名、远程目录、入口链接等配置。
  • nginx-ori2333-blog.conf:Nginx 站点配置模板。
  • setup_hk_server.py:初始化服务器 Nginx 和 HTTPS 的辅助脚本。

线上目录固定为:

1
/var/www/ori2333-blog

脚本只清理和同步这个目录,不碰服务器上已有的其他服务。旧的 /hk/ 路径会重定向到 /blog/,这是为了兼容早期测试阶段留下的地址。

HTTPS 使用 Let’s Encrypt。证书有效期 90 天,服务器上需要保持自动续签任务开启。当前设计依赖 certbot.timer 或等效的定时任务,不应该手动等到证书过期后再处理。

EdgeOne 加速入口

腾讯云 EdgeOne 作为中国大陆访问加速线路。它不是独立写作源,也不是另一套博客内容,而是访问分发层的一条加速入口。

入口页中的大陆加速访问指向 EdgeOne 地址。日常维护时不需要单独为 EdgeOne 写文章或手动同步内容;只要 GitHub Pages 和服务器托管版本部署正常,EdgeOne 侧按它的源站和缓存策略更新即可。

如果发现 EdgeOne 看到的内容落后,优先检查:

  • GitHub Actions 是否部署成功。
  • EdgeOne 配置的源站是否正常。
  • 是否命中旧缓存。
  • 页面 URL 是否带了旧的临时 token 或过期参数。

仓库结构

常用目录可以按下面理解:

1
2
3
4
5
6
7
8
source/_posts/              # Hexo 文章源文件
source/images/posts/ # 文章图片
source/images/theme/ # 主题图片、头像、背景、默认封面
tools/blog/ # 本地 GUI 和同步脚本
tools/hk_deploy/ # 服务器托管版本部署脚本
templates/blog-post.md # 新文章模板
docs/blog-workflow-migration.md # 换电脑和环境迁移说明
.github/workflows/deploy.yml # GitHub Actions 部署流程

不要手动维护 public/。它是构建产物,会被 hexo cleanhexo generate 重建。真正应该提交的是源码、文章、图片、脚本和配置。

换电脑时要恢复什么

换电脑时,重点不是复制 public/,而是恢复这几类东西:

  1. Node.js 和 npm。
  2. 仓库依赖:npm ci
  3. 一个带 Qt 的 Python 环境,例如 Anaconda 里的 PyQt。
  4. Obsidian 库路径,并在 tools/blog/blog.config.json 里配置正确。
  5. GitHub 访问权限,可以推送 source 分支。
  6. 如需本地手动部署服务器版本,恢复 SSH key。

GitHub Actions 的服务器部署密钥在仓库的 Actions Secrets 里维护,主要包括:

1
2
3
4
5
HK_HOST
HK_PORT
HK_USER
HK_REMOTE_ROOT
HK_SSH_KEY

这些 secret 不应该写进仓库。仓库里只保留脚本和配置模板。

常见排查路径

如果 GUI 打不开,先运行:

1
npm run blog:check

如果同步后文章没有出现,检查:

  • Obsidian 文章是否在 Blog/Posts
  • front matter 是否还写着 draft: true
  • tools/blog/blog.config.json 里的 Obsidian 路径是否正确。

如果本地构建失败,运行:

1
npm run blog:build

如果线上没有更新,按顺序看:

  1. 本地是否已经推送 source 分支。
  2. GitHub Actions 是否成功。
  3. GitHub Pages 是否更新。
  4. 服务器托管版本是否更新。
  5. EdgeOne 是否仍然命中缓存。

维护原则

这个博客系统现在的核心原则是:写作入口简单,部署链路自动,访问线路可替换。

Obsidian 负责写作体验,GUI 负责减少重复操作,Hexo 负责生成静态站点,GitHub Actions 负责编排部署,服务器和 EdgeOne 负责访问体验。只要这个边界不乱,后续换主题、换域名、换服务器,成本都会比较低。

赞助喵
非常感谢您的喜欢!
赞助喵
分享这一刻
让朋友们也来瞅瞅!