这个博客不是从 IDE 或终端开始的。它始于一次对话。
我坐下来与 Crush——一个在命令行中运行的自主式 AI 编程助手——描述了我想要的东西:一个名为 Innerspace 的个人博客,托管在 thylong.com,使用 Hugo 和 monochrome 主题构建,由 Redbean 提供服务,用 Docker 容器化,并部署到 k3s 集群。
为什么选择这个技术栈?作为一名 Go 开发者,我一直很欣赏 spf13 的工作——Hugo 是一个出色的工程作品,选择它是自然而然的。同样,我从一开始就选择了 Redbean,因为 Justine 在 Cosmopolitan 项目上的工作确实令人惊叹。一个二进制文件就能在任何地方运行,不需要运行时——这种理念与我思考基础设施的方式一致。我计划将来把博客托管到其他地方,但这些会在以后的文章中详细讨论。
关于这个博客的语言:法语是我的母语,我基本能使用英语双语交流,目前我正在密集学习中文。用三种语言写作是练习的一部分——一种用不同思维方式思考的途径。
你会在这里找到什么?关于我热爱的话题的个人思考和深入探讨:创造力、历史、软件工程、基础设施、史学、艺术、极简主义,以及一点地缘政治。
Crush 完成了剩下的所有工作。以下是它的过程。
技术栈
| 层级 | 工具 | 原因 |
|---|---|---|
| 静态网站生成器 | Hugo Extended v0.146+ | monochrome 主题需要 SCSS 支持 |
| 主题 | hugo-theme-monochrome | 简约、快速(~5KB gzip CSS)、暗色模式、搜索 |
| Web 服务器 | Redbean | Cosmopolitan 项目的单二进制 Web 服务器 |
| 容器 | Docker(多阶段) | 第一阶段 Hugo 构建,第二阶段 Redbean 在 scratch 上运行 |
| 编排 | k3s | 轻量级 Kubernetes,TLS 由集群层处理 |
Crush 做了什么
Crush 作为完全自主的代理运行。我给了它一个高层计划,它便:
- 搭建 Hugo 站点 —
hugo new site,将 monochrome 主题添加为 git 子模块 - 配置
hugo.toml— baseURL、主题、暗色模式、搜索、目录、SEO、语法高亮 - 设置多语言支持 — 3 种语言(English、Français、中文),基于目录的内容组织,并为简体中文创建了自定义
zh.tomli18n 文件(主题只自带繁体中文) - 创建初始内容 — 主页和 3 种语言的 hello-world 文章
- 修复了 RSS 兼容性问题 — monochrome 主题的 RSS 模板使用了
.Site.Author.email,这在 Hugo v0.160+ 上会崩溃。Crush 用自定义的layouts/_default/rss.xml覆盖了模板 - 编写
build.sh— 从 cosmo.zip 下载 Redbean,运行 Hugo,将输出打包为thylong.com二进制文件 - 编写
Dockerfile— 多阶段:hugomods/hugo:exts→ Hugo 构建,debian:bookworm-slim→ Redbean 打包,scratch→ 最终单二进制镜像 - 创建 k8s 清单 — 带探针的 Deployment、ClusterIP Service、thylong.com 的 Ingress
- 设置 CI/CD — GitHub Actions 工作流:构建 → 推送到镜像仓库 →
kubectl rollout restart - 编写 Makefile —
dev、build、docker-build、deploy、hooks等 - 添加 pre-commit hook — 在允许提交之前验证 Hugo 和 Docker 构建
- 更新
PLAN.md以记录架构决策
模型详情
Crush 使用 GLM-5.1 Cloud(通过 Ollama)作为大模型,Claude Haiku 4.5 作为小模型。执行是自主式的——Crush 规划、搜索代码库、读取文件、编辑文件、运行构建、诊断错误(如 RSS 模板问题)、并迭代直到一切编译通过。每个决策都是自主做出的,只需简短的进度报告。
结果
innerspace/
├── hugo.toml # 多语言配置 (en/fr/zh)
├── Makefile # 构建目标 + 帮助
├── PLAN.md # 架构决策
├── README.md
├── build.sh # Hugo 构建 + Redbean 打包
├── Dockerfile # 多阶段:Hugo → Redbean 在 scratch 上
├── content/
│ ├── en/ # 英文内容
│ ├── fr/ # 法文内容
│ └── zh/ # 中文内容
├── i18n/
│ └── zh.toml # 简体中文翻译
├── layouts/_default/
│ └── rss.xml # 自定义 RSS(Hugo v0.160+ 修复)
├── k8s/ # Deployment, Service, Ingress
├── .githooks/pre-commit # 构建验证
├── .github/workflows/ # CI/CD
└── themes/
└── hugo-theme-monochrome/
最终构建在 3 种语言中生成 34 个页面,全部打包在一个运行在 scratch 上的 Redbean 单二进制文件中。一个二进制,零依赖,从 k3s 提供服务。
这篇文章本身也是 Crush 写的最后一件事。