这个站点是怎么搭起来的
先说结论
我要的是一个个人站点:记生活、记学习、记工作,偶尔写点分享。这类站点的特点是更新慢、读得快、不需要登录——所以它不需要数据库,也不需要后台。
静态站的好处在这时候全部兑现:
- 打开就是 HTML,没有等接口的那一下
- 没有后台接口,就没有可以被攻击的面
- 服务器上只跑一个进程
- 内容就是几个 Markdown 文件,全部能进 Git
三层结构
每一层只干一件事,互不打扰:
- 内容层 ——
content/下是 Markdown。写文章就是新建一个.md文件,开头几行写标题、日期、栏目。 - 生成层 ——
build.py读内容,吐出完整的静态页面、RSS 和 sitemap。零依赖,只用 Python 标准库。 - 服务层 —— 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。配置文件一共十几行。
一点取舍
这个站没有评论区、没有搜索、没有统计。不是没做,是故意不做:
一个不收集数据的站点,才不需要为数据负责。
想交流,就看文章里留下的线索。