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=resend、SENDER_EMAIL=notify@tsaitang.com、BLOGGER_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。博客评论这个功能算是彻底盘活了。