将Waline从LeanCloud迁移到MongoDB

LeanCloud 突然发了一条通知说是准备明年停止对外提供服务

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

虽然还有时间,老苏还是赶紧花时间研究了一下,当你看到本文时,说明已成功完成了迁移

数据迁移

可能是因为数据量大,反正 Waline 后台的 导出 从来没成功过

估计应该是超时了,所以只能从数据库的源头想办法

数据导出

LeanCloud 存储结构化数据提供了多种导出机制。通过控制台前往 数据存储 –> 导入导出 ,您可以分别进行 数据导出备份导出。其中:

  • 数据导出:支持按时间范围筛选,它提供了 JSON 格式的导出文件;
  • 备份导出:则提供的是当日凌晨数据库备份的 BSON 格式的文件,它可用于 mongorestore 直接导入 MongoDB 数据库。

老苏选择了 备份导出,因为准备后续使用 MongoDB

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

收到邮件后

逐个下载即可

_ 开头的应该用不上

注册 MongoDB

Waline 支持多种数据库,包括 MySQLPostgreSQLSQLite 以及 MongoDB

https://mongodb.com 官网免费提供了 512MMongoDB 数据库支持,对于 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
2
mongorestore --uri "mongodb+srv://<db_user>:<db_password>@cluster0.sfhc25j.mongodb.net/?appName=Cluster0" --db
waline --dir "C:\Users\Administrator\Downloads\leancloud\2026.01.16" --gzip --drop

Navicat 中查看

需要重新命名一下

测试验证

老苏为了保险起见,并没有直接修改 Vercel 部署的 Waline,而是先验证了连接 MongoDB 的环境变量

有两个选择,一个是基于 docker 在局域网中部署 Waline,另一种是在 Vercel 上部署另一个 Waline 实例

如果是从 VercelStorage 中创建的 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
2
3
4
5
6
7
8
MONGO_DB = waline # 
MONGO_USER = <db_user>
MONGO_PASSWORD = <db_password>
MONGO_HOST = ["ac-ytvhtf1-shard-00-00.sfhc25j.mongodb.net","ac-ytvhtf1-shard-00-01.sfhc25j.mongodb.net","ac-ytvhtf1-shard-00-02.sfhc25j.mongodb.net"] # MongoDB 主机名
MONGO_PORT = [27017,27017,27017]
MONGO_REPLICASET = atlas-6swbtq-shard-0
MONGO_AUTHSOURCE = admin
MONGO_OPT_SSL = true

安全性

因为是从 Vercel 上访问,所以还需要在 MongoDBSecurity Quickstart 中,放行 IP 地址 0.0.0.0/0

否则会导致 Waline 登录失败,从网页调试工具,应该会看到错误:Failed to load resource: the server responded with a status of 500 ()

迁移指引

以上测试都通过后,就可以开始对 VercelWaline 做最后的改动了

  1. 删除与 LeanCloud 相关的三个参数 LEAN_MASTER_KEYLEAN_KEYLEAN_ID
  2. 新增 8MONGO_ 开头的环境变量;
  3. 其他的环境变量保持不变;

目前遗留问题就是 热榜 还依赖 LeanCloud ,还有将近一年时间,总会解决的

参考文档

多数据库服务支持 | Waline
地址:https://waline.js.org/guide/database.html#mongodb

服务端环境变量 | Waline
地址:https://waline.js.org/reference/server/env.html#数据库