Migrate a XenForo forum to Discourse

フォーラムを移行した際、xengalleryが以前インストールされていたため、xfgalleryテーブルが存在しなくなったため、以下を変更する必要がありました。

  def get_xf_sql(type, id)
    case type
    when :gallery
      return "SELECT NULL WHERE 1=0;"
    when :attachment
      <<-SQL
        SELECT a.attachment_id, a.data_id, d.filename, d.file_hash, d.user_id
        FROM #{TABLE_PREFIX}attachment AS a
        INNER JOIN #{TABLE_PREFIX}attachment_data d ON a.data_id = d.data_id
        WHERE attachment_id = #{id}
        AND content_type = 'post'
      SQL
    end
  end
「いいね!」 1

スクリプトをもう一度実行して、完了するかどうかを確認してみてください。

システムは単一のパーティションにありますか?

mysql-server のインストール手順は廃止され、mariadb-server をインストールする必要があります。

sudo apt-get install mariadb-server mariadb-client libmariadb-dev-compat libmariadb-dev

残りの手順に従って XF DB をインポートできましたが、ガイドを更新する必要があります。

次の手順で詰まっています。助けが必要です。

echo "gem 'mysql2'" >> Gemfile
bundle install --no-deployment

上記を実行すると、次のエラーが発生します。Gemfile を確認したところ、gem ‘mysql2’ という行しか含まれていません。

この Gemfile には明示的なグローバルソースが含まれていません。
明示的なグローバルソースを使用しないと、Bundler を実行する前にローカルにインストールされている gem によって異なる lockfile が生成される可能性があります。
代わりに、次のように Gemfile にグローバルソースを定義してください: source "https://rubygems.org"。
ローカルにインストールされている gem で gem 'mysql2' を見つけることができませんでした。
root@ip-172-566-459-13-app:/#

コンテナ内の /var/www/discourse フォルダに移動して gem を追加する必要があるとのことでしたので、次のステップに進むことができました。

最終ステップで

RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb

を実行したところ、以下のエラーが発生しました。何が間違っているのでしょうか?

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/connection_adapters/postgresql_adapter.rb:63:in "rescue in new_client": We could not find your database: discourse. Available database configurations can be found in config/database.yml. (ActiveRecord::NoDatabaseError)To resolve this error:- Did you not create the database, or did you delete it? To create the database, run: bin/rails db:create- Has the database name changed? Verify that config/database.yml contains the correct database name.

解決しました:root ユーザーとして実行していたため、‘discourse’ ユーザーに切り替える必要がありました。インポートが開始されました。

「いいね!」 4

CPU 4基、RAM 16GBのそこそこ良いサーバーを調達しました。投稿の移行速度だと、投稿だけの移行に9日かかります。ユーザーの移行には2.5時間かかりました。現状のままでは無理なのは確かですが、この一括移行の解決策を見つけるまで、数ヶ月かけて慣れることはできます。

追伸:
移行スクリプトで、重複メールがインポートされないことがわかりました。重複はどのように判定されますか? xyz@gmail.comxyz+1@gmail.comxy.z@gmail.com と同じように扱われることに気づきました。

他にパターンはありますか?

個人のPCと同程度のスペックのVPSで移行を試したことがありますが、なぜか常にPCを使うよりもはるかに遅かったです。

最近は常にローカルで移行しています。投稿は何件ありますか?

「いいね!」 1

250万件の投稿。
比較のためにM1 Macでローカル移行を試します。

「いいね!」 1

ほぼその通りです。一意性のチェックは、指定されたメールアドレスを小文字に変換し、正規化されたバージョンに対して実行されます。

正規化では、すべてのドットを削除し、ユーザー名の後のすべてを無視します。

「いいね!」 3

CPUのシングルコア速度が重要な要素です。

私のマシンでは、1分あたり800〜1000ユーザーまたは投稿のレートが一般的です。

最終インポートを実行すると、既にインポートされていないユーザーと投稿のみがインポートされるため、それほど時間はかかりません。

Normalize emails サイト設定をオフにしてください(最近までデフォルトはオフでした)。おそらく、ここの関数でオフにする必要があります。

SiteSetting.normalize_emails=false を使用して、カスタマイズした xenforo スクリプトのバージョンに配置できます。重複メールアドレスを持つユーザーがどうなったのかはわかりません。明らかに2つの対処法があります。ダミーのメールアドレスを割り当てるか、インポートをスキップするかです。ダミーのメールアドレスを割り当てているようです。(そして、それらが実際にはダミーユーザーである可能性はかなり高いです)。もしスキップしたのであれば、スクリプトを再度実行するとインポートされます。

「いいね!」 3

はい、私のラップトップでは、1分あたり1000アイテムの速度で、はるかに速く処理されています。これはサーバー上の速度の約2倍です。それでも約3日かかります。

スキップされたメールを確認しましたが、それらのアカウントを無視するのはうまくいっているようです。最終インポートの前にそれらをマージするだけです。そのようなケースはほとんど20件ほどです。

最終インポートを実行すると、まだインポートされていないユーザーと投稿のみがインポートされるため、それほど時間はかかりません。

この点をご指摘いただきありがとうございます。私もこれを自分で観察しており、最終インポートを実行する際にこれが役立つことになりそうです。したがって、バックアップを取得し、D-3に復元してから、新しいDBバックアップファイルを使用してDay 0に別のバックアップと復元を行います。これで正しいですか?

「いいね!」 1

それらのバックアップと復元はXenforoサイトに対して行うのですか、それともインポートしたいライブのDiscourseサイトがあるのですか?

スクリプトの変更で再インポートが必要にならない限り、また、現在ラップトップにあるものがDiscourseサーバーに欲しいものである限り、Xenforoデータベースの新しいダンプを取得し続け、インポート(テストのため、所要時間を確認するためなど)することができます。そして、切り替え日には、Xenforoサイトをフリーズし、そのデータベースを取得し、スクリプトをもう一度実行してDiscourseサーバーにアップロードします。

Discourseサイトに保持したいデータが既にある場合は、さらに複雑になります。そのサイトをフリーズしてからXenforoデータを取得し、上記のように進める必要があるためです。

「いいね!」 1

Discourse のクリーンインストールになるので、それは簡単です。

移行を複数回テストし、Discourse に完全に慣れ、すべての追加機能を希望どおりに設定し、場合によっては追加機能のカスタマイズにも手を出すつもりなので、かなりの時間があります。

あなたが説明してくれたことで、一気に悩みが解消されました。一括インポートについても自分で解決しなければならないと思っていたからです。

「いいね!」 2

インポートスクリプトはログを出力しますか?テストインポートが数時間、98.2%で停止しています。

もう一つ気づいたのですが、移行を再開すると、1000件の投稿のバッチをスキップするのに約30秒かかります。そのため、実質的な速度は、最初のインポートの1分あたり2000アイテムになります。これは、カットオーバー当日の最後のインポートでも、1分あたり1000投稿から大幅な改善ではありません。23時間のうち、すでにインポートされたアイテムをスキップするだけで時間がかかります。

表示されるものだけです。

おそらく停止して、もう一度開始した方が良いでしょう。

はい、すでにインポートされたすべてのデータをスキップします。そして、それは毎分2000件よりもはるかに速く行われます。今再起動すると、それがわかると思います。

それが、再起動して上記の投稿をしたことです。1分あたり2000投稿です。確かめるために、もう一度試しました。

「いいね!」 1

アバターと添付ファイルをインポートすることに成功しました。これらのフォルダをコピーしました。

/internal_data/attachments
/data/avatars

私の質問に答えるために、アバターと添付ファイルはインポート時に最終決定されます。ユーザーがIDをインポートした後にアバターを変更した場合、2回目の実行でその投稿またはユーザーがスキップされるため、インポート/更新されません。

次に、会話のインポート(スキップすることもできますが、あると便利です)とパーマネントリダイレクトを把握する必要があります。

@Fajfi - インポートスクリプトへのご協力ありがとうございます。アバターと添付ファイルで問題なく動作しました。まだ実行中で、いいねの部分には到達していません。

会話のインポートを修正しました。XF2.3から50万件以上のメッセージをDiscourseにインポートできました。興味のある方のためにプルリクエストを作成しました。

----編集----

いいねのインポートの修正に関するプルリクエストをもう1つ作成しました。XF2.1以降からDiscourseへの移行がこれまで誰も行っていなかったというのは驚きです。いいねは、XF2.1がリリースされた2019年にリアクションに名前が変更されました。

「いいね!」 5