这个博客是怎么搭起来的
写博客这件事,最容易死在两个地方:一是折腾工具太久,忘了写;二是发一篇要点七八下鼠标,懒得发。
所以这次的目标很直接 —— 本地写 markdown,git push,完事。剩下的全交给机器。
最终的样子
本地 ~/workspace/blog/content/posts/ 写 .md
↓ git push
GitHub 仓库(源码 + 版本历史 + 异地备份)
↓ Actions 自动跑 Hugo 构建
产物 public/
↓ rsync over SSH
线上 blog.zhugdamo.cn
三步,中间没有一处需要我插手。
为什么不直接用 GitHub Pages
因为域名是 .cn,有 ICP 备案。备案要求域名解析指向境内已备案的服务器 —— 一旦 CNAME 到 GitHub,工信部核查时查到境外 IP,备案有被注销的风险。
所以架构上做了个拆分:
| 环节 | 放在哪 | 理由 |
|---|---|---|
| 源码 | GitHub | 版本历史 + 免费异地备份 |
| 构建 | GitHub Actions | 用别人的算力,服务器不装 Hugo |
| 托管 | 自己的服务器 | 备案合规,国内直连 |
服务器只做一件事:接收成品 HTML。 不装 Node,不装 Hugo,不跑构建进程。纯静态文件,零运维。
为什么选 Hugo
试过几个:
- Hexo —— Node 生态,
node_modules动辄几百兆,升级容易崩 - Jekyll —— Ruby 依赖,本地环境配置是场灾难
- Hugo —— 单个二进制文件,无依赖,构建速度以毫秒计
对一个「不想维护博客系统本身」的人来说,Hugo 的单文件特性就是决定性的。整站构建通常在 100ms 以内,本地 hugo server 改一个字浏览器立刻刷新。
主题是手写的
没用现成主题。原因很简单:现成主题为了通用性会塞进大量用不到的功能 —— 评论系统、多语言切换、十几种社交图标、统计代码。每一样都是未来的维护负担。
手写的模板一共七个文件,加起来不到 400 行,样式表 400 行。全部内容我都知道在做什么。视觉上延续主站那套 宣纸 + 朱砂 + 鎏金 的配色,跟主站放在一起不违和。
能读懂的 400 行,胜过读不懂的 4000 行。
暗色模式用 prefers-color-scheme 跟随系统,没写切换按钮 —— 少一个按钮,少一份 JS,少一处可能坏掉的地方。
关于「够用就好」
这个博客没有评论系统、没有统计脚本、没有全站搜索、没有阅读进度条。
不是做不了,是不需要。想说话的人会发邮件,浏览器自带 Ctrl+F,阅读进度条右边那个滚动条已经在了。
每加一个功能,就多一个未来会出问题的点。一个静态博客最理想的状态是:放上去三年不用管,还能正常打开。
发一篇的完整流程
hugo new content posts/some-thoughts.md # 生成带 front matter 的骨架
# ... 写完 ...
git add . && git commit -m "post: 一些想法" && git push
推送后大约 40 秒,blog.zhugdamo.cn 上就有了。
要预览的话本地起服务:
hugo server -D # -D 包含草稿
浏览器开 localhost:1313,改一个字立刻刷新。
后记
工具链搭好,剩下唯一的问题就变成了 —— 写什么。
那才是难的部分。