今天把这个博客正式搭起来了。
它不是那种“先想清楚再开始”的项目,反而更像一种边搭边确认方向的过程:先定下域名 blog.pu0.me,然后选 Hugo,当中踩了版本坑、主题坑、权限坑,最后才把整条链路理顺。
这篇文章就当开站记录,也当第一篇真正的内容。
为什么要折腾这个博客
我想要的不是一个单纯能发文章的网站,而是一套后续能长期复用的写作流程:
- 平时可以在本地用 Obsidian 写文章
- 服务器上有一套稳定的 Hugo 博客负责构建和发布
- 以后还能把和 AI 的对话整理成草稿,再人工挑选是否公开
换句话说,这个博客不只是“展示页”,更像是以后写作、整理、发布的一条生产线。
技术选型
最后定下来的方案很简单:
- 博客框架:Hugo
- 主题:PaperMod
- Web 服务:Caddy
- 域名:blog.pu0.me
- 部署方式:直接跑在服务器上,不进 Docker
之所以选 Hugo,主要是因为它足够轻、够快,而且和 Markdown 的工作流非常契合。对于技术博客来说,它有一种很讨喜的“少折腾、够稳定”的感觉。
中间踩过的坑
搭站过程里最典型的几个坑,正好也值得记一下。
1. Ubuntu 软件源里的 Hugo 太旧
一开始直接用系统包安装 Hugo,结果 PaperMod 直接报错,原因很简单:
- 系统里的 Hugo 版本太旧
- PaperMod 要求更高版本的 Hugo
最后还是按官方安装方式,直接从 Hugo 的 GitHub release 安装最新版 extended 版本,问题才彻底解决。
2. 静态文件不能直接从 /root 下给 Caddy 读
博客最开始是从 /root/.openclaw/workspace/blog/public 直接让 Caddy 提供服务,结果访问返回 403。
这不是 Hugo 的问题,也不是域名问题,而是权限模型的问题:
- OpenClaw 的 WebUI 是通过
reverse_proxy转发给 root 跑的进程,所以没事 - 但博客是静态文件,Caddy 自己要去读磁盘文件
caddy用户没法直接读取/root/...下面的站点目录
最后的解决方式也很标准:
- Hugo 继续在
/root/.openclaw/workspace/blog里构建 - 发布目录改到
/var/www/blog.pu0.me - Caddy 直接服务
/var/www/blog.pu0.me
这样站点就正常了。
3. Git 主题管理的细节也容易踩坑
PaperMod 最开始是直接 git clone 到 themes/PaperMod 里的,这会导致主题目录自己带着一层 .git,主仓库会把它识别成嵌套仓库。
后来干脆把主题作为普通目录纳入博客仓库,这样本地 clone 下来就是完整可用的,不需要再额外初始化 submodule,省心得多。
现在这套博客怎么工作
目前流程已经比较顺了:
- 在本地写文章
- push 到 GitHub 仓库
- 服务器上运行一个脚本:
/root/.openclaw/workspace/publish-blog.sh
这个脚本会自动完成:
git pull --ff-only- Hugo 构建
- 同步到
/var/www/blog.pu0.me - 修正权限,确保 Caddy 能正常读取
也就是说,现在发布博客已经被压缩成了一个命令。
接下来准备做什么
博客搭起来只是第一步。
后面我更想继续做的是:
- 把本地 Obsidian 工作流接进来
- 逐步整理站点结构和文章分类
- 设计一套“从聊天中提炼出可公开内容,再生成博客草稿”的流程
这个方向比单纯搭一个站更有意思:网站只是外壳,真正重要的是内容怎么产生、怎么筛选、怎么沉淀。
结尾
第一篇文章写到这里,算是给这个博客打个地基。
以后这里大概率会写三类东西:
- 技术折腾记录
- 工具与工作流
- 一些值得留下来的想法
开张了,慢慢写。