将使用 Redis 的 NodeBB 论坛迁移到 Discourse

本教程将向您展示如何使用 NodeBB 导入器 将 NodeBB 论坛迁移到 Discourse 平台。如果您的 NodeBB 论坛使用 MongoDB 作为后端,请遵循 本教程。不用担心,这是一个简单的过程。让我们开始吧。

计划

  • 准备开发环境。
  • 从生产环境导出数据库。
  • 将生产数据库导入 Discourse 实例。
  • 运行导入器脚本。

可以迁移哪些数据?

  • 群组
  • 分类
    • 根分类 => 根分类
    • 子分类及子子分类 => 子分类
  • 附件
  • 主题与帖子
    • 置顶主题 => 置顶主题
    • 主题浏览量
    • 所有样式(包括提及、表情符号和附件)都将顺利迁移。
  • 用户(包含以下属性)
    • 头像(个人资料图片)
    • 个人资料背景
    • 封禁状态
    • 姓名
    • 用户名
    • 电子邮件
    • 个人简介
    • 管理员状态
    • 网站
    • 所在地
    • 加入时间状态
    • 群组

准备本地开发环境

按照以下指南之一设置您的开发环境:

从现在开始,我将此环境称为 Discourse 服务器

:bulb: 如果您在设置 Discourse 时遇到任何问题,请使用 本指南

导出生产数据库转储(来自 NodeBB 服务器):

关闭您的论坛。这是 NodeBB 推荐的步骤。

$ cd /path_to_nodebb
$ ./nodebb stop

您还应该关闭 Redis:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

您的论坛数据库全部在一个文件中。该文件由 Redis 定期自动生成。通常该文件位于 /var/lib/redis/dump.rdb。此外,您也可以从 Redis CLI 获取路径:

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"
127.0.0.1:6379> exit
$ ls -la /var/lib/redis
# -rw-rw-r-- 1 redis redis 2664346 Aug 4 16:24 dump.rdb

:bulb: 如果您的 Redis 服务器需要密码,请使用 AUTH YOUR_PASSWORD

:bulb: 如果由于某种原因您未在预期路径中找到数据库文件,可以通过在 Redis CLI 中运行 SAVE 命令手动生成它。

现在您需要复制论坛附件:

$ cd /path_to_nodebb_root_folder/
$ tar -czf ./uploads.tar.gz ./public/uploads

现在您已拥有数据库和论坛资源,需要将它们复制到 Discourse 服务器

导入数据库

如果您按照安装 Discourse 的说明操作,Discourse 服务器 上应该已安装 Redis 服务器:

$ redis-server -v
# Redis server v=5.0.2...

现在您需要停止 Redis 服务器(重要)。

基于 Linux 的系统:

$ sudo service redis-server stop
$ sudo service redis-server status
# redis-server is not running

Mac OS:

$ brew services stop redis
$ brew services list
# redis stopped

您现在需要做的将论坛数据库复制到本地 Redis 数据库路径。导入器需要连接到 Redis 服务器并将 NodeBB 数据库迁移到 Discourse 数据库。此步骤假设您的 Redis 数据库中没有任何重要数据,否则您应该先进行备份。

$ redis-cli
127.0.0.1:6379> config get dir
# "/var/lib/redis"

检查是否有任何文件,并记录当前用户以及 dump.rdb 的权限:

$ ls -la /var/lib/redis

复制 NodeBB 数据库(如果已有则覆盖):

$ cp dump.rdb /var/lib/redis

稍后尝试连接 Redis 服务器时,您可能会收到 Fatal error loading the DB: Permission denied 错误,因此您应更改 dump.rdb 的权限:

# 将用户替换为您之前记录的相同用户。
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

现在您需要将 uploads.tar.gz 解压到您选择的任意路径:

$ tar xvzf uploads.tar.gz

运行导入器脚本

现在我们的数据库已就位,可以运行导入器脚本了。在此之前,我们需要编辑一些配置。您可能只需要更改以下两行。

这是您的 NodeBB 上传文件夹的路径:

ATTACHMENT_DIR = '/absolute_path/uploads'

这是 Redis 中数据库的名称。默认为 0

db: 0

在干净的 Discourse 上运行导入器:

$ cd ~/discourse
$ bundle exec rake db:drop db:create db:migrate
$ bundle exec ruby script/import_scripts/nodebb/nodebb.rb

导入器将连接到 Redis 服务器,并将所有内容迁移到 Discourse PostgreSQL 数据库。

导入器完成后,启动 Discourse 平台:

$ bundle exec rails server

启动 Sidekiq 以处理迁移的数据:

$ bundle exec sidekiq

您可以在 http://localhost:3000/sidekiq/queues 监控进度。

按照本 教程 执行 Discourse 备份并将其上传到您的 Discourse 生产服务器。

至此,您应该已成功完成从 NodeBB 到 Discourse 的完整迁移 :tada:
如果您有任何问题,我很乐意提供帮助 :slight_smile:

9 个赞

我一直在不同的帖子中唠叨我的迁移:D

我有一个 NodeBB 论坛,使用 Redis,并且已经在开发版本中成功完成了迁移过程,但仍有一些问题:

  • 在迁移脚本中,我正确地填写了存放图片和论坛文件的绝对路径。迁移完成后,我发现图片在帖子中不可见。在 Discourse 中,它们显示为 URL 链接:assets/uploads,但那里什么也没有。

    在开发版本中,我通过创建一个符号链接解决了这个问题:
    ln -s path/to/images public/assets

    但在生产版本中,我需要做什么才能从 Docker 内部的 assets/upload 链接到我存放旧图片的文件夹?

  • 似乎所有的论坛帖子都已正确迁移,但我没有看到用户之间的直接消息……它们不在迁移中吗?

  • 脚本没有检测到任何用户头像。

  • 最后,在新论坛中我没有看到任何 YouTube 视频或 Twitter 的嵌入。我需要为此安装一个插件吗?

非常感谢您的帮助。

这不应该有必要。如果您将原始图像放在 ATTACHMENT_DIR 中配置的路径下,Discourse 将在 path-to-your-install/discourse/public/uploads/default/ 中创建一个上传(本质上是文件的副本)。如果您查看 Uploads 表,它应该看起来像这样:

[1] pry(main)> Upload.last
  Upload Load (1.5ms)  SELECT "uploads".* FROM "uploads" ORDER BY "uploads"."id" DESC LIMIT 1
=> #<Upload:0x0000000109a460a0
 id: 196,
 user_id: 251468,
 original_filename: "Screenshot 2023-11-17 at 11.52.39.png",
 filesize: 25174,
 width: 398,
 height: 248,
 url: "/uploads/default/original/1X/2e5f7a09ba3bcd3a3597285771c53c16f20b18dd.png",
 created_at: Fri, 17 Nov 2023 19:12:47.455954000 UTC +00:00,
 updated_at: Fri, 17 Nov 2023 19:12:47.484137000 UTC +00:00,
 sha1: "2e5f7a09ba3bcd3a3597285771c53c16f20b18dd",

正确,看起来 nodebb 脚本不会迁移私信。您可以查看其他脚本以了解如何导入私信,例如查看 Vanilla 脚本

头像可能没有正确上传,可能是因为您上面提到的同一个问题。

不需要插件。您可能需要重新烘焙您的帖子。您可以等待 sidekiq 自动执行此操作,或者从控制台运行完全重新烘焙:

rake posts:rebake

nodebb 脚本已经几年没有更新了,所以我猜测它的一些部分已经过时,需要修改才能与您的数据一起使用。希望这有帮助!

1 个赞