Migrate a XenForo forum to Discourse

投稿数がわずか5,000件、メンバー数は約1,000人です。

「いいね!」 3

まだ大規模ボードインポーターを待っています。18m ポストのフォーラムを試してテストするためです。

「いいね!」 3

XenForo用ですか?他の一括インポート機能も備えていますが、1,800万件の投稿となると、確かに非常に時間がかかるでしょうね!

「いいね!」 4

2700万件の投稿を自前で一括インポートする仕組みを開発しています。添付ファイルを除いた状態では1週間以上かかっていた処理が、すべて含めて1日未満に短縮されました。昨日、初回のインポートテストをエラーなく完了しました。非常にワクワクする進展です。

「いいね!」 4

ありがとう、Justin。少し見てみたのですが、これで大丈夫そうですか?(よろしければ公式インポーターに追加してください)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/FULL/PATH/TO/attachments'
  AVATAR_DIR = '/FULL/PATH/TO/avatars'

(最後の行を追加しました^^ - アバターをそこにコピーする必要があります)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(最後の行を追加しました^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Error: Upload did not persist for #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

ここは非常に遅い時間なので、いくつかミスがあったり、多くの部分を抜け落としているかもしれませんが、これはすべてのアバターが.jpg であると仮定しています(私の場合はすべてそうでした)。u.import_mode の切り替えについては確信が持てなかったので、コメントアウトしました。

完全に未テストです(もうすぐ 5 時です :zzz:

開発マシンで 10 万件の投稿を持つフォーラムでテストしましたが、90 分かかりました。インポートしたいフォーラムには数百万件の投稿があるので、おそらくその 10 倍の時間がかかるでしょうか?

素晴らしいですね!私たちとも共有していただけますか?いつ頃になる予定ですか?

「いいね!」 4

現在の目標は、それが完全に機能することを確認し、その後当サイトの移行が完了したら、最終的に他の人々も利用できるようにするために、Discourse のリポジトリにプッシュすることです。

「いいね!」 5

ステップバイステップのガイドも非常に役立ちますので、ぜひお願いいたします :)。

「いいね!」 1

5,000件の投稿と約600件の添付ファイルを、古いXeonプロセッサとSSDで処理した場合、所要時間は約10分でした。ある程度性能のあるマシンを用意し、オフラインでインポートを実行して、処理に任せるのがおすすめです。

「いいね!」 5

素晴らしい!楽しみにしています。

「いいね!」 1

はい、非常に簡易的なテストを実施しましたが、スクリプトへの追加は正常に機能したようです。現在、数千人のメンバーと10万件の投稿を用いた本格的なテストを行っています。動作すれば改めて報告します。

「いいね!」 1

こんにちは、何か新しいことはありますか?テストのお手伝いが必要であれば、喜んでサポートいたします。

xenforo スクリプトを実行すると、「users テーブルが存在しません」というエラーが表示されます。ご助力いただければ幸いです!

1 時間ほど調べていますが、まだ解決できていません。

スクリプトの上部には、XenForo の MySQL データベースに接続し、データをクエリするために記入する必要があるいくつかの変数があります。「import_db」がプレースホルダー値である可能性がありますが、これらの値が正しく記入されているか再度確認してください。

「いいね!」 3

@Ghan 私はこれを mysql -u root -p import_db < /shared/db.sqlimport_db にインポートしていると思いました。

私の xenforo.rb は以下の通りです:

ああ、わかりました。それがデータベース名なら、テーブル名が正しいか確認してください。プレフィックス付きで xf_user となっている可能性があり、それが問題を引き起こしているかもしれません。スクリプト内には TABLE_PREFIX という変数も存在するはずです。

「いいね!」 4

@Ghan ありがとうございます!

現在、インポートスクリプトでつまずいています。
ユーザーとカテゴリのループ処理は問題なく動作しています。しかし、import_posts 関数では、数時間待ってもタイムアウトするまでフリーズしたままになります。

まずは import_posts 内で値を出力してデバッグを開始しました:

results 変数の代入以降の出力は一切表示されません。

もし vb3 フォーラムをインポートしようとしている方がおられ、かつ XenForo のライセンスをお持ちであれば、このガイドが役立つかもしれません:

「いいね!」 2

xenForo の タグ を、それらが添付されているスレッドと一緒にインポートしますか?

ソースコードを確認するのは常に良い考えです。

答えは…はいだと思います(Xenforoのデータ構造にはあまり詳しくありませんが):

「いいね!」 3

条件によっては、少なくとも一度は誰かのタグをインポートしたようです。運が良ければ、あなたにもうまくいくでしょう!

「いいね!」 3