如您所知,NodeBB 支持两种数据库后端:Redis 和 MongoDB。Discourse 导入脚本同时支持这两种数据库。本教程将介绍如何迁移使用 MongoDB 作为数据库后端的 NodeBB。我们将使用带有 mongo 适配器的 NodeBB 导入器。如果您的 NodeBB 论坛使用 Redis 作为后端,请遵循 本教程,其中演示了 redis 适配器的使用方法。
计划
- 准备开发环境。
- 从生产环境导出数据库。
- 将生产数据库导入到 Discourse 实例中。
- 运行导入脚本。
可迁移的内容
- 用户组
- 附件
- 分类
- 根分类 => 根分类
- 子分类 & 子子分类 => 子分类
- 主题与帖子
- 置顶主题 => 置顶主题
- 锁定主题 => 关闭主题
- 主题浏览量
- 点赞用户
- 样式、提及、表情符号和附件。
- 用户(包含以下属性)
- 个人资料背景
- 头像
- 封禁状态
- 用户名
- 姓名
- 电子邮件
- 管理员状态
- 个人简介
- 用户组
- 网站
- 所在地
- 注册时间
准备本地开发环境
如计划所述,我们首先需要准备开发环境。请按照以下指南之一安装 Discourse:
如果您在设置 Discourse 服务器 时遇到任何问题,请参阅 本指南。
然后安装 MongoDB 数据库服务器。
Ubuntu 18.04:
$ wget -qO - https://www.mongodb.org/static/pgp/server-4.0.asc | sudo apt-key add -
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
$ sudo service mongod status
更多详情,请参阅 官方指南。
Mac OS:
$ brew tap mongodb/brew
$ brew install mongodb-community@4.0
$ brew services start mongodb-community@4.0
$ brew services status mongodb-community@4.0
更多详情,请参阅 官方指南。
Windows 10:
下载安装程序并将 MongoDB 安装为 Windows 服务:
https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-4.0.12-signed.msi
以管理员权限运行 cmd 以检查 MongoDB 服务器是否正常工作:
"C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe"
更多详情,请参阅 官方指南。
此环境将作为我们的 Discourse 服务器。
导出生产数据库转储
关闭您的 NodeBB 论坛(生产服务器)。
$ cd /path_to_nodebb
$ ./nodebb stop
关闭您的数据库:
$ sudo service mongodb stop
备份您的数据库:
$ mongodump --out ~/my_backup_path/
上一条命令的输出可能如下所示:
2019-08-16T15:17:09.845+0300 done dumping admin.system.users (1 document)
2019-08-16T15:17:09.846+0300 done dumping admin.system.version (2 documents)
2019-08-16T15:17:09.849+0300 done dumping nodebb.sessions (10 documents)
2019-08-16T15:17:09.850+0300 done dumping nodebb.socket.io (215 documents)
2019-08-16T15:17:09.854+0300 done dumping nodebb.objects (1488 documents)
请注意,备份实际上是一个目录,而不仅仅是一个文件。
您可以通过在
mongoCLI 中运行use myDatabase然后运行db.stats().dataSize;来检查数据库的大小。返回的值将以字节为单位。
备份您的论坛资源:
$ cd /path_to_nodebb_root_directory/
$ tar -czf ./uploads.tar.gz ./public/uploads
在拥有数据库和资源后,请将它们复制到 Discourse 服务器。
导入数据库
现在我们已经有了数据库,可以将其导入到本地 MongoDB 实例中:
$ mongorestore ~/path_of_my_backup_directory/
更多选项,请参阅 官方指南。
接下来,您需要解压 uploads.tar.gz,以便导入器能够导入资源:
$ tar xvzf uploads.tar.gz
运行导入脚本
现在数据库和资源已就位,我们可以准备运行导入脚本。在此之前,我们需要编辑 NodeBB 导入脚本以适应我们的需求。
这是您的 NodeBB 上传文件夹的路径:
ATTACHMENT_DIR = '/absolute_path/uploads'
接下来,我们需要告诉导入器使用 mongo 适配器而不是 redis 适配器:
adapter = NodeBB::Mongo
@client = adapter.new('mongodb://127.0.0.1:27017/nodebb')
# adapter = NodeBB::Redis
# @client = adapter.new(
# host: "localhost",
# port: "6379",
# db: 14
# )
在干净的 Discourse 环境中并支持 mongo gem 的情况下运行导入器:
$ cd ~/discourse
$ echo "gem 'mongo'" >> Gemfile
$ bundle install
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb
导入器将连接到 MongoDB 实例,并将所有内容迁移到 Discourse。
导入完成后,启动 Discourse:
$ bundle exec rails server
启动 Sidekiq 以处理迁移的数据:
$ bundle exec sidekiq
您可以在 http://localhost:3000/sidekiq/queues 监控进度。
按照此 教程 执行 Discourse 备份,并将其上传到您的 Discourse 生产服务器。
![]()
如果您对该过程有任何疑问,我很乐意提供帮助。
祝迁移顺利 ![]()

