“基础设施”这个词通常让人想到机房、集群、负载均衡。但对一个人维护的个人站点来说,真正的基础设施要朴素得多:它是一组让你在半年不碰之后,仍然能说清楚“东西在哪、怎么跑、坏了怎么办”的东西。

我把自己实际在维护的部分列成了十项。它们不是理论清单,而是我这两年陆续补上的;每一项都对应过一次具体的麻烦。

十项基础设施

项目 最低要求 我现在的做法 检查频率
域名与 DNS 知道在哪里注册、解析指向哪 注册商 + 两条 A/CNAME 记录 每年续费前
服务器 能远程登录、能重装 一台低配云服务器 + 快照 每月
TLS 证书 到期前能续、能部署 自动申请与续期,失败告警 每周(自动)
备份 至少一份异地、可恢复 每日增量 + 每周全量 + 季度演练 每日/每季度
监控告警 站点挂了能知道 五分钟一次可用性检测 持续
日志 出问题能查、磁盘不会满 统一目录 + logrotate 每月
文档 换机器能照着做 一页部署文档 + 一页恢复文档 每季度
变更记录 知道最近改了什么 Git 提交 + 一页变更日志 每次变更
账号与密钥 不共用、可轮换 独立账号、密钥文件限权 每半年
预算 知道一年花多少 一张固定支出表 每年

这张表里没有一项是“高级”的。它们更像家里的配电箱、灭火器和备用钥匙:平时想不起来,出事时决定你能不能快速恢复。

最容易被忽略的两项

第一项是文档。 我曾经自信地认为“都在我脑子里”。直到有一次换服务器,我在新机器上花了三个小时才想起证书的续期脚本放在哪个目录、定时任务用的是哪个用户。那三个小时里,我翻遍了旧机器的 /etc、/home 和 shell 历史。

现在我只有两页文档:一页写“怎么从零部署”,一页写“出问题怎么恢复”。文档不追求完整,只追求“半年后的我照着能做出来”。每次变更后如果文档没更新,我会把它当成一次未完成的变更。

第二项是变更记录。 Git 记录了代码差异,但很多变更不在代码里:改了 Nginx 配置、调了防火墙、换了证书、升级了系统。这些如果没有记录,故障时就会变成“我记得好像改过什么”。

我的做法很土:在仓库里放一个 CHANGELOG.md,只写日期、改了什么、为什么改、怎么回滚。三行就够,但三个月后非常有用。

监控不是越多越好

我见过有人给个人博客配了十几个告警:CPU、内存、磁盘、连接数、5xx、证书、DNS、备份、构建失败。结果是每天收到一堆通知,最后全部静音。

我现在只保留四类告警:

  1. 站点连续两次不可用;
  2. 磁盘超过 85%;
  3. 备份连续两天失败;
  4. 证书剩余不足 14 天。

其他的指标照常采集,但不主动通知。告警的价值在于“值得半夜起来看”,不是“证明我在监控”。

每季度一次的检查

每季度我会花一个小时,按清单过一遍:

  • 恢复一个备份文件,确认能打开;
  • 手动续期一次证书,确认流程没坏;
  • 看一遍磁盘和日志增长趋势;
  • 检查域名和服务器到期时间;
  • 更新文档里过时的路径和命令;
  • 算一下今年的固定支出。

这个习惯坚持了两年。它没有让我“不出故障”,但让我在故障发生时少了很多手忙脚乱。

清单不是目的

列清单容易,维护清单难。这张表真正的作用不是让我“显得专业”,而是把那些容易被忘记的事,变成有固定时间点的事。

个人站点最大的风险从来不是流量太大,而是维护者停下来之后,系统变成一团没人能解释的东西。基础设施的意义,就是让它在被放下一段时间之后,还能被重新捡起来。