从零搭建 Hexo + NexT 个人博客:双端自动部署全记录
前言
作为一个程序员,拥有一个属于自己的技术博客一直是我的愿望。经过调研,我选择了 Hexo + NexT 这套经典组合,并实现了 GitHub Pages + Cloudflare Pages 双端自动部署。
本文将完整记录整个搭建过程,重点分享遇到的问题和解决方案,希望能帮到有同样需求的朋友。
一、技术选型
| 项目 | 选择 | 理由 |
|---|---|---|
| 静态博客框架 | Hexo 6.3.0 | 生态成熟,插件丰富,Markdown 写作 |
| 主题 | NexT 8.27.0 | 最流行的 Hexo 主题,简洁优雅 |
| 主题风格 | Gemini | 卡片式布局,信息密度适中 |
| 代码托管 | GitHub 私有仓库 | 源码安全,免费无限私有仓库 |
| 部署平台 | GitHub Pages + Cloudflare Pages | 双端冗余,Cloudflare 无限带宽 |
| CI/CD | GitHub Actions | 与 GitHub 无缝集成,免费额度充足 |
| 图床 | 阿里云 OSS | 国内访问快,有免费额度 |
二、环境准备
2.1 基础软件
1 | # 检查 Node.js(推荐 LTS 版本) |
2.2 安装 Hexo CLI
1 | npm install -g hexo-cli |
2.3 初始化项目
这里遇到了第一个坑:hexo init 要求目标目录必须为空,而我的工作目录已有文件。
解决方案:在临时目录初始化,再复制回来。
1 | # 克隆 Hexo 模板到临时目录 |
网络提示:如果你的网络环境无法直接访问 GitHub,npm 安装时可以使用
--registry=https://registry.npmmirror.com切换到国内镜像源。
三、主题配置
3.1 安装 NexT 主题
1 | npm install hexo-theme-next |
3.2 修改主配置 _config.yml
1 | # 站点信息 |
3.3 创建 NexT 配置 _config.next.yml
NexT 推荐使用独立的 _config.next.yml 文件来定制主题,这样升级主题时不会丢失配置。
1 | # 选择风格 |
踩坑记录:如果没有配置
codeblock.theme.light/dark,hexo generate会报ENOENT: no such file or directory, open ''错误。此外还需要单独安装highlight.js:
1 npm install highlight.js
3.4 创建必要页面
1 | hexo new page about # 关于页面 |
然后修改各页面的 front-matter:
1 | # source/categories/index.md |
3.5 安装功能插件
1 | # 本地搜索 |
在 _config.yml 末尾添加:
1 | # 搜索 |
3.6 本地预览
1 | hexo clean && hexo generate && hexo server |
浏览器打开 http://localhost:4000,看到博客正常显示就可以进入下一步了。
四、GitHub 仓库配置
4.1 创建两个仓库
| 仓库 | 类型 | 用途 |
|---|---|---|
my-blog-source |
私有 | 存放博客源码(Markdown 等) |
你的用户名.github.io |
公开 | GitHub Pages 部署仓库 |
为什么源码要私有? 因为博客源码包含配置文件、未发布的草稿等,不适合公开。而部署产物(HTML/CSS/JS)是公开的。
4.2 SSH 密钥配置
1 | # 生成 SSH 密钥 |
4.3 关联远程仓库
1 | cd 你的博客目录 |
五、自动部署(核心部分)
这是整个搭建过程中最折腾的部分,经历了多次方案迭代。
5.1 部署方案演进
1 | 方案一:SSH Deploy Key + peaceiris/actions-gh-pages |
5.2 最终方案:GitHub Actions + 直接推送
创建 .github/workflows/deploy.yml:
1 | name: Deploy Blog |
5.3 配置 GitHub Secrets
在 my-blog-source 仓库的 Settings → Secrets → Actions 中添加:
| Secret 名称 | 说明 | 获取方式 |
|---|---|---|
GH_TOKEN |
GitHub Personal Access Token | Settings → Developer settings → Personal access tokens → 创建 Classic Token,勾选 repo 权限 |
5.4 配置 GitHub Pages
在 你的用户名.github.io 仓库的 Settings → Pages 中:
- Source: Deploy from a branch
- Branch: main / (root)
六、Cloudflare Pages 配置
Cloudflare Pages 的接入比 GitHub Pages 简单得多:
- 登录 Cloudflare Dashboard
- 左侧菜单 → Workers & Pages
- 点击 Create → Pages → Connect to Git
- 选择你的
my-blog-source仓库 - 配置构建命令:
npx hexo generate - 输出目录:
public
Cloudflare 会自动监听 GitHub 推送并构建部署,分配一个 *.pages.dev 的子域名。
优势:Cloudflare Pages 带宽完全免费无限制,作为 GitHub Pages 的冗余备份非常合适。
七、遇到的问题汇总
问题 1:hexo init 要求空目录
现象:hexo init . 报错 FATAL target not empty
原因:Hexo 初始化要求目标目录为空
解决:在临时目录初始化后复制文件回来
问题 2:GitHub 连接超时
现象:fatal: unable to access 'https://github.com/...' after 21095 ms
原因:国内网络无法直接访问 GitHub
解决:
1 | # 使用 Gitee 镜像克隆 |
问题 3:代码高亮报错
现象:hexo generate 报 ENOENT: no such file or directory, open ''
原因:NexT 主题需要 highlight.js 和 codeblock.theme 配置
解决:
1 | npm install highlight.js |
在 _config.next.yml 中添加:
1 | codeblock: |
问题 4:SSH 连接被拒绝
现象:ssh -T git@github.com 报 Connection closed 或 Permission denied
原因:VPN 环境下 SSH 端口 22 被阻断
解决:配置 SSH 走 443 端口:
1 | # 编辑 ~/.ssh/config |
问题 5:私有仓库不支持 GitHub Pages
现象:actions/configure-pages 报 Get Pages site failed
原因:GitHub 免费账户的私有仓库不支持 Pages 功能
解决:使用私有仓库存放源码,通过 Actions 将构建产物推送到单独的公开仓库
问题 6:git push 报 refspec 不匹配
现象:error: src refspec main does not match any
原因:git init 默认创建 master 分支,但远程期望 main 分支
解决:在 push 前切换分支:
1 | git checkout -b main |
八、日常写作流程
搭建完成后,日常写博客只需要三步:
1 | # 1. 写文章 |
推送后 GitHub Actions 会自动构建并部署到 GitHub Pages,Cloudflare Pages 也会同步更新。
九、后续规划
- 博客基础搭建
- NexT 主题定制
- GitHub Pages 自动部署
- Cloudflare Pages 双端部署
- Gitalk 评论系统(需要 GitHub OAuth App)
- 阿里云 OSS 图床配置
- 自定义域名绑定
- 百度/Google 收录
总结
整个搭建过程最大的挑战不是技术本身,而是网络环境带来的各种限制。在 VPN 环境下,无论是 SSH 还是 HTTPS 都需要额外配置代理,这是很多教程不会提到的。
最终的架构是:私有仓库存源码 → GitHub Actions 构建 → 推送到公开仓库 → GitHub Pages 提供服务,同时 Cloudflare Pages 作为冗余。这套方案免费、稳定、且支持跨设备同步。
希望这篇文章对你有帮助!如果遇到问题,欢迎在评论区交流。