将Waline从LeanCloud迁移到MongoDB
LeanCloud 突然发了一条通知说是准备明年停止对外提供服务

而老苏博客的评论系统 Waline 就使用了 LeanCloud 作为评论的存储服务

虽然还有时间,老苏还是赶紧花时间研究了一下,当你看到本文时,说明已成功完成了迁移
数据迁移
可能是因为数据量大,反正 Waline 后台的 导出 从来没成功过

估计应该是超时了,所以只能从数据库的源头想办法
数据导出
LeanCloud 存储结构化数据提供了多种导出机制。通过控制台前往 数据存储 –> 导入导出 ,您可以分别进行 数据导出 和 备份导出。其中:
数据导出:支持按时间范围筛选,它提供了JSON格式的导出文件;备份导出:则提供的是当日凌晨数据库备份的BSON格式的文件,它可用于mongorestore直接导入MongoDB数据库。
老苏选择了 备份导出,因为准备后续使用 MongoDB

LeanCloud 导出成功后,会通过邮件发送导出结果

收到邮件后

逐个下载即可
以
_开头的应该用不上

注册 MongoDB
Waline 支持多种数据库,包括 MySQL,PostgreSQL,SQLite 以及 MongoDB
而 https://mongodb.com 官网免费提供了 512M 的 MongoDB 数据库支持,对于 Waline 来说绰绰有余
注册 MongoDB 地址: https://www.mongodb.com
注册成功后,需要获取连接方式

还有一种更简单的创建数据库的办法,就是在
vercel面板中 –>Storage–>Create a database–>MongoDB Atlas,可以不用考虑连接和安全性设置
- 进入
Driver模式

会获得下面这种 mongodb+srv格式的 URI
1 | mongodb+srv://<db_user>:<db_password>@cluster0.sfhc25j.mongodb.net/?appName=Cluster0 |
可用于 Navicat 连接管理

但 AI 不建议老苏使用 Standalone 类型,让选择 Replica Set,都是可以连通的

而 Waline 使用的包比较旧,并不支持 mongod+srv 协议,只能使用 mongodb
- 进入
Compass模式,版本选中1.11 or earlier

会获得下面这种 mongodb格式的 URI
1 | mongodb://<db_user>:<db_password>@ac-ytvhtf1-shard-00-00.sfhc25j.mongodb.net:27017,ac-ytvhtf1-shard-00-01.sfhc25j.mongodb.net:27017,ac-ytvhtf1-shard-00-02.sfhc25j.mongodb.net:27017/?replicaSet=atlas-6swbtq-shard-0&ssl=true&authSource=admin |
恢复数据
现在我们开始恢复从 LeanCloud 导出的 bson.gz 数据库
访问 MongoDB 官方的 Database Tools 下载页面:
https://www.mongodb.com/try/download/database-tools

然后在命令行执行下面的命令
1 | mongorestore --uri "mongodb+srv://<db_user>:<db_password>@cluster0.sfhc25j.mongodb.net/?appName=Cluster0" --db |

Navicat 中查看

需要重新命名一下

测试验证
老苏为了保险起见,并没有直接修改 Vercel 部署的 Waline,而是先验证了连接 MongoDB 的环境变量
有两个选择,一个是基于 docker 在局域网中部署 Waline,另一种是在 Vercel 上部署另一个 Waline 实例
如果是从
Vercel的Storage中创建的MongoDB Atlas数据库,下面的两个步骤是不需要的
环境变量
| 环境变量名称 | 必填 | 默认值 | 备注 |
|---|---|---|---|
MONGO_DB |
✅ | MongoDB 数据库名称 |
|
MONGO_USER |
✅ | MongoDB 服务的用户名 |
|
MONGO_PASSWORD |
✅ | MongoDB 服务的密码 |
|
MONGO_HOST |
127.0.0.1 |
MongoDB 服务的地址,支持数组格式 |
|
MONGO_PORT |
27017 |
MongoDB 服务的端口,支持数组格式 |
|
MONGO_REPLICASET |
MongoDB 集群 |
||
MONGO_AUTHSOURCE |
MongoDB 认证源 |
||
MONGO_OPT_SSL |
false |
是否使用 SSL 进行连接 |
下面是根据 mongodb格式的 URI 生成的示例
1 | MONGO_DB = waline # |
安全性
因为是从 Vercel 上访问,所以还需要在 MongoDB 的 Security Quickstart 中,放行 IP 地址 0.0.0.0/0

否则会导致 Waline 登录失败,从网页调试工具,应该会看到错误:Failed to load resource: the server responded with a status of 500 ()
迁移指引
以上测试都通过后,就可以开始对 Vercel 上 Waline 做最后的改动了
- 删除与
LeanCloud相关的三个参数LEAN_MASTER_KEY、LEAN_KEY、LEAN_ID; - 新增
8个MONGO_开头的环境变量; - 其他的环境变量保持不变;
目前遗留问题就是 热榜 还依赖 LeanCloud ,还有将近一年时间,总会解决的
参考文档
多数据库服务支持 | Waline
地址:https://waline.js.org/guide/database.html#mongodb服务端环境变量 | Waline
地址:https://waline.js.org/reference/server/env.html#数据库