从零到一键发布:Obsidian + Hexo + GitHub Pages 个人博客搭建指南


前言

我一直使用 Obsidian 管理笔记,它很好地满足了我的写作需求。但我始终渴望拥有一个属于自己的博客——一方面希望将积累的知识分享出去,获得反馈;另一方面,通过维护博客倒逼自己持续写作和总结,提升表达能力。

本文将完整记录我搭建博客的过程,并重点解决从 Obsidian 写作到博客发布的自动化流程。如果你也想打造一个“赛博小窝”,希望我的经验能给你带来一些参考。

搭建方案

我的博客基于以下工具组合实现:

  • 写作端Obsidian,笔记的写作组织工具。
  • 同步插件Enveloppe:将本地文章同步到GitHub的Obsidian插件。
  • 博客框架Hexo:博客站点使用的框架。
  • 主题hexo-theme-matery:简洁美观的响应式主题。
  • 托管平台GitHub Pages:免费静态网页托管。

由于我不希望公开所有文章的源文件,我创建了两个 GitHub 仓库:

  • 私有仓库 hexo-project – 存放 Hexo 博客配置、主题和文章源文件。
  • 公共仓库 <用户名>.github.io – 存放 Hexo 生成的静态文件,供 GitHub Pages 展示。

整体流程如下图所示:

操作步骤

搭建 Hexo 博客

安装依赖

Hexo 依赖 Node.js 和 Git,请根据官方文档完成安装:

安装Git
安装Node-js

初始化 Hexo

安装 Hexo 命令行工具并创建项目:

npm install -g hexo-cli          # 全局安装 Hexo
hexo init hexo-blog              # 初始化博客项目
cd hexo-blog
npm install                      # 安装项目依赖

本地预览

生成静态文件并启动本地服务器:

hexo g        # 生成页面
hexo s        # 启动服务

访问 http://localhost:4000 即可看到默认的 Hello World 页面。

更换主题

我选择的是 hexo-theme-matery,按以下步骤启用:

git clone https://github.com/blinkfox/hexo-theme-matery.git

修改 Hexo 根目录下的 _config.yml 的 theme 的值:theme: hexo-theme-matery

theme: hexo-theme-matery

重新生成并预览:

hexo clean # 清除  
hexo g # 生成  
hexo s # 本地启动

此时主题已更换成功。你还可以参考 主题文档 进行个性化配置(如菜单、关于页等)。

快捷建站(可选)

如果你想跳过初始配置,可以直接克隆已配置好的示例博客:

git clone https://github.com/blinkfox/blinkfox.github.io.git

cd blinkfox.github.io
npm install
hexo s

之后根据 Hexo 配置文档 和主题文档修改个人信息即可。

配置 GitHub 与自动部署

创建仓库

在 GitHub 上创建两个仓库:

  • 公共仓库 <你的用户名>.github.io – 用于托管静态页面。
  • 私有仓库 hexo-blog – 用于存放博客源文件及配置。

关联本地仓库

将本地的 hexo-blog 文件夹与 GitHub 上的 hexo-blog 私有仓库关联,并推送所有文件。

生成 Personal Access Token

在 GitHub 的 Settings → Developer settings → Personal access tokens → Tokens (classic) 中生成一个新 token,赋予 repo 权限。复制并保存该 token(只会显示一次)。

在私有仓库中设置 Secrets

进入 hexo-blog 仓库的 Settings → Secrets and variables → Actions,点击 New repository secret,将上一步的 token 粘贴进去,并命名为 HEXO_BLOG_DEPLOY_TOKEN

配置 GitHub Actions 工作流

在 hexo-blog 仓库中创建 .github/workflows/deploy.yml 文件,内容如下:

name: Deploy Hexo to GitHub Pages

on:
  push:
    branches:
      - main # 或你使用的默认分支名称

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout blog source
        uses: actions/checkout@v4
        with:
          path: blog

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "24" # 设置 Node.js 版本

      - name: Cache dependencies
        uses: actions/cache@v3
        with:
          path: node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Install dependencies
        run: npm install
        working-directory: ./blog

      - name: Install Hexo CLI
        run: npm install -g hexo-cli
        working-directory: ./blog

      - name: Generate static pages
        run: hexo generate
        working-directory: ./blog

      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v3
        with:

          personal_token: ${{ secrets.HEXO_BLOG_DEPLOY_TOKEN }} # 这里是设置的token密码名称
          publish_dir: ./blog/public
          external_repository: gloamfox/gloamfox.github.io # 更改为你的 GitHub Pages 仓库, username 是你的用户名
          publish_branch: main # GitHub Pages 分支

该工作流会在每次向 hexo-blog 仓库的 main 分支推送时自动执行:安装依赖、生成静态文件,并将生成的 public目录推送到你的公共仓库。

开启 GitHub Pages

进入公共仓库 <你的用户名>.github.io 的 Settings → Pages,在 Branch 中选择 main 分支,点击保存。GitHub Pages 会提供一个默认域名:https://<你的用户名>.github.io

实现 Obsidian 到博客的一键发布

痛点与需求

在写作过程中,我希望:

  • 只发布部分精选文章,而非全部笔记。
  • 图片、Excalidraw 绘图等附件能自动上传并正确显示。
  • Obsidian 的双链语法能转换为普通 Markdown 链接,避免失效。
  • 发布的文章样式与本地一致。

Enveloppe 插件完美解决了这些问题。它可以将指定文章及其依赖的资源同步到 GitHub 仓库,并自动处理链接转换。

安装与配置 Enveloppe

在 Obsidian 社区插件中搜索并安装 Enveloppe。安装后进入插件设置,主要配置项如下:

  • GitHub 仓库:填写你的私有仓库 hexo-blog
  • 分支main(与工作流触发分支一致)。
  • 文件夹:可以设置默认上传的文件夹,例如 source/_posts(Hexo 默认的文章目录)。
  • 附件处理
    • 勾选“上传附件”。
    • 设置附件文件夹为 source/Assets,这样图片会统一上传到 Hexo 的全局资源文件夹,便于引用。
  • 链接转换:启用“转换 Obsidian 内部链接”和“转换双链为 Markdown 链接”。
  • Excalidraw 支持:勾选“将 Excalidraw 文件转换为 SVG”,使其能在博客中正常渲染。

其他选项可根据需要调整,详细说明可参考 Enveloppe 官方文档

发布流程

在 Obsidian 中编辑完一篇文章后,只需在文件菜单中点击“通过 Enveloppe 上传”按钮(或使用快捷键),插件会自动:

  • 将文章 Markdown 文件上传至指定仓库路径。
  • 上传文章中引用的所有本地图片和附件(按配置存放至 source/Assets)。
  • 转换内部链接为相对路径,确保博客中能正确跳转(如果链接指向未发布的笔记,可以配置为“链接到外部”或忽略)。

推送完成后,GitHub Actions 会自动触发,几分钟后你的博客就会更新。

遇到的问题与解决

  • 私有仓库上传路径错误:早期版本中,Enveloppe 将文件上传到了仓库根目录,而非 source/_posts。该问题已在 GitHub 上的 issue #414 中修复,截至到文章发布插件市场尚未发布修复版本。如需提前使用修复版,可手动下载插件的最新源码替换本地插件。
  • 图片无法显示:确保附件文件夹设置为 source/Assets,并在文章中通过相对路径引用(例如 ![](/Assets/文章名/图片.png))。Enveloppe 会自动调整链接。

总结

通过以上步骤,我们实现了:

  1. 基于 Hexo 和 matery 主题搭建了一个美观的个人博客。
  2. 利用 GitHub Actions 实现了推送即部署的自动化流程。
  3. 借助 Enveloppe 插件,从 Obsidian 写作到博客发布做到了“一键完成”,图片、绘图和内部链接均能完美转换。

这套流程不仅简化了发布操作,更重要的是让我能够专注于内容创作,而无需担心技术细节。希望本文也能帮助你顺利搭建属于自己的“赛博小窝”,并享受写作与分享的乐趣。


文章作者: gloamfox
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 gloamfox !
 上一篇
jsDelivr 缓存刷新与版本控制
本文介绍了jsDelivr CDN服务的缓存问题及解决方案。由于jsDelivr缓存更新时间为24小时,文章详细说明了两种强制刷新方法:通过purge前缀链接和使用官方刷新工具。同时推荐了更可靠的版本号控制方案,通过在URL中添加版本号或commit hash来确保资源即时更新,避免缓存问题。
2026-03-19
下一篇 
解耦复杂业务:基于责任链与上下文的重构实战
文章分享了订单计算系统的重构过程,针对代码复杂度高、业务逻辑不统一等问题,通过过程分解、上下文处理和责任链设计模式进行重构。详细介绍了如何将订单计算逻辑拆分为多个业务处理器,使用上下文对象管理参数和返回值,以及通过责任链模式实现业务编排。这种重构方式提高了代码的可读性、可维护性和复用性,解决了大泥球类的问题。
2026-03-16
  目录