NodeBBフォーラムをRedisからDiscourseへ移行する

このチュートリアルでは、NodeBB インポーター を使用して、NodeBB フォーラムを Discourse プラットフォームに移行する方法を説明します。NodeBB フォーラムがバックエンドに MongoDB を使用している場合は、こちらのチュートリアル を参照してください。ご安心ください、手順は簡単です。始めましょう。

計画

  • 開発環境の準備
  • 本番環境からのデータベースのエクスポート
  • 本番環境のデータベースを Discourse インスタンスにインポート
  • インポータースクリプトの実行

移行可能なデータ

  • グループ
  • カテゴリ
    • ルートカテゴリ ⇒ ルートカテゴリ
    • サブカテゴリおよびサブのサブカテゴリ ⇒ サブカテゴリ
  • アタッチメント
  • トピックおよび投稿
    • ピン留めされたトピック ⇒ ピン留めされたトピック
    • トピックの閲覧数
    • 全てのスタイル、メンション、絵文字、アタッチメントがそのまま移行されます。
  • ユーザー(以下の属性を含む)
    • アバター(プロフィール画像)
    • プロフィール背景
    • 禁止(BAN)ステータス
    • 名前
    • ユーザー名
    • メールアドレス
    • 自己紹介
    • 管理者権限
    • ウェブサイト
    • 所在地
    • 参加日時
    • グループ

ローカル開発環境の準備

以下のガイドのいずれかに従って、開発環境を設定してください。

以降、この環境を「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

インポータースクリプトの実行

データベースの準備が整ったので、インポータースクリプトを実行する準備ができました。その前に、いくつかの設定を編集する必要があります。通常、以下の 2 行を変更するだけで十分です。

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

何度も様々なスレッドで移行についてしつこく聞いてしまっています :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