这个站点是怎么搭起来的

工作

先说结论

我要的是一个个人站点:记生活、记学习、记工作,偶尔写点分享。这类站点的特点是更新慢、读得快、不需要登录——所以它不需要数据库,也不需要后台。

静态站的好处在这时候全部兑现:

  • 打开就是 HTML,没有等接口的那一下
  • 没有后台接口,就没有可以被攻击的面
  • 服务器上只跑一个进程
  • 内容就是几个 Markdown 文件,全部能进 Git

三层结构

每一层只干一件事,互不打扰:

  1. 内容层 —— content/ 下是 Markdown。写文章就是新建一个 .md 文件,开头几行写标题、日期、栏目。
  2. 生成层 —— build.py 读内容,吐出完整的静态页面、RSS 和 sitemap。零依赖,只用 Python 标准库。
  3. 服务层 —— Caddy 把 site/ 目录发出去,顺便自动管证书。

发一篇文章的完整流程是:

cd ~/work/projects/personal-site
vim content/posts/2026-10-15-some-title.md
./deploy.sh

deploy.sh 会生成页面、同步到 /var/www/yycodex、重载 Caddy,最后打一次自检。

为什么不用框架

试过那些方案之后,我发现自己要的东西太简单了:一个列表页、一个文章页、一个归档页。用框架意味着多一层依赖、多一份升级负担,还有一堆用不上的能力。

于是这个生成器只做了几件事:

  • 解析 frontmatter(就是开头 --- 之间那几行)
  • 渲染 Markdown 的一个子集:标题、段落、列表、引用、代码块、链接、图片
  • 套一层统一的模板,输出 HTML

全部加起来三百多行,其中包括了中文排版的一个细节——段落里的换行不插空格,否则「这是\n中文」渲染出来会多一个空格。

为什么是 Caddy

因为证书。

用 Nginx 的话,还得配 certbot、写定时续期、偶尔忘了续期然后被浏览器拦一次。Caddy 只要在配置里写一行域名:

www.yycodex.top {
	root * /var/www/yycodex
	encode zstd gzip
	file_server
}

它就会自动申请 Let's Encrypt 证书、自动续期、自动把 80 跳转到 443。配置文件一共十几行。

一点取舍

这个站没有评论区、没有搜索、没有统计。不是没做,是故意不做:

一个不收集数据的站点,才不需要为数据负责。

想交流,就看文章里留下的线索。