零成本给博客加评论系统:Twikoo+Netlify+MongoDB实录

博客上线没几天,评论区还空着。这篇记录我给博客加评论系统的全过程,总花费0元,总耗时一个多小时,其中大半时间在排错。三个坑一个比一个隐蔽,写下来给后来的人省时间。
先说结论
方案三件套:
| 角色 | 选了什么 | 花费 |
|---|---|---|
| 评论后端程序 | Twikoo 2.0.15 | 开源免费 |
| 后端托管 | Netlify Functions | 免费层 |
| 数据库 | MongoDB Atlas M0 | 免费层 |
为什么是Twikoo
我的博客托管在Cloudflare Pages上,纯静态,没地方存评论。加评论系统必然要引入一个常年在线的后端加一个数据库,所以选型其实是在选”后端跑在哪”。
候选挨个过一遍:
- giscus:评论者必须用GitHub账号登录。我的读者是同学和朋友,基本没有GitHub账号,评论区会变成摆设。淘汰。
- waline:功能最全,但后端免费托管的位置全撞墙。Vercel默认域名大陆基本连不上,也没有Cloudflare Workers官方适配。淘汰。
- 腾讯云CloudBase:国内速度天花板,但免费体验版无法在HTTP网关里配置跨域域名,这一步绕不过去;个人版19.9元/月起。学生党暂时退场。
- HuggingFace:以前是免费方案里的明星,2026年7月起免费账号已经不能创建Docker Space,要PRO月付9美元。这条路刚被堵死。
- Cloudflare Workers:官方适配+D1免费数据库+我正好有CF账号,差点就成了。卡在域名上:部署后的地址是
twikoo.xxx.workers.dev,这个后缀在大陆被DNS污染,直接超时。没有自定义域名就没法用。 - EdgeOne Makers:必须绑定自定义域名,默认域名链接只有3小时有效期。
最后剩Netlify:Twikoo官方部署文档里评级四星,免费方案里最高。免费额度每月12.5万次请求、100小时函数时长,大陆访问速度在免费平台里算好的。
架构一句话
Twikoo负责接收和审核评论,Netlify负责让它跑起来,MongoDB Atlas负责存。前端JS从CDN加载,评论数据走后端进数据库。
部署过程
1. 注册两个账号
Netlify:邮箱注册,验证邮箱,然后在User settings → Applications里生成一个Personal access token。
MongoDB Atlas:邮箱注册,建集群时选M0 FREE(永久免费层,512MB存储),Region选东京(离国内近)。过程中要建一个数据库用户,密码自己设好记牢;网络访问后面会讲到,这里先埋个伏笔。
2. 部署后端
官方模板是配合GitHub fork用的,我用Netlify命令行从本地直接推,连fork都省了:
git clone --depth 1 https://github.com/twikoojs/twikoo-netlify.gitcd twikoo-netlifynpm install在根目录建一个netlify.toml:
[build] functions = "netlify/functions"
[functions] node_bundler = "esbuild"设置环境变量后一条命令部署:
netlify env:set MONGODB_URI "mongodb+srv://用户:密码@cluster0.xxxx.mongodb.net/?retryWrites=true&w=majority"netlify env:set NODE_VERSION "24"netlify deploy --prod --dir . --functions netlify/functions打开分配的地址,看到”Twikoo 云函数运行正常”就算成功。
一个容易漏的点:Netlify的envId必须带上/.netlify/functions/twikoo后缀,跟Vercel那种直接给域名的不一样。博客前端配置envId时少了这段后缀,请求会404。
坑一:整个站点401
部署完打开,等来的不是”运行正常”,是Netlify的登录跳转页。所有路径全部401,连首页都是。查API看站点状态,claimed是true,一度以为是令牌权限问题。
真实原因:新账号的站点可见性。进Netlify控制台 → Site configuration → Access and security → Site visibility,改成Public,立刻恢复。
顺带一提,注册后的验证邮件最好第一时间点掉,新账号功能受限有一半是因为邮箱没验证。
坑二:504 Inactivity Timeout
登录墙解决了,再打开变成504,函数被调用但一直挂起直到超时,函数日志里一片空白。
这次排了好一会儿。后来顺着调用链想:函数启动后第一件事就是连数据库。回Atlas控制台一看,Network Access里只有一条记录,我自己的IP。而Netlify服务器的出口IP每次都不一样,永远进不了白名单。
解决:Network Access → ADD IP ADDRESS → Allow access from anywhere(0.0.0.0/0)。
有人会担心安全。M0免费库有独立的数据库用户名密码,白名单只是第一道门,个人博客的流量级这么用是社区标准做法。
坑三:手改连接串改出双斜杠
Atlas复制的连接串自带<db_password>占位符,替换密码时手一抖,主机名前多打了一个斜杠,变成mongodb+srv://user:pass@//cluster0...,驱动直接报错。建议整串复制,只动占位符那一段。
顺便科普:DNS污染
为什么你的pages.dev博客能打开,workers.dev就不行?DNS污染指的是国内查询某些域名的IP时会得到一个假答案,于是永远连不上。pages.dev这个后缀没被污染,workers.dev被污染了。同属Cloudflare,两种命运。这也是选型里”有没有自定义域名”变成关键变量的原因。
最后花了多少钱
| 项目 | 费用 |
|---|---|
| Twikoo | 0(开源) |
| Netlify Functions | 0(每月12.5万次请求额度) |
| MongoDB Atlas M0 | 0(512MB永久免费层) |
唯一的”付费”是一个多小时。个人博客的流量级,这些额度根本用不完。
还可以继续做的
- 管理员密码要在评论区后台手动设一次,评论的删除和禁用词都在那里管
- 邮件通知可选配Resend免费API,Netlify环境发邮件走HTTP通道
- 以后买了自定义域名,可以把整套迁到速度更快的平台上,Twikoo支持评论数据导出导入,搬家不丢数据
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!


