背景
本博客评论系统使用 Twikoo,后端部署在 Hugging Face 免费 Space。
然后博客长期没有评论,以为只是没流量,直到…

一、症状与诊断
Space 状态为 RUNTIME_ERROR,错误信息:
Launch timed out, workload was not healthy after 30 min通过 HF API 查询运行时状态:
{ "stage": "RUNTIME_ERROR", "hardware": { "current": null, "requested": "cpu-basic" }, "errorMessage": "Launch timed out, workload was not healthy after 30 min", "gcTimeout": 172800}关键判断:
sha与构建记录的 Commit SHA 一致 → 构建已通过,问题在容器启动阶段- Dockerfile 端口配置正确(
ENV TWIKOO_PORT 7860),排除端口不匹配
根因指向 HF 免费档的回收机制:cpu-basic 实例 48 小时(gcTimeout 172800 秒)不活动即被回收,唤醒时若未能及时通过健康检查,30 分钟判定失败。该问题在社区多次出现,且 HF 屏蔽邮件端口,Twikoo 的通知功能本就不可用。
二、方案选择
对比 Twikoo 官方文档的云函数平台:
| 平台 | 推荐度 | 关键点 |
|---|---|---|
| Netlify | ★★★★☆ | 免费额度充足,国内访问不错,不屏蔽邮件端口 |
| Hugging Face | ★★★★☆ | 免费,但实例回收后唤醒不稳定 |
选择 Netlify:评论数据本就存在 MongoDB Atlas,迁移平台只是换一个”壳”,数据不动。
三、迁移实施
1. fork 官方仓库
gh repo fork twikoojs/twikoo-netlify2. 安装 netlify-cli 并登录
npm i -g netlify-clinetlify login3. 创建站点
netlify sites:create --name yuer6327-twikoo --account-slug <team-slug>
--account-slug是团队 slug 而非显示名(如tom-xxx而非Yuer6327),用netlify api listAccountsForUser查询。
4. 配置数据库环境变量并部署
netlify env:set MONGODB_URI "mongodb+srv://..."netlify deploy --prod部署后验证:
GET https://yuer6327-twikoo.netlify.app/.netlify/functions/twikoo{"code":100,"message":"Twikoo 云函数运行正常……","version":"1.7.15"}四、坑:连接串未指定数据库名
部署后前端能连上、也能发新评论,但历史评论全部消失。
Twikoo 默认连接名为 test 的数据库。连接串 mongodb+srv://...@cluster.mongodb.net/?appName=... 未指定 /库名,数据于是写入空的 test 库。
在 Atlas 中确认评论数据实际在 twikoo 数据库的 comment 集合,将连接串补上库名后重新部署:
mongodb+srv://...@cluster.mongodb.net/twikoo?appName=...历史评论随即恢复。
五、前端版本对齐
后端 twikoo-netlify 为 1.7.15,博客前端 public/twikoo/twikoo.all.min.js 停留在 1.6.44。从 npm 拉取官方 dist 替换,避免版本差距过大触发前端版本过低提示:
npm i twikoo@1.7.15# 复制 dist/twikoo.all.min.js 及配套 LICENSE 至 public/twikoo/六、经验总结
① 长期在线的服务慎用免费云函数实例。 HF 免费 Space 实例回收后唤醒不稳定,不适合需要稳定在线的评论后端。
② MongoDB 连接串务必显式指定数据库名。 省略 /库名 时 Twikoo 连默认 test 库,表现为”能评论但看不到历史”。
③ 迁移云函数平台前先确认数据所在库名。 避免先连错库,在空库里产生无效数据。
④ 前端 twikoo.js 与后端版本需对齐。 同主版本内通常兼容,但保持一致最省心。
结论:评论数据在 MongoDB Atlas,云函数平台只是承载入口,换平台本身不丢数据;真正丢数据只会发生在连接串指向了错误的数据库。