为什么要自己搭博客?
在 CSDN 写了多年技术文章,一直想有一个完全属于自己的空间——文章存在自己硬盘里,域名自己定,不需要被平台审核,也没有广告。
恰巧最近在用 AI 助手(WorkBuddy),于是尝试让它全程帮我搭建。结果出乎意料地顺利,从零到上线只花了一个下午。
本文记录完整过程,每一步都可直接复现,供有类似需求的同学参考。
技术选型:为什么选 Hugo + GitHub Pages?
| 方案 | 优点 | 缺点 |
|---|---|---|
| Hugo + GitHub Pages | 免费、完全可控、Markdown 写作、随时可迁移 | 需要一点命令行基础 |
| Hexo + Vercel | 交互性强、现代感 | 配置相对复杂 |
| 语雀 / 知乎 | 零门槛、有流量 | 数据不在自己手里 |
| WordPress | 功能全面 | 维护成本高、需要服务器 |
最终选 Hugo + GitHub Pages,核心原因是:文章用 Markdown 写,100% 可迁移,平台跑路也不怕。
第一步:安装 Hugo
Hugo 是用 Go 写的静态站点生成器,特点是构建速度极快(几千页毫秒级)。
Windows 安装(推荐 winget)
| |
⚠️ 务必安装 Extended 版本,支持 SASS/SCSS,否则 PaperMod 等主题会构建失败。
macOS / Linux 安装
| |
验证安装
| |
✅ 本文后续 workflow 配置中指定 Hugo 版本为
0.162.1,建议安装相同版本避免兼容问题。
第二步:创建站点
| |
目录结构如下:
wenling-buyi-blog/
├── archetypes/ # 文章模板(hugo new 时自动套用)
├── assets/ # 需要处理的前端资源
├── content/ # 【你的文章放这里】
├── data/ # 数据文件
├── layouts/ # 自定义布局
├── static/ # 图片等静态资源(直接复制到产出目录)
├── themes/ # 主题目录
├── .gitignore # Git 忽略规则
└── config.toml # 【核心配置文件】
💡
hugo new site创建的只是骨架,主题和内容需要自己加。
第三步:配置 .gitignore
在站点根目录创建 .gitignore,避免把构建产物提交到 Git:
# Hugo 构建产物
/public/
/resources/_gen/
/.hugo_cache/
# 系统文件
.DS_Store
Thumbs.db
# IDE
.vscode/
.idea/
# 主题子模块的临时文件
/themes/*/node_modules/
/themes/*/package-lock.json
第四步:安装 PaperMod 主题
PaperMod 是一款非常流行的 Hugo 主题,简洁、响应式、对中文支持好,GitHub Stars 超过 10k。
用 Git 子模块方式安装(推荐)
| |
✅ 为什么用 submodule? 主题后续有更新时,只需
git submodule update --remote即可同步,不会和你自己的修改冲突。
在 config.toml 中指定主题
| |
第五步:配置 config.toml(最核心的一步)
直接上我的最终配置(已验证可用),逐项加了注释:
| |
📝 更多 PaperMod 配置选项 参见官方文档:https://github.com/adityatelange/hugo-PaperMod/wiki/Variables
第六步:配置文章模板(archetypes)
hugo new 创建新文章时,会自动从 archetypes/default.md 读取模板。创建一个好用的模板能大幅提升写作体验:
在 archetypes/default.md 写入:
| |
💡
draft: true表示文章是草稿,构建时不会发布到线上。draft: false才正式发布。
第七步:写第一篇文章
| |
打开生成的 content/posts/hello.md,编辑内容:
| |
第八步:本地预览
在发布之前,先本地预览确认效果:
| |
-D参数表示包含草稿文章(draft: true 的也会显示)。
然后在浏览器打开 http://localhost:1313 就能实时预览。修改 Markdown 文件后会自动刷新,非常方便。
按 Ctrl + C 停止本地服务器。
第九步:创建 About 页面 + 搜索/归档页
9.1 关于页
| |
编辑 content/about.md:
| |
9.2 搜索页(⚠️ 很多人会漏掉这步!)
PaperMod 导航栏自带搜索按钮,但需要手动创建对应页面文件,否则点击后 404:
| |
创建 content/search/_index.md:
| |
⚠️ 必须是
_index.md(下划线开头),不能写成search.md!详见踩坑记录 #10~#12。
9.3 归档页(同上,不创建会 404)
| |
创建 content/archives/_index.md:
| |
第十步:配置 GitHub Pages 自动部署(最容易踩坑的一步)
10.1 在 GitHub 创建仓库
- 打开 https://github.com/new
- Repository name 必须填:
你的用户名.github.io- 例如我的用户名是
sikinzen,仓库名就是sikinzen.github.io
- 例如我的用户名是
- 选择 Public
- 不要勾选 “Add a README file”
- 点击 Create repository
10.2 创建 GitHub Actions workflow
在本地博客目录创建文件 .github/workflows/deploy.yml:
| |
⚠️ 注意 branches 要同时包含
"main"和"master",因为不同人的 GitHub 默认分支可能不同。
10.3 关联远程仓库并推送
| |
把
sikinzen替换成你自己的 GitHub 用户名。
第十一步:在 GitHub 开启 Pages
这一步必须手动操作,AI 没法替你点:
- 打开 https://github.com/你的用户名/你的用户名.github.io/settings/pages
- 找到 Source(源) 部分
- 把选项从 “Deploy from a branch” 改成 “GitHub Actions”
- 点击 Save 保存
设置完之后,GitHub Actions 会自动运行,约 1~2 分钟博客就上线了。
第十二步:验证部署状态
推送后,访问你的仓库 Actions 标签页,查看部署进度:
- 🟡 in progress — 正在构建,等 1~2 分钟
- 🟢 green checkmark — 部署成功!访问
https://你的用户名.github.io/查看 - 🔴 red X — 构建失败,点进去看 Logs 找原因
常见构建失败原因
| 错误信息 | 原因 | 解决方法 |
|---|---|---|
process exited with error: 1 | Hugo 版本太旧,与 PaperMod 不兼容 | workflow 里指定 hugo-version: '0.162.1' |
theme not found | 没拉取 PaperMod 子模块 | checkout 步骤加 submodules: true |
| 推送后没触发 Actions | workflow 里只监听 main,但仓库默认分支是 master | 在 branches 里加上 "master" |
| 404 页面 | GitHub Pages 没开启,或 Source 没选 “GitHub Actions” | 去 Settings → Pages 手动开启 |
日常写作与发布流程(最重要的一节)
博客搭好之后,以后每次写文章只需要 4 步:
完整流程
| |
Front Matter 字段速查表
每篇文章顶部的 --- 包裹的部分叫做 Front Matter,常见字段:
| 字段 | 说明 | 示例 |
|---|---|---|
title | 文章标题(必填) | "如何使用 Hugo 搭建博客" |
date | 发布时间(必填) | 2026-06-05T13:00:00+08:00 |
draft | 是否为草稿 | true(不发布)/ false(发布) |
description | 文章摘要 | "本文介绍..." |
summary | 自定义摘要(覆盖 description) | "..." |
tags | 标签(可多个) | ["Hugo", "GitHub Pages"] |
categories | 分类(可多个) | ["工具", "教程"] |
keywords | 关键词(SEO 用) | ["博客搭建"] |
series | 文章系列 | ["Hugo 教程"] |
| ——— | —— | ——— |
带附件的文章(Page Bundle 模式)
当文章需要附带图片、PDF、压缩包等附件时,需要使用 Hugo 的 Page Bundle 机制。这是 Hugo 原生支持的特性,与传统的单文件文章并存,无需全局迁移。
两种文章模式对比
| 模式 | 存放方式 | 适用场景 |
|---|---|---|
| 传统单文件 | content/posts/文章名.md | 纯文本文章,无附件 |
| Page Bundle(目录) | content/posts/文章名/index.md + 附件文件 | 需要附带图片、PDF、代码包等 |
两种模式完全兼容,Hugo 会自动识别:
- 存在
content/posts/foo.md→ 当作单文件文章处理 - 存在
content/posts/bar/目录且含index.md→ 当作 Page Bundle 处理
存量文章无需任何迁移,只有需要加附件时才将对应文章转为目录结构。
创建 Page Bundle 文章的两种方式
方式一:hugo new 后手动转目录(推荐)
| |
方式二:直接手动创建目录和 index.md
| |
💡 方式一更推荐,因为
hugo new会自动从archetypes/default.md读取模板,省去手动填写 Front Matter 的麻烦。
在文章中引用附件
方式一:正文中直接 Markdown 链接(精准引用)
适合在文章特定位置引用某个附件:
| |
⚠️ 路径是相对路径,因为
index.md和附件在同一个目录下。
方式二: 短代码(自动罗列全部附件)
在文章末尾添加这行,Hugo 会自动列出该目录下所有非 Markdown 文件:
| |
渲染效果包含:
- 文件类型图标(📗 PDF、📦 压缩包、🖼️ 图片、📝 Word、📊 Excel、💻 代码等)
- 文件名和格式标签
- 文件大小
完整示例
目录结构:
content/posts/how-to-use-openclaw/
├── index.md # 文章正文
├── architecture.png # 架构图
├── sample-code.zip # 示例代码包
└── reference.pdf # 参考文档
index.md 内容:
| |
自定义附件列表样式(可选)
如果需要对附件列表区域做样式调整,可以在 assets/css/extended/attachments.css 中自定义。PaperMod 主题会自动加载 assets/css/extended/ 目录下的所有 CSS 文件。
进阶:常用自定义配置
修改主题颜色
PaperMod 支持通过 style 参数自定义主题色,在 config.toml 的 [params] 下添加:
| |
添加头像/作者图片
- 把头像图片放到
static/images/avatar.jpg - 在
config.toml的[params.homeInfoParams]上方添加:
| |
添加评论系统(可选)
PaperMod 内置支持多个评论系统,以 Giscus(基于 GitHub Discussions,免费)为例:
- 先按 https://giscus.app/ 的指引配置好 GitHub Discussions
- 在
config.toml添加:
| |
从 CSDN 迁移旧文章
如果你之前在 CSDN 有文章想迁移过来:
方法一:手动复制(适合文章少的情况)
- 在 CSDN 打开旧文章,复制正文 Markdown(CSDN 编辑器支持导出 Markdown)
hugo new posts/旧文章标题.md- 粘贴内容,补充 front matter
git add . && git commit && git push
方法二:批量转换(适合文章多的情况)
CSDN 文章导出后通常是 HTML 或 Markdown,可以用 pandoc 做格式转换:
| |
💡 转换后务必人工检查一遍,特别是代码块和图片链接。
图片处理
CSDN 的图片在 https://img-blog.csdn.net/ 等地址,建议下载到本地:
static/images/
├── 2024-01-01-article1/
│ ├── img1.png
│ └── img2.jpg
然后在 Markdown 里引用:
| |
踩坑完整记录
以下是我搭建过程中真实遇到的所有坑,逐一记录解决方法:
| # | 问题 | 根本原因 | 解决方法 |
|---|---|---|---|
| 1 | hugo new 执行后找不到生成的文件 | 当前目录不在博客根目录 | 先 cd 到博客根目录再执行 |
| 2 | push 后博客 404 | GitHub Pages 默认没开启 | Settings → Pages → Source 选 “GitHub Actions” |
| 3 | Build 失败(exit code 1) | Hugo 版本太旧,与 PaperMod 不兼容 | workflow 指定 hugo-version: '0.162.1' |
| 4 | 触发不了 Actions | workflow 只监听 main,但仓库默认分支是 master | branches 加上 "master" |
| 5 | 主题没生效 / 构建报错找不到主题 | checkout 没拉取子模块 | 加 submodules: true |
| 6 | fatal: 'themes/PaperMod' already exists and is not a valid git repo | 之前有残留目录但不是合法子模块 | rm -rf themes/PaperMod 后重新 git submodule add |
| 7 | *** Please tell me who you are. | Git 未配置用户信息 | git config user.email "xxx" + git config user.name "xxx" |
| 8 | 本地 hugo server 正常,但 GitHub Actions 构建失败 | 本地 Hugo 版本与 workflow 指定版本不一致 | 统一版本号 |
| 9 | languageCode 废弃警告 | Hugo v0.158+ 改用 locale | 同时保留 languageCode(兼容旧版)和 locale(新版) |
| 10 | 🔍 导航栏"搜索"按钮点击后 404 | PaperMod 需要搜索页文件,但未创建 | 创建 content/search/_index.md(注意是 _index.md,不是 .md) |
| 11 | 📂 导航栏"归档"按钮点击后 404 | PaperMod 需要归档页文件,但未创建 | 创建 content/archives/_index.md(同上) |
| 12 | 创建了 search.md / archives.md 但仍然 404 | 用了普通 .md 文件格式,Hugo 把它当单页面处理,找不到 PaperMod 的内置模板 | 改用 _index.md 格式(section 首页),并放在对应的子目录中 |
🔥 重点展开:搜索和归档页 404 问题(问题 #10~#12)
这个问题非常容易遇到,因为 PaperMod 主题的导航栏默认就有「搜索」和「归档」两个按钮,但不会自动创建对应页面。
现象
博客上线后,点击右上角:
- 🔍 搜索 → 跳转到
/search/→ 显示 404 - 📂 归档 → 跳转到
/archives/→ 显示 404
错误做法(第一次尝试 ❌)
| |
原因:普通 .md 文件在 Hugo 中被当作独立单页面处理,而 PaperMod 的搜索/归档功能需要的是 Section 首页——即该目录下的 _index.md。
正确做法 ✅
| |
创建 content/search/_index.md:
| |
创建 content/archives/_index.md:
| |
💡 关键知识点:Hugo 的两种页面类型
类型 文件路径 用途 示例 普通页面 content/about.md独立的单篇文章或页面 关于页、联系页 Section 首页 content/posts/_index.md该 section 的索引/列表页 文章列表、搜索、归档 搜索和归档都属于后者,必须用
_index.md格式,否则 Hugo 找不到对应的 layout 模板。
提交并发布
| |
其他值得注意的问题
推送后 Actions 没有自动触发
如果先推送代码、再去 Settings → Pages 开启 GitHub Actions,之前的推送不会触发 Actions。需要再推一次(哪怕是空提交)来触发首次部署:
| |
博客目录迁移后 Git 远程仓库丢失
如果用 robocopy 或手动复制方式迁移了博客目录,.git 目录可能不完整。迁移后务必验证:
| |
如果 git remote -v 无输出,需要重新关联:
| |
后续完善记录
博客上线后,又陆续做了不少优化。以下按时间线记录,方便后续追溯。
一、Bug 修复
1. languageCode 弃用警告
Hugo v0.158+ 中 languageCode 被标记为废弃,改用 locale。config.toml 中已删除 languageCode 字段,仅保留 locale = 'zh-CN'。
2. 搜索页 & 归档页 404
根因:content/search/_index.md 和 content/archives/_index.md 中 Front Matter 的 --- 结束符缺失,导致 Hugo 无法正确解析,构建后这两个页面为空白/404。补全结束符后恢复正常。
二、功能增强
1. 显示文章修改时间(ShowLastMod)
三步实现:
| |
创建自定义模板 layouts/partials/post_meta.html,覆盖 PaperMod 主题默认的元信息渲染逻辑,新增 lastmod 显示行:
| |
⚠️ 前提:GitHub Actions workflow 中
fetch-depth: 0确保拉取完整 git 历史,否则.GitInfo只能获取最近一次提交时间。
2. 文章修改记录链接(editPost)
在每篇文章底部添加"📝 修改记录"链接,点击跳转到 GitHub 上该文件的完整 commit 历史,每一次修改的时间、作者、commit message 一目了然:
| |
生成的实际链接示例:https://github.com/sikinzen/sikinzen.github.io/commits/master/content/posts/HowToBuildBlog.md
3. 分类页面与导航栏
创建 content/categories/_index.md,并在 config.toml 导航菜单中添加「🏷️ 分类」入口:
| |
4. 评论系统(Giscus)
基于 GitHub Discussions 的免费评论系统,无需数据库、无需后端,评论者用 GitHub 账号登录即可留言,且自动区分仓库主人(Owner)与普通访客。
实现方式:PaperMod 主题的 comments.html 是空占位符,通过模板覆盖方式注入 Giscus 脚本。
第一步:创建 layouts/partials/comments.html:
| |
第二步:在 config.toml 中启用评论:
| |
关键参数说明:
| 参数 | 值 | 作用 |
|---|---|---|
data-repo | sikinzen/sikinzen.github.io | 绑定的 GitHub 仓库 |
data-mapping | pathname | 每篇文章按 URL 路径映射到独立 Discussion 线程 |
data-theme | preferred_color_scheme | 自动跟随系统/博客深浅色模式 |
data-lang | zh-CN | 评论区界面语言 |
前置条件(需在 GitHub 上完成):
- 仓库 Settings → Features → 勾选 Discussions
- 安装 giscus GitHub App 到该仓库
- 访问 giscus.app 获取
data-category-id
💡 Giscus 自动标记仓库 Owner(sikinzen)为
👑 Owner,普通 GitHub 用户仅显示用户名,天然区分主人与访客,无需额外开发。
三、内容建设
博客上线后陆续发布了以下文章:
| 文件 | 内容 |
|---|---|
grill-me-devs-popularity.md | Grill Me 深度解析:20个词的AI技能凭什么火遍开发者圈 |
HowToUseWorkBuddy1st.md | 我重度使用 WorkBuddy 后,总结出 6 条真实经验 |
HowToUseWorkBuddy2nd.md | WorkBuddy 从入门到精通——10个上手技巧 |
HowToUseVPN.md | 科学上网配置指南:从服务选购到多端部署 |
HowToConnectZentaoAndAI.md | 禅道接入 AI 实操指南 |
HowToConnectGerritAndAI.md | Gerrit 接入 AI 实操指南 |
HowToConnectGiteaAndAI.md | Gitea 接入 AI 实操指南 |
HowToConnectWechatAndAI.md | 微信本地数据查询接入 AI |
HowToConnectWeComAndAI.md | 企业微信本地数据查询接入 AI |
四、WorkBuddy 写博客的积分优化经验
用 WorkBuddy 写博客时,发现单篇文章可能消耗上百积分,分析根因后总结出三板斧:
| 策略 | 效果 | 原理 |
|---|---|---|
| 粘贴内容替代链接 | 省 60~80% | 微信链接有反爬机制,AI 需要多轮 WebFetch + 搜索重试才能获取内容,直接粘贴免除所有抓取开销 |
| 新博客开新会话 | 省 30~50% | 上下文会随对话轮次膨胀,旧会话中每次响应都携带大量历史 token |
| 精简指令不加验证 | 省 10~20% | 去掉"检查格式"“预览效果"等非必要步骤,直接生成并交付 |
💡 最佳实践:开新会话 → 粘贴文章原始内容 → 一句指令"按博客规范整理成 md 文件”→ 完成。整个过程通常控制在 20 积分以内。
总结
| 环节 | 工具 | 难度 | 预计耗时 |
|---|---|---|---|
| 安装 Hugo | winget / brew | ⭐ | 5 分钟 |
| 创建站点 + 安装主题 | hugo + git | ⭐ | 10 分钟 |
| 配置 config.toml | 文本编辑器 | ⭐⭐ | 15 分钟 |
| 写第一篇文章 | Markdown | ⭐ | 随意 |
| 创建搜索/归档页(PaperMod 必需) | Markdown + mkdir | ⭐ | 5 分钟(容易漏!) |
| 配置 GitHub Actions | YAML + GitHub Settings | ⭐⭐⭐ | 30~60 分钟(主要是踩坑) |
| 日常写文章发布 | hugo new + git push | ⭐ | 3 分钟 |
最花时间的其实是 GitHub Actions 的配置和调试,其他环节半小时就能搞定。
但一旦搭好,以后写文章的体验是非常流畅的:用 Markdown 写 → git push → 自动上线,没有广告、没有审核、文章永远在自己硬盘里。
如果你也在考虑搭建个人博客,Hugo + GitHub Pages 是目前性价比最高的方案,没有之一。
欢迎来我的博客逛逛 👉 https://sikinzen.github.io/
本文由 AI 助手(WorkBuddy)辅助整理,但所有踩坑经验均为真实记录。