Migrate a XenForo forum to Discourse

Hey guys so after trying for a week or so I decided to import the database on docker app which I hoped it will succeed without any issues. TBH I got some issues at first but it turned to be all easy to solve.

Now I would recommend doing this only once before you deploy your production site, after importing everything take a Discourse backup, wipe everything out and install new Discourse instance then restore the imported db.

Ok let’s begin:

  1. First lets backup your old database from your old server, sign in to your Discourse server then:

     ssh USER@XENFORO_SERVER_IP  # Use -p argument to specify custom port
     mysqldump -u XENFORO_DATABASE_USER -p XENFORO_DATABASE_NAME > xen_db.sql
     exit
    
  2. After installing Discourse start the app:

     ./launcher start app
    
  3. Now lets pull the database backup from xenforo server:

     scp USER@XENFORO_SERVER_IP:~/xen_db.sql /var/discourse/shared/standalone/xen_db.sql
    

    If you changed the ssh port use -P argument

     scp -P 2222 USER@XENFORO_SERVER_IP:~/xen_db.sql /var/discourse/shared/standalone/xen_db.sql 
    
  4. Login to docker machine, install and start mysql:

     docker exec -it app bash
     sudo apt-get update
     sudo apt-get upgrade
    

    During the installation you will be asked to set a root password for mysql

     sudo apt-get install mysql-server mysql-client libmysqlclient-dev
     service mysql start
    
  5. Login to mysql and create new database:

     mysql -u root -p
    

    Enter your mysql root password then

     create database xenforo_db;
     exit;
    
  6. Import your xenforo database into the new one:

     mysql -u root -p xenforo_db < /shared/xen_db.sql
     # Enter your mysql root password and wait until it finish
    
  7. Include the gem in discourse Gemfile:

     echo "gem 'mysql2'" >>Gemfile
    
  8. Run bundle install:

     bundle install --no-deployment
    
  9. Edit the importer script and change the following:

    vi /var/www/discourse/script/import_scripts/xenforo.rb
    XENFORO_DB = "xenforo_db"
    @client = Mysql2::Client.new(
      host: "localhost",
      username: "root",
      password: "Your mysql root password",
      database: XENFORO_DB
    )
    
  10. You are set to go now, run the importer:

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

  11. If you get the error 'Peer authentication failed for user "discourse"':

  12. Edit the file /etc/postgresql/9.5/main/pg_hba.conf

  13. change all ‘peer’ to ‘trust’ and save the file

  14. restart postgres server: service postgresql restart

Run the importer again and this time it should work without any problem, be patient this might take a while based on your database size.

Hope this helps someone. :slight_smile:

「いいね!」 24

What are the list of XenForo Data covered on this import?
I hope to import this list:

XenForo Page Nodes

  • Pages

XenForo

  • Profile Fields
  • Member Groups
  • Members
  • Status Updates / Profile Comments
  • Status Comments
  • Private Messages
  • Private Message Replies
  • Attachments
  • Member Ranks

XenForo Forums

  • Forums
  • Topics
  • Posts
  • Attachments
「いいね!」 1

Got this error:

# bundle install --no-deployment
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
Your Gemfile has no gem server sources. If you need gems that are not already on your machine, add a line like this to your Gemfile:
source 'https://rubygems.org'
Could not find gem 'mysql2' in any of the gem sources listed in your Gemfile.
「いいね!」 1

Different Error now.

root@discourse-app:/var/www/discourse# RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb
No connection to db, unable to retrieve site settings! (normal when running db:create)
No connection to db, unable to retrieve site settings! (normal when running db:create)
No connection to db, unable to retrieve site settings! (normal when running db:create)
No connection to db, unable to retrieve site settings! (normal when running db:create)
No connection to db, unable to retrieve site settings! (normal when running db:create)
No connection to db, unable to retrieve site settings! (normal when running db:create)
Traceback (most recent call last):
	31: from script/import_scripts/xenforo.rb:3:in `<main>'
	30: from script/import_scripts/xenforo.rb:3:in `require'
	29: from /var/www/discourse/script/import_scripts/base.rb:20:in `<top (required)>'
	28: from /var/www/discourse/script/import_scripts/base.rb:544:in `<class:Base>'
	27: from /var/www/discourse/lib/discourse.rb:411:in `system_user'
	26: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/core.rb:196:in `find_by'
	25: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/core.rb:196:in `all?'
	24: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/core.rb:196:in `each'
	23: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/core.rb:196:in `block in find_by'
	22: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/model_schema.rb:336:in `columns_hash'
	21: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/model_schema.rb:456:in `load_schema'
	20: from /usr/local/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
	19: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/model_schema.rb:459:in `block in load_schema'
	18: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/attribute_decorators.rb:51:in `load_schema!'
	17: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/attributes.rb:234:in `load_schema!'
	16: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/model_schema.rb:466:in `load_schema!'
	15: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:90:in `connection'
	14: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_handling.rb:118:in `retrieve_connection'
	13: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:1008:in `retrieve_connection'
	12: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:380:in `connection'
	11: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:521:in `checkout'
	10: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:793:in `acquire_connection'
	 9: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:832:in `try_to_checkout_new_connection'
	 8: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:853:in `checkout_new_connection'
	 7: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/abstract/connection_pool.rb:809:in `new_connection'
	 6: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `postgresql_connection'
	 5: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:40:in `new'
	 4: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:215:in `initialize'
	 3: from /usr/local/lib/ruby/gems/2.5.0/gems/activerecord-5.2.0/lib/active_record/connection_adapters/postgresql_adapter.rb:684:in `connect'
	 2: from /usr/local/lib/ruby/gems/2.5.0/gems/pg-1.0.0/lib/pg.rb:56:in `connect'
	 1: from /usr/local/lib/ruby/gems/2.5.0/gems/pg-1.0.0/lib/pg.rb:56:in `new'
/usr/local/lib/ruby/gems/2.5.0/gems/pg-1.0.0/lib/pg.rb:56:in `initialize': FATAL:  Peer authentication failed for user "discourse" (PG::ConnectionBad)
「いいね!」 1

Yay no idea how long this will take :smiley:

「いいね!」 3

This is correct right?

「いいね!」 1

Guide needs an update I think.
Before running this, directory must be within /var/www/discourse/.
cd /var/www/discourse/

「いいね!」 4

3件の投稿が新しいトピックに分割されました: XenForo import script imported banned users and soft-deleted topics and posts

8 posts were split to a new topic: Help migrating Xenforo

14件の投稿が新しいトピックに分割されました:XenForoからの添付ファイルのインポートに関する問題

5件の投稿が新しいトピックに分割されました: XenForoからDiscourseへの移行で問題が発生しています

投稿が既存のトピックにマージされました:XenForoからDiscourseへの移行で問題が発生しています

XenForoからDiscourseへ移行された理由を聞かせてください。私は1週間前にフォーラムを立ち上げたばかりで、XenForoで運営されているサイトを見て、ポイントシステムを含むプラグインに感銘を受けました。移行のデメリットや理由を知りたいです。よろしくお願いします。

100万投稿規模のボードを、Digital Ocean の droplet 上で Xenforo から Discourse へ移行し、無事に完了しました。以下に、コマンドごとの私の手順をまとめます(以前別の vBulletin ボードで行った手順と非常に似ています)。

インポートには最低 4 vCPU / 8GB のリソースを推奨します。

このスレッドで移行を乗り越えるのを手伝ってくれた皆様に感謝します。読むことと読み返すことだけで、ここ数日は本当に楽しかったです。

1 - Digital Ocean の Discourse 1 クリック droplet のインストール

2 - プロンプトに従い、SSH 経由で Discourse のインストールを完了

Open SSH console
root
(yourrootpassword)
(enter)
(yourdomain).com
など

3 - SFTP にログイン

sftp root@XXX.XXX.XX.XX
y (確認を求められた場合)
yes
(yourrootpassword)
put db.sql /var/discourse/shared/standalone/db.sql

4 - ウェブサイトにログインして管理者アカウントを設定

5 - SSH にログインし、プロセスを開始

ssh root@XXX.XXX.XX.XX
cd /var/discourse
./launcher start app
docker exec -it app bash
sudo apt-get update
sudo apt-get upgrade
y

6 - MariaDB のインストール(MySQL の代替)

apt-get update && apt-get install mariadb-server-10.3 libmariadbd-dev
y

7 - MySQL データベースのセットアップ

service mysql start
mysql -u root -p
password
create database import_db;
exit;

8 - ダンプのインポート → MySQL データベースへの転送

mysql -u root -p import_db < /shared/db.sql
password

9 - GEM ファイル

echo "gem 'mysql2'" >>Gemfile
echo "gem 'mysql2', require: false" >> /var/www/discourse/Gemfile
echo "gem 'php_serialize', require: false" >> /var/www/discourse/Gemfile
cd /var/www/discourse
su discourse -c 'bundle install --no-deployment --without test --without development --path vendor/bundle'
(赤いテキストの結果は無視してください)

10 - インストールスクリプトの設定

vi /var/www/discourse/script/import_scripts/xenforo.rb

---データベース名/パスワード、プレフィックスなどに応じてテキストファイルを編集---

(esc)
:wq

11 - Bundle 設定

bundle config set path 'vendor/bundle'
bundle config set without 'development:test'
bundle config unset deployment
su discourse -c 'bundle install'

12 - MySQL 設定(前の手順で可能かもしれない)

mysql --version
sudo mysql -u root -p
password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
exit

13 - インストールスクリプトの実行

su discourse -c 'bundle exec ruby script/import_scripts/xenforo.rb'
「いいね!」 4

移行完了に向けて作業を進めていますが、添付ファイルに関連してエラーが発生しているようです。

RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb
既存のグループを読み込み中...
既存のユーザーを読み込み中...
既存のカテゴリを読み込み中...
既存の投稿を読み込み中...
既存のトピックを読み込み中...

ユーザーの作成中
すでにインポート済みのユーザー 407 件をスキップ

カテゴリのインポート中...
       12 / 12 (100.0%)  [344731 件/分]
トピックと投稿の作成中
        2 / 4554 (  0.0%)  [17724 件/分]  トレースバック (最新の呼び出し順):
        18: from script/import_scripts/xenforo.rb:396:in `\u003cmain\u003e'
        17: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
        16: from script/import_scripts/xenforo.rb:32:in `execute'
        15: from script/import_scripts/xenforo.rb:174:in `import_posts'
        14: from /var/www/discourse/script/import_scripts/base.rb:866:in `batches'
        13: from /var/www/discourse/script/import_scripts/base.rb:866:in `loop'
        12: from /var/www/discourse/script/import_scripts/base.rb:867:in `block in batches'
        11: from script/import_scripts/xenforo.rb:180:in `block in import_posts'
        10: from /var/www/discourse/script/import_scripts/base.rb:508:in `create_posts'
         9: from /var/www/discourse/script/import_scripts/base.rb:508:in `each'
         8: from /var/www/discourse/script/import_scripts/base.rb:509:in `block in create_posts'
         7: from script/import_scripts/xenforo.rb:186:in `block (2 levels) in import_posts'
         6: from script/import_scripts/xenforo.rb:315:in `process_xenforo_post'
         5: from script/import_scripts/xenforo.rb:324:in `process_xf_attachments'
         4: from /usr/local/lib/ruby/2.7.0/set.rb:328:in `each'
         3: from /usr/local/lib/ruby/2.7.0/set.rb:328:in `each_key'
         2: from script/import_scripts/xenforo.rb:326:in `block in process_xf_attachments'
         1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/core_ext/string/filters.rb:22:in `squish!'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/activesupport-6.0.3.3/lib/active_support/core_ext/string/filters.rb:22:in `gsub!': can't modify frozen String: \"\\\\t\\\\tSELECT a.attachment_id, a.data_id, d.fil\\n\\\\t\\\\tFROM xf_attachment AS a\\\\n\\\\t\\\\tINNER JOIN xf_attachment_data d ON a.data_id = d.data_id\\\\n\\\\t\\\\tWHERE attachment_id = 13\\\\n\" (FrozenError)

何か原因についてご存知の方がいらっしゃいますか?「FrozenError」とは何でしょうか?

xenforo.rb ファイルを編集して、

# frozen_string_literal: true

# frozen_string_literal: false

に変更する必要があったようです。

「いいね!」 2

このガイドを書いていただき、ありがとうございます!

インポーターはアバターや添付ファイルもインポートしますか?それらは単に /tmp/attachments フォルダにコピーすればよいのでしょうか?

インポーターを簡単に確認したところ、投稿へのアップロードのみをインポートしているようです。アバターのサポートを追加する必要があります。

「いいね!」 2

確認しました。アップロードのみがインポートされ、アバターは含まれません。先週、XenForoからの移行を完了したばかりです。

「いいね!」 3

ボードサイズは?
投稿数、スレッド数、メンバー数。
おめでとうございます :slight_smile:

「いいね!」 2