QuizRank 这个项目让我学到最多的,不是功能怎么写,而是当事情搞砸时怎么排查。

最近我又经历了一次部署折腾。一开始我心里想:“也许 Render 的免费套餐真的不够用了。”结果后来发现,我自己才是问题的一部分。

打开网易新闻 查看精彩图片

事情的起因是:后端在 Render 上一直无法启动。构建能成功,但应用一启动就内存溢出(OOM)。Render 实例限制是 512 MB,我不断看到内存不足的报错。于是我很自然地认定:后端太大了,免费套餐跑不动。

但后来才发现,我连生产启动方式都用错了:我一直在用 nest start,而不是运行编译后的生产版本。同时,一个 NODE_OPTIONS 配置也不适合同时兼顾构建和运行。最后我把内存需求拆分开了:构建时给更多堆内存,运行时给一个小得多的限制。

等我们不靠“我觉得”去甩锅,而是真正分析问题后,结论很清楚:QuizRank 完全可以在 Render 上跑,只是我之前用错了方法。

在意识到这点以前,我已经把后端迁移了很多次。我先用 Coolify 自托管,成功跑了两个多月。但免费试用到期后,我付不起订阅费,后端被暂停了。之后我又在自己机器上自托管了两周。最后也放弃了——不是因为跑不起来,而是因为当时几乎没人用 QuizRank,为了一点点收益占用一台常开的机器,实在不划算。

也就是那时,我开始考虑简化项目、砍掉一些功能,把它放回 Render。也正是这个过程中,我们发现了真正的问题。