Migrate a NodeBB forum with Redis to Discourse

This tutorial will show you how to use the NodeBB Importer to migrate NodeBB forum to Discourse platform. If your NodeBB forum uses MongoDB as backend then follow this tutorial. Do not worry, It is an easy process. Let’s get started.

The plan

  • Preparing the development environment.

  • Export database from production environment.

  • Import the production DB to a Discourse instance.

  • Run the importer script.

What data can be migrated?

  • Groups
  • Categories
    • Root Category => Root Category
    • Sub Category & Sub-Sub-Category => Sub-Category
  • Attachments
  • Topics & Posts
    • pinned topic => pinned topic
    • topic views
    • all styles will be migrated just fine with mentions, emoji, and attachments.
  • Users (with following attributes)
    • avatars (profile picture)
    • profile background
    • banned status
    • name
    • username
    • email
    • bio
    • admin
    • website
    • location
    • joining at status
    • group

Preparing Local Development Environment

Set up your development environment by following one of these guides:

From now on I will be referring to this environment as Discourse server

:bulb: Please, use this guide if you have any trouble setting up Discourse.

Exporting Production Database Dump (from NodeBB Server):

Shut down your forum. This recommended by NodeBB

$ cd /path_to_nodebb
$ ./nodebb stop

You should also shut down Redis:

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

Your DB forum is all in one file. This file is auto-generated periodically by Redis. Usually this file is located in /var/lib/redis/dump.rdb. Also, you can get the path from 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: If your Redis server requires password use AUTH YOUR_PASSWORD

:bulb: If for some reason you did not find your DB file in the expected path, you can generate it manually by running SAVE inside Redis CLI.

Now you need to copy the forum attachments:

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

Now that you have your DB and forum assets you need to copy them to Discourse server.

Importing The Database

If you follow the instructions in installing Discourse you should have Redis server installed on Discourse server:

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

Now you need to stop Redis server (important).

Linux based:

$ 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

What you need to do now is to copy the DB forum to our local Redis DB path. The importer needs to connect to Redis server and migrate the NodeBB DB to Discourse DB. This step assumes that you do not have anything important on your Redis DB, otherwise you should perform a backup.

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

Check if there are any files and take note about the current user and permission of dump.rdb:

$ ls -la /var/lib/redis

Copy the NodeBB DB (replace if there is one):

$ cp dump.rdb /var/lib/redis

Later when trying to connect to Redis server you may get Fatal error loading the DB: Permission denied, therefore you should alter the permission of dump.rdb:

# Replace the user with same as the note you take previously.
$ sudo chown redis:redis /var/lib/redis/dump.rdb
$ sudo chmod 660 /var/lib/redis/dump.rdb

Now you need to untar the uploads.tar.gz to any path of your choice:

$ tar xvzf uploads.tar.gz

Running The Importer Script

Now that our database in place we are ready to run our importer script. Before that, we need to edit some configuration. You properly need to change just the following two lines.

This is the path of your NodeBB uploads folder:

ATTACHMENT_DIR = '/absolute_path/uploads'

This is the name of DB in Redis. The default is 0:

db: 0

Run the importer with clean Discourse:

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

The importer will connect to the Redis server and migrate everything to Discourse Postgresql DB.

After the importer finishes, start Discourse platform:

$ bundle exec rails server

Start Sidekiq to process the migrated data:

$ bundle exec sidekiq

You can monitor the progress at http://localhost:3000/sidekiq/queues.

Perform a Discourse backup and upload it to your Discourse production server by following this tutorial.

By that, you should have successfully made a full migration from Nodebb to Discourse :tada:
Please, if you have any questions I am happy to help :slight_smile:

「いいね!」 9

何度も様々なスレッドで移行についてしつこく聞いてしまっています :smiley:

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