FluxBBフォーラムをDiscourseへ移行

FluxBB データベースを Discourse にインポートするための スクリプト を作成しました。以下では、インポート手順をステップバイステップで解説します。

この移行スクリプトは、現在の最新バージョンである FluxBB v1.5.10 でテスト済みです。

どのデータをインポートできますか?

  • ユーザー(プロフィールや署名を含む)
  • グループ
  • カテゴリ
    :warning: 権限はインポートされず、すべてのカテゴリは公開設定になります。正しい権限はインポート後に手動で設定する必要があります。
  • トピック(固定/ピン留め状態を含む)
  • 投稿
  • 停止されたユーザー

移行を開始する前に、マシン(または仮想マシン内)で開発環境をセットアップしてください。開発用のインストールガイドについては、OS X または Ubuntu を参照してください。

Discourse には Ruby 3.4 以上が必要です。Ruby のバージョンを確認するには、以下のコマンドを入力してください。

ruby -v

MySQL

次に、古い FluxBB データベースに接続するために Ruby 用の mysql2 gem が必要です。以下のコマンドを実行して、libmysqlclient-dev 依存関係と mysql2 gem をインストールします。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libmysqlclient-dev
gem install mysql2

(オプション)MySQL ダンプを localhost にインポート

MySQL クライアントをインストールし、MySQL ダンプファイル(.sql)を開発マシンにインポートするには、以下の手順に従ってください。

sudo apt-get install mysql-server mysql-client

MySQL ユーザー、権限、テーブルを作成します。

mysql -u root -p mysql
mysql> CREATE USER 'fluxbb'@'localhost' IDENTIFIED BY 'fluxbb';
Query OK, 0 rows affected (0.00 sec)
.
mysql> CREATE DATABASE fluxbb;
Query OK, 1 row affected (0.01 sec)
.
mysql> GRANT ALL PRIVILEGES ON fluxbb.* TO 'fluxbb'@'localhost';
Query OK, 0 rows affected (0.00 sec)
.
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
.
mysql> exit

FluxBB データベースのダンプファイルをインポートします。

mysql -u fluxbb -p fluxbb < myfluxbb.sql

BBCode から Markdown へ

インポートスクリプトは BBCode から Markdown への変換を自動的に処理します。これに追加の gem は不要です。


mysql2 をインストールした後、Discourse のインストールパスに移動して Gemfile を編集します。

cd ~/discourse
sudo nano Gemfile

次に、ファイルの末尾に以下の行を追加して mysql2 gem を Discourse に追加します。

gem 'mysql2'

インポートスクリプトを実行する前に、以下の行をシェルのプロンプトに 1 行ずつ貼り付けてください(値の編集には矢印キーを使用します)。

export FLUXBB_HOST="localhost"
export FLUXBB_DB="fluxbb"
export FLUXBB_USER="root"
export FLUXBB_PW=""
export FLUXBB_PREFIX=""

これでインポートスクリプトを実行する準備が整いました。以下のコマンドを実行して移行を開始します。

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

インポートが完了するまで待ちます。処理が極端に遅くなった場合は、スクリプトを再起動してください。

すべて完了したらおめでとうございます! データベースが FluxBB から Discourse へ正常に移行されました :thumbsup:

Discourse インスタンスを起動します。

bundle exec rails server

Sidekiq を起動して処理を完了させます。

bundle exec sidekiq -q critical,4 -q default,2 -q low

フォーラムのサイズによっては、この処理に時間がかかる場合があります。進捗状況は http://localhost:3000/sidekiq で監視できます。

最後に、管理ページ /admin/backups からバックアップを取得し、ライブの Discourse ウェブサイトにインポートしてください。

「いいね!」 12
discourse@app-deb10-app:/var/www/discourse$ FLUXBB_HOST="localhost" FLUXBB_DB="flux" FLUXBB_USER="fluxbb" FLUXBB_PW="fluxbb" RAILS_ENV=production bundle exec ruby script/import_scripts/fluxbb.rb 
既存のグループを読み込み中...
既存のユーザーを読み込み中...
既存のカテゴリを読み込み中...
既存の投稿を読み込み中...
既存のトピックを読み込み中...

グループを作成中
Traceback (most recent call last):
	9: from script/import_scripts/fluxbb.rb:262:in `<main>'
	8: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
	7: from script/import_scripts/fluxbb.rb:40:in `execute'
	6: from script/import_scripts/fluxbb.rb:50:in `import_groups'
	5: from script/import_scripts/fluxbb.rb:258:in `mysql_query'
	4: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rack-mini-profiler-2.3.2/lib/patches/db/mysql2/alias_method.rb:22:in `query'
	3: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `query'
	2: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `handle_interrupt'
	1: from /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `block in query'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query': Table 'flux.groups' doesn't exist (Mysql2::Error)

MySQL データベースにテーブルが存在しないようです。まずは MySQL DB にログインして、どのようなテーブルがあるか確認することをお勧めします。スクリプトを修正して動作させる必要があるかもしれません。

「いいね!」 2

はい、手順をすべてご紹介します。

このインポーターは、最新の Discourse バージョンで壊れていますか?

私は discourse/docs/INSTALL.md at main · discourse/discourse · GitHub (別名「Discourse の公式にサポートされている唯一のインストール」) を使用してインストールされた Discourse インスタンスを実行しています。

他のアプローチはセットアップが非常に難しいため、Docker コンテナ内に MariaDB DB をセットアップし、フォーラムダンプをそこにインポートしました。行ったことはすべて cd /var/discourse/ & ./launcher enter app シェル内で行われました。

bundle exec ruby script/import_scripts/fluxbb.rb bbcode-to-md を実行すると、次のエラーが発生します。

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/activerecord-7.0.4.3/lib/active_record/connection_adapters/postgresql_adapter.rb:81:in `rescue in new_client'
: We could not find your database: discourse. Which can be found in the database configuration file located at config/database.yml. (ActiveRecord::NoDatabaseError)

同じシェルで sudo -u postgres psql discourse を実行すると、「discourse」データベースに正常にログインできます。

申し訳ありません、誤解していました。単純なことでした。

スクリプトは discourse ユーザーで実行されるべきもので、コンテナ内で root として実行していたのが間違いでした。

BBコードの一部が変換されていないことを除けば、うまくいったようです。ありがとうございます!

Tests, fixes, and a small (optional) feature to allow a FluxBB config to work by harry-wood · Pull Request #6 · nlalonde/ruby-bbcode-to-md · GitHub は、BBコード変換の修正を含む良いPRのようです。

重大な警告:

このインポーターでは、権限は無視されます。

すべてのフォーラムが公開として投稿されます

モデレーターのみが読み取れるように設定されていたフォーラムは、このインポーターを使用した後に誰でも読み取れるようになります。

「いいね!」 1

インポート後にカテゴリの権限を手動で変更できます。手動で修正するのは、それほど大変な作業ではないでしょう。

権限のインポートをサポートする機能の追加は、手動で行うよりも大変な作業になる可能性が高いです。

「いいね!」 1

ご報告ありがとうございます。ガイドにこの件に関する注意喚起を追加しました。

「いいね!」 2