隔段时间就会有人问"你的博客跑在哪",干脆写成一篇。答案很短:一台很普通的腾讯云轻量服务器,配置低到不值得炫耀。

硬件与现实

项目 实际
CPU 2 vCPU
内存 1.9 GiB(swap 常年有占用)
磁盘 40 GiB,用了约四成
系统 Ubuntu 24.04

这个配置决定了所有取舍:能不在本机跑的东西,就不要在本机跑。

为什么最后选了静态站

一开始也动过自建后端的心思,但 1.9G 内存里已经住着 Caddy、几个 Node 服务和一个 uvicorn。再塞一个带数据库的应用,等于给这台机器安排加班。

所以现在的形态很朴素:Astro 构建出纯静态产物,由前置服务直接发出去。评论这种必须有人写数据的功能,交给免费的第三方托管,本机一个字节都不存。

八步构建链

pnpm build 并不只是 astro build,它是一条流水线:

generate-github-card-data  # 预取 GitHub 卡片数据,避免运行时请求
generate-lqips             # 给所有图片生成模糊占位
generate-vndb-covers       # 视觉小说封面(当前页面已关,留着备用)
astro build                # 真正的静态构建
prune-pio-assets           # 删掉没用上的桌宠资源
subset-fonts               # 中文字体子集化,这块省得最多
minify-inline-scripts      # Astro 不压缩 is:inline,构建后再扫一遍
run-pagefind               # 生成站内搜索索引

整条跑完约一分钟。最后一步 pagefind 值得一提:搜索能力完全在构建期生成,运行时只是加载一堆静态分片,不占服务器一点 CPU。

内联脚本压缩这个坑

Astro 只压缩打包后的 <script>,is:inline 会原样输出——连注释和缩进都在。对普通项目无所谓,但中文字体子集化之后,几 KB 的注释重复出现在每个页面里就很浪费了。

所以有了 minify-inline-scripts:构建后扫一遍 dist/ 的 HTML,把内联 JS 过一遍 esbuild。有一个细节必须守住——

minifyIdentifiers: false, // 不能改标识符名

因为这些脚本处在全局作用域,彼此靠全局函数名互相调用,改名会静默炸掉,而且只在特定页面跳转时才复现。

预览与上线

构建产物在本机留了一个 :4321 的静态预览端口,改完样式先在那儿看效果,确认没问题再走正式域名。桌面前还留了个小习惯:每完成一个可运行的改动就提交一次,工作区永远保持干净——这样任何一步做坏了,都能精确退回上一个能看的版本。

还没做的

  • 评论系统(方案已定,等外部服务开通)
  • 图片仍然偏多,下一步准备把相册按 LQIP 再压一轮 AVIF
  • 构建目前手动触发,之后想加个 push 后自动重建的钩子

小配置的服务器教会我的事情只有一件:先决定什么不做。