各位老友们好,我是 Chlorine。

今天讲一个挺抽象的事,就是关于 Twikoo 评论的更新。请做好血压飙升的准备。

前言

Twikoo 这个评论系统我从建站开始就开始用,美观,功能强大,(大部分时候)省心,而且开发者 iMaeGoo 大佬也一直在尽心尽力地维护。这大半年下来,也攒了一百多条评论了,也是我这个小破站的珍贵回忆呐。

我的 Twikoo 有两个云函数,一个在 Vercel 上,一个在 Netlify 上。本来用的是前一个,后来秉持着服务都堆到副域名的原则换成了后一个。反正数据库都是那一个,换个域名有什么大不了的。

记住这句话(咬牙切齿)

左思

注:这个标题是谐音

今天看到 Twikoo 更新了,于是打算更新一下。只不过 Twikoo Netlify 的更新实在是有点抽象,不管是把 package.json 的版本号改成 latest 还是 1.6.38 都不好使。我甚至顺手去提了个 issue。

然后,我就想到了一个让我想打自己的主意:那我重新部署不就行了?

火速删除项目,导入仓库重新部署……

我记得 Twikoo 得有个环境变量 MONGODB_URI 来着?应该填多少呢?

坏了,我不知道。刚才删除得太着急,忘记复制了。我记得 Vercel 的那个似乎和这个不是一个数据库?应该存的是旧版的数据,没有用。

这应该不是什么大逝,去 MongoDB 重新创建一个 user 就完事。期间顺带着喜提几个 function crash,经过检测是 MongoDB 的 Network Access 没配置泛播可见。

然后 redeploy,云函数运行正常,美滋滋。

喜滋滋地去网站上看一圈……这怎么需要注册?重设密码了?

行吧,重设就重设。点进去……

不是,我评论呢?怎么全没了?!

An image to describe post

抢救

这属实是吓了我一跳。这怎么换个字符串啥也没有了?

注:后来看到了 Twikoo 官网的备注:

连接字符串包含了连接到 MongoDB 数据库的所有信息,一旦泄露会导致评论被任何人添加、修改、删除,并有可能获取你的 SMTP、图床 token 等信息。请妥善记录这一字符串,之后需要填入到 Twikoo 的部署平台里。

好像有点合理,但是又不合理……

事不宜迟,赶紧想招。我没有 twikoo_comment.json 的备份,唯一可能的方式就是通过 MongoDB 直接导出。我有导出 MongoDB 数据的经验,但是现在 Windows 备用机不在手中,只能硬着头皮用 MacBook 导出。

看一下 MongoDB 的数据量,看起来很正常,一百多兆呢(我真傻,真的。Twikoo 的数据基本都是文本,怎么可能有这么大的数据量?后来我看了新的 MongoDB 后端面板,我这些评论加在一起只有 156kb,那也就是说我需要十几万条评论才可能达到这个量……这都是后话了)。这也使我成功地忽略了侧边栏显示的那一堆奇怪的 collection。

然后,自然是没有然后啊。MongoDB Compass 啥也导不出来,MongoDB Atlas CLI 倒是一次成功了,但是导出的是空的(我真傻,真的,我早该想到的,前端面板都看不见,MongoDB 怎么可能有有效数据?)。

事已至此,先吃席吧。——我的微积分助教 PWK 学长

然后我就摆烂了。算了,丢了就丢了吧。大不了从头再来,还可以趁机换个评论系统(此处容我吐槽一下,Twikoo 的加载慢得不像人)。

然后我又回到了我忠诚的本地环境。想着反正都丢了,不如试着把 envID 换成原本那个域名,里面还留着一些评论,还能损失最小化。反正情况也不可能再糟糕了。

make 构建,在浏览器里面预览……然后,奇迹发生了:我的评论全回来了

原来,事实上,我的两个云函数共享着同一份数据库。言语已经不能形容我此刻的心情了。

多中心备份配享太庙!

后续

其实到这里故事已经可以结束了,我只需要把 Vercel 云函数的环境变量扒下来就完事。但是我打算再走一步。

我重新开了一个 project,创建了一个新的数据库。这次的字符串我拷贝了下来,存到了我的 tokens.csv 里面。然后部署 Netlify 云函数(顺带着又喜提几个 function crash)。然后打开前端面板,导入我新下载的 JSON。

这一方面算是多数据库备份,另一方面,我希望调几个数据,而 Twikoo 的前端导入功能有时候不太好使,不能覆盖。所以干脆导入一个白板里面。

由于 Twikoo 的面板配置存在连接字符串里面,因此我需要再配一遍。这倒不是麻烦事。期间我还注册了新的机器人邮箱 [email protected],以后大家就可以接到这个小助手的邮件通知啦(我本来想用 outlook,奈何实在是不给力,一直 SMTP error,一点招没有)。