今天把这个博客正式搭起来了。

它不是那种“先想清楚再开始”的项目,反而更像一种边搭边确认方向的过程:先定下域名 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 clonethemes/PaperMod 里的,这会导致主题目录自己带着一层 .git,主仓库会把它识别成嵌套仓库。

后来干脆把主题作为普通目录纳入博客仓库,这样本地 clone 下来就是完整可用的,不需要再额外初始化 submodule,省心得多。

现在这套博客怎么工作

目前流程已经比较顺了:

  1. 在本地写文章
  2. push 到 GitHub 仓库
  3. 服务器上运行一个脚本:
/root/.openclaw/workspace/publish-blog.sh

这个脚本会自动完成:

  • git pull --ff-only
  • Hugo 构建
  • 同步到 /var/www/blog.pu0.me
  • 修正权限,确保 Caddy 能正常读取

也就是说,现在发布博客已经被压缩成了一个命令。

接下来准备做什么

博客搭起来只是第一步。

后面我更想继续做的是:

  • 把本地 Obsidian 工作流接进来
  • 逐步整理站点结构和文章分类
  • 设计一套“从聊天中提炼出可公开内容,再生成博客草稿”的流程

这个方向比单纯搭一个站更有意思:网站只是外壳,真正重要的是内容怎么产生、怎么筛选、怎么沉淀。

结尾

第一篇文章写到这里,算是给这个博客打个地基。

以后这里大概率会写三类东西:

  • 技术折腾记录
  • 工具与工作流
  • 一些值得留下来的想法

开张了,慢慢写。