Twikoo 评论系统迁移:从静默死亡到 CF Worker 全托管

Trilium 系列 · 博客运维(记录)

0x00 序

之前清理服务器容器的时候,不小心把 Twikoo 的容器给清掉了,一直没时间搞。前端 JS 还在正常加载,但后端早就没有东西在响应了。

这次正好把服务彻底重建:迁移到 Cloudflare Workers 全托管,配上评论通知和防垃圾。整个过程踩了几个坑,记录一下。

0x01 迁移:Cloudflare Workers 全托管

重建的选型很明确:Twikoo 官方就有 Cloudflare Worker 部署方案(twikoo-cloudflare 仓库),数据用 D1(评论)+ R2(头像),全在 CF 生态里,零服务器维护。

部署过程:

  • Fork 官方仓库 → npm install → 清掉 3 个不兼容包(jsdom/tencentcloud-sdk/nodemailer,Workers 1MiB 包体限制)
  • wrangler d1 create + 导入 schema.sql(comment/config/counter 三张表)
  • wrangler r2 bucket create 建头像存储
  • wrangler deploy --minify 部署到 twikoo.tsaitang.workers.dev

这里踩了个大坑:自定义域名不能 CNAME 到 workers.dev——CNAME 指向 workers.dev 时 CF 边缘回源会形成环路,页面返回 522。正确做法是删掉 CNAME,改用 Worker 的 Custom Domain 功能直接绑定(CF API:PUT /accounts/{id}/workers/domains),DNS 由 CF 自动管理。

0x02 接到博客:Ankia 主题属性

服务建好后,怎么让它出现在博客页面上?看 Ankia-Theme 仓库的 README——主题默认支持 Twikoo:部署好 Twikoo 后,在博客根节点加两个属性即可:#enableTwikoo(启用评论)+ #envId(Twikoo 环境 ID,就是 Worker 地址)。

这两个属性带 isInheritable,全站文章自动继承——只加一处,所有文章页面都有评论区。

0x03 前端对齐:版本与 CDN

服务恢复了,页面却还是没有评论区。两个问题:

  • 版本不对齐:前端 JS 还是 1.6.7(主题里写死的 CDN 版本),云函数已是 1.6.44——Twikoo 会提示"前端版本 X 云函数版本 Y"。把主题里的版本号升到 1.6.44。
  • CDN 被拦截:原来的 lib.baomitu.com(360 CDN)在某些网络环境下 JS 静默加载失败——页面 HTML 正常、评论区代码都在,但 twikoo JS 根本没执行。换成 cdn.jsdelivr.net 后正常。

还有一个隐蔽问题:评论区渲染条件要求博客根节点同时#enableTwikoo#envId 两个标签——只有 envId 不显示评论区(模板里 hasLabel("enableTwikoo") 是硬条件)。

0x04 评论通知:Resend → agent 邮箱 → QQ

评论恢复了,还差通知——有人评论得第一时间知道。Twikoo 的 CF Worker 版邮件通知只支持 SendGrid / MailChannels / Resend 三家(CF Worker 环境限制,nodemailer 不可用,配不了 Gmail SMTP)。MailChannels 面向 Workers 的免费 API 已终止,SendGrid 注册麻烦,最后选了 Resend(免费 100 封/天)。

配置:Resend API key + 已验证域名 tsaitang.com,Twikoo 里设 SMTP_SERVICE=resendSENDER_EMAIL=notify@tsaitang.comBLOGGER_EMAIL=tsaitang.agent@gmail.com(通知发到 agent 邮箱)。

整条链路:访客评论 → Twikoo Worker → Resend → 邮件进 agent 邮箱 → mailwatch(IMAP IDLE)实时推送到 QQ。人在 QQ 上就能收到"有人评论了",还能让 agent 直接处理。

0x05 防垃圾与体验优化

评论系统上线,防垃圾也得跟上:

  • Cloudflare Turnstile 验证码(CF 原生、免费、无感)——site key + secret key 配到 Twikoo
  • 限流:每 IP 每 5 分钟 5 条、全站 30 条/分钟、评论限 500 字
  • 体验:分页 10 条/页、头像走 cravatar.cn(国内快)、自定义占位符、显示浏览器信息、代码高亮 + 图片灯箱
  • 安全:CORS 限制只允许 www.tsaitang.com

0xFF 跋

这次迁移沉淀了几条教训:

  • CNAME → workers.dev 是死路:CF 自定义域名必须用 Worker Custom Domain,否则 522 环路。
  • CDN 选择影响 JS 执行:baomitu 在某些网络下会静默拦截,jsdelivr 更可靠。
  • Twikoo 配置可以绕过管理面板:config 存 D1 的 JSON 里,用 wrangler d1 execute 直接改——agent 不需要知道管理密码,就能自动帮忙改这些配置。

现在评论系统是 CF 全托管 + 自动 CI 部署 + 上游自动同步,评论通知直达 QQ。博客评论这个功能算是彻底盘活了。

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录