このドキュメントは、以下の別の SMF2 ガイドに置き換えられました: Migrate an SMF2 forum to Discourse
私たちは、愛着のある SMF2 フォーラムを Discourse に移行したくてなりませんでした。メンバーは 1000 人以上、トピックは約 2000 件、投稿数は約 2 万件あります。
SMF2 では、投票も添付ファイルも使っていませんでした——実際、アバターを持っている人さえも全員ではありませんでした。ただし、一部の投稿では「高度な」BBCode に大きく依存していました。
以下に、私たちがどのようにこれを成し遂げたかを示します。
前提条件
Discourse を いつもの方法 でインストールしてください。
リスト、サイズ、色などを最初から処理できるように、Discourse BBCode プラグイン を追加しました。
SMF2 の MySQL データベースにリモート接続できない場合は、ダンプからデータを一時 Docker コンテナにインポートする必要があります。
データベースがリモート接続を受け入れている場合、または同じホストで実行されている場合は、このステップをスキップできます。
一時 Docker MySQL コンテナ
データベースをダンプします:
cd /tmp/
mysqldump –u[ユーザー名] –p[パスワード] [データベース名] > sqldump.sql
一時 Docker MySQL コンテナを作成します:
cd /tmp/
docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v "$PWD":/backup --name=mysql mysql
次に、コンテナに入ります:
docker exec -it mysql bash
データベースダンプをインポートします:
mysql -uuser -ppass db < /backup/sqldump.sql
以下のエラーが表示された場合:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
コンテナが完全に起動するまで 1 分ほどお待ちください。
データベースの互換性のため、一時データベースの認証プラグインを変更する必要がありましたが、状況は異なる可能性があります:
mysql -uuser -ppass db
このクエリを使用します:
ALTER USER user
IDENTIFIED WITH mysql_native_password
BY 'pass';
その後、ログアウトして MySQL インスタンスの IP アドレスを確認します:
exit
docker inspect mysql | grep IPAddress
これで、SMF2 データベースの動作するコピーが完成しました。
一時 Discourse インポートコンテナ
デフォルトの app.yml コンテナをベースにして、「import」という名前の新しいコンテナを作成しましょう:
cd /var/discourse
cp containers/app.yml containers/import.yml
nano containers/import.yml
新しいインポートコンテナに mysql-dep テンプレートを追加します:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
## Lets Encrypt (https) を追加する場合は、この 2 行のコメントを外してください
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
- "templates/import/mysql-dep.template.yml"
次に、以下を実行します:
/var/discourse/launcher stop app
/var/discourse/launcher rebuild import
Discourse へのインポート
インポートコンテナが再構築されたら、最新の調整 のためにコンテナに入ります:
/var/discourse/launcher enter import
cd /var/www/discourse/ # スクリプトは正確にこのディレクトリから起動する必要がありますが、自動的にそこに移動しているはずです
su discourse -c "bundle exec ruby script/import_scripts/smf2.rb -h 172.17.0.3 -u user -p pass -d db -f smf_ -t Europe/Paris"
- -h: SMF2 MySQL データベースのホスト名(ここでは Docker コンテナの IP)
- -u: SMF2 MySQL ユーザー
- -p: SMF2 MySQL パスワード
- -d: SMF2 MySQL データベース
- -f: SMF2 テーブルのプレフィックス
- -t: SMF2 のタイムゾーン
クリーンアップ
作成した場合は、一時 MySQL Docker コンテナを停止して削除します:
docker stop mysql
docker rmi mysql
Discourse の「import」コンテナを停止し、launcher を使用してクリーンアップします:
/var/discourse/launcher destroy import
/var/discourse/launcher cleanup
実際、メインのコンテナを削除してしまいました
問題ありません:
/var/discourse/launcher rebuild app
インポート後の Discourse 設定
デフォルトの設定により、インポートされた投稿や権限に問題が発生する可能性があります。Discourse の設定パネルから、必要に応じて以下を変更してください:
- トピックタイトルの最小長さ: 3 に変更しました——タイトルが短すぎるトピックは操作が非常に困難でした(移動できないなど)。
- タイトルの整形: 無効にしました——タイトルが大文字で始まらないトピックは操作が非常に困難でした(移動できないなど)。
参考文献
- bbpress インポートスクリプト(または MySQL 依存の他のインポートスクリプト)の使い方 (lead4good, 2017 年 5 月)
- “Authentication plugin ‘caching_sha2_password’ cannot be loaded” (meow, 2018 年 4 月)