SMF2フォーラムをDiscourseに移行する

キャラクターが間違っている件について、Duffield Ocean にチケットを立ててみてはいかがでしょうか?

PuTTY などの SSH クライアント、または Windows サブシステム用 Linux(WSL)の一部である新しいシェルを使用する方法があります(私が最後に使った Windows のバージョンは、バージョン記述に年号が付けられていたので、参考にはならないかもしれません)。Mac をお使いの場合は、ターミナルを開いて ssh を使用してください。

データベースが大きい場合、読み込みに時間がかかります。完了するまで出力はなく、新しいプロンプトが表示されるだけです。正しく動作していたのではないかと推測します。

「いいね!」 2

@pfaffman さん、ありがとうございます。それについては、相手に連絡を取ろうと思います。

別の SSH クライアントを試して、よりうまくいくか確認してみます。

データベースはそれほど大きくありません。1 時間ほど放置していますが、まだ同じ場所にあります。サーバーの CPU を確認したところ、ほぼアイドル状態です。

「いいね!」 1

はい、それが問題でした!@pfaffman さん、ありがとうございます。再び進展しています…

別の解決策として、インポートを実行しているドロプレットから直接データベースにアクセスし、ローカルデータベースを設けるステップを省略する方法があります。

1 時間経過している場合は、処理が行われていない可能性が高いです。以下のようなコマンドを試してみてください。

 cat database.sql | mysql
「いいね!」 1

一歩進んで一歩引く。

Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL 環境変数の設定が必要です。"; exit 1; fi が失敗しました。戻り値: #<Process::Status: pid 1187 exit 1>

私は letsencrypt をインストールしていなかったので、インストールしました。

「Discourse ホストとコンテナのインポート準備」の段階で不足していたのは、LETSENCRYPT_ACCOUNT_EMAIL の環境変数行のコメントアウトを外し、メールアドレスを入力する必要がある点です。これでこのエラーを回避できました。

引き続き、現在は最終的なインポート段階です。インポートコンテナに入り、インポートスクリプトを実行すると、即座に以下のように終了します:

Traceback (most recent call last):
        1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)

多くのウェブ検索を試みましたが、まだ解決策は見つかりません。

編集:これはコンテナ内に MySQL がインストールされていないためではないかと思われます。gem install mysql2を試してみましたが、以下のようにエラーが返ってきました:

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.

編集2:
ようやく mysql2 のインストールに成功しました。まず開発ツールをインストールする必要がありましたが、推奨されたソースは利用できませんでした。そのため、以下のコマンドを実行しました:

sudo apt-get install default-libmysqlclient-dev

その後、以下のコマンドで mysql2 をインストールできました:

gem install mysql2

しかし、同じエラーが発生しました。そのため、スクリプト内のその require 文をコメントアウトして、何が起きるか試してみました。すると新しいエラーが表示されました:

Traceback (most recent call last):
        6: from script/import_scripts/smf2.rb:627:in `<main>'
        5: from script/import_scripts/smf2.rb:19:in `run'
        4: from script/import_scripts/smf2.rb:447:in `parse!'
        3: from script/import_scripts/smf2.rb:502:in `parser'
        2: from script/import_scripts/smf2.rb:502:in `new'
        1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)

これについて調査したところ、古い Ruby のバグであることがわかりましたが、それはかなり前に修正されているため、再び行き詰まっています。

smf2.rb を開き、1 行目または 2 行目にある Frozen string を true から false、あるいはその逆に変更してください。それ以降は正常に動作するはずです。

「いいね!」 2

@Paracelsus さん、ありがとうございます!これで解決しました。true から false に変更しました。

一歩前進です!

編集:
奇妙なエラーが発生し、間違った IP を指しているように見えました。Settings.php に間違ったパスワードが入っていたのが原因でした。これも修正済みです。

次に、以下のエラーを解決中です:

Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:627:in `<main>'
        6: from script/import_scripts/smf2.rb:28:in `run'
        5: from script/import_scripts/smf2.rb:28:in `new'
        4: from script/import_scripts/smf2.rb:62:in `initialize'
        3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: from script/import_scripts/smf2.rb:274:in `new'
        1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

スクリプト調整ファイルのこの行が、この問題を解決するためのものであると推測しています:

ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

これはインポートコンテナ内のどこかに追加すべきでしょうか?

なるほど、上記の問題を解決しました。これは最新の MySQL バージョンにおける問題で、古いネイティブパスワード方式がサポートされなくなっているためです。最も簡単な解決策は、この処理を MySQL 5.7 で実行することです。ステップ 3 を以下のように変更してください。

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql

以下のように変更します。

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7

これで問題なく動作するはずです。私のインポート処理がついに実行されました。

「いいね!」 2

新しい質問です:ユーザーのアバターがインポートできないようです。この状態で正しいのでしょうか?

SMF の標準フォルダではなく、カスタムフォルダにリサイズが必要な画像を保存しているのですが、これが原因でしょうか?

それ以外は、これまでのところ順調です。このガイドは素晴らしく、データベースの増分インポートもうまく機能しています :+1:

「いいね!」 2

特に追加の手順なしにそのまま移行できました。SMF がアバターをどこに保存しているかは、現時点ではっきりとはわかりません。添付ファイルも移行しましたか?私は SQL データベースと添付ファイルのみをインポートしたので、おそらくそこにあると思います。

はい、それらは存在していましたが、アバターを別のフォルダに移動させてしまい、インポート時にユーザーと一致させるために使用するアバターフォルダへのコピーを忘れていました。問題解決です(インポートをやり直す必要がありましたが)。

さて、新しい問題です…禁止されたユーザーがインポートされた際、停止状態ではなく無効状態として表示されてしまいます。停止状態として表示させる方法について、何かご存知でしょうか?

「いいね!」 1

最新の SMF v2.0.17 の v2.50 beta2 を使用していますが、現在の templates/import/mysql-dep.template.yml の影響により、生成される smf2.rb が異なります。

ステップ 4 で説明されているように、「quote =」を現在の反復処理に置き換えると以下のようになります:

quote = +“\n[quote="#{params[‘author’]}”

さらに、以下のような記述はありません:

それでも、インポートを実行しましたが、エラー「IGNORE_BBCODE のことですか?IgnoreUser を意味しますか」で停止してしまいました。
申し訳ありませんが、トレースバックのスクリーンショットを撮るべきでした。しかし、私の記憶では上記の通りです。
何かご存知でしょうか?
ありがとうございます。

最近、このスクリプトを更新しました。確認します。

「いいね!」 1

どうもありがとうございます!もし最初からやり直す場合、すでにインポートしたデータ(ユーザーやカテゴリなど)は上書きされてしまいますか?
よろしくお願いいたします!
G.

一般的にはいいえです。インポートスクリプトは、中断した場所から再開するよう巧妙に設計されています!

「いいね!」 1

@tradenet はここで修正されました:

ご迷惑をおかけして申し訳ありません!

すべてのチェックが完了次第、tests-passed で利用可能になります。

「いいね!」 3

ご丁寧にお気遣いいただき、ありがとうございます。
G.

「いいね!」 2

SMF の古い URL は Discourse へ移行した後にリンク切れになりますか?

いいえ、インポーターは旧URLと一致するパーマリンクを作成し、それらを新しいパスにリダイレクトします。