XenForoからの添付ファイルのインポートに関する問題

こんにちは皆様、

XenForo のデータベースを、1,500 人のメンバーと約 75,000 件の投稿を含むものを、Discourse が動作している新しいサーバーへ正常に移行しました。

添付ファイルについてご質問があります。スクリプトを確認したところ、添付ファイルフォルダが存在する場合にインポートが実行されるようです。古いサーバーからの添付ファイルをどこに配置すべきかご教示ください:

a) サーバーの Docker 部分のどこか
b) 元の場所 /var/discourse/shared/standalone/tmp/attachments

どちらが正解でしょうか?

「いいね!」 1

パスがわかる人いますか?

「いいね!」 1

ファイルを、インポートを実行するマシンからアクセス可能な任意の場所に配置し、そのパスを以下のように指定してください:

  ATTACHMENT_DIR = '/tmp/attachments'

Docker コンテナ内で実行している場合、var/discourse/shared/standalone/tmp/attachments 以下に配置したのであれば、パスには /shared/tmp/attachments を使用します。コンテナ内でファイルの存在を確認することで、これを検証できます。

「いいね!」 2

わかりました、Jay さん、情報をありがとうございます。今回は添付ファイルフォルダの設定を含めてクリーンインストールを行います。その後、/shared/tmp/attachments に配置し、結果をこちらで報告します。

もう一つ quick な質問ですが、アカウントのパスワードをインポートする方法はありますか?

問題の場所を確認していただけますか?

root@my-app:/var/www/discourse# RAILS_ENV=production bundle exec ruby script/import_scripts/xenforo.rb
既存のグループを読み込んでいます...
既存のユーザーを読み込んでいます...
既存のカテゴリを読み込んでいます...
既存の投稿を読み込んでいます...
既存のトピックを読み込んでいます...

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

カテゴリをインポート中...
       23 / 23 (100.0%)  [326682 項目/分]
トピックと投稿を作成中
       74 / 74752 (  0.1%)  [99817 項目/分]  トレースバック (最新の呼び出し先から):
        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:869:in `batches'
        13: from /var/www/discourse/script/import_scripts/base.rb:869:in `loop'
        12: from /var/www/discourse/script/import_scripts/base.rb:870: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:490:in `create_posts'
         9: from /var/www/discourse/script/import_scripts/base.rb:490:in `each'
         8: from /var/www/discourse/script/import_scripts/base.rb:491: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.6.0/set.rb:338:in `each'
         3: from /usr/local/lib/ruby/2.6.0/set.rb:338:in `each_key'
         2: from script/import_scripts/xenforo.rb:326:in `block in process_xf_attachments'
         1: from /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/string/filters.rb:22:in `squish!'
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/string/filters.rb:22:in `gsub!': 凍結された文字列を変更できません (FrozenError)
root@my-app:/var/www/discourse#

今回は添付ファイルを以下に配置しました: var/discourse/shared/standalone/tmp/attachments

見つかりました……問題は、インポート用の添付ファイルを含むフォルダが、Docker アプリ内のパス /var/www/discourse/…/tmp/attachments に必ず存在しなければならないことです。

今は問題なくスクリプトが実行中で、約1.5時間で完了する見込みです。

追記:どうやら添付ファイルのインポートが再び機能していないようです。現在インポートは78%まで進んでいますが、画像や添付ファイルがあった投稿すべてに [ATTACH]9788[/ATTACH] という表示が残っています。タグ内の番号とアップロードされたファイルの数が一致しておらず、次は [ATTACH]9789[/ATTACH] となっています……

この件についてご助言いただければ幸いです :confused:

「いいね!」 1

attachment_dir を正しく設定する前に投稿をインポートした場合、すべての投稿を削除してインポートをやり直す必要があります。

残念ながら、現在はインポートが完了しており、ログに添付ファイルに関する情報が表示されていません。

インポートスクリプトを実行した際、添付ファイルのディレクトリが存在しなかった場合、添付ファイルはスキップされます。

それは行っていません……添付ファイルをそのままにして、新規インポートを実行しました。

ここではお手伝いできないと思います。予算がある場合は、Redirecting… をご覧ください。

最後のアドバイスとして、添付ファイルはスクリプトが探せる場所になく、すべてを削除して最初からやり直す必要があると確信しています。

スクリプトを再度実行する前に、フォルダ内から以下のコマンドを入力してください。

 ls /tmp/attachments

/tmp/attachments は、次の行で指定したパスです。

  ATTACHMENT_DIR = '/tmp/attachments'

もし添付ファイルがリストされない場合は、それらがどこにあるのかを特定するために引き続き試行してください。

「いいね!」 2

XenForo の添付ファイルを新しいサーバーのどこに配置すればよいか、スクリプトが確実に検出できるよう、正確な場所を教えてください。

だれかいますか?

今、5 回目の新規インポートをしています……もう疲れました…… :roll_eyes:

Xenforo の添付ファイルを特定の順序で並べる必要がありますか、それとも構造と /tmp/attachments を単にコピー&ペーストすればよいのでしょうか?

私は現在、新しい VM 上でインストールを行っており、スナップショットを利用しているため、設定を素早く変更して移行を再度開始できます。

昨日、Xenforo の添付ファイルフォルダを配置しました。その構造は、attachments という名前のメインフォルダの中に、0 から 9 までの名前の 9 つのサブフォルダがあり、それぞれのフォルダ内には約 600〜700 個の添付ファイル(.jpg)が入っています。このフォルダを var/discourse/shared/standalone/tmp/attachments に配置し、xenforo.rb スクリプトを変更して以下のように設定しました。

ATTACHMENT_DIR = '/shared/tmp/attachments'

ls /tmp/attachments でテストしたところ、正しい構造が表示されましたが、前回と同じエラーが発生しました。

トピックと投稿の作成中
74 / 74752 ( 0.1%) [99817 項目/分] 例外発生(バックトレース):
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:869:in batches' 13: from /var/www/discourse/script/import_scripts/base.rb:869:in loop’
12: from /var/www/discourse/script/import_scripts/base.rb:870: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:490:in create_posts' 9: from /var/www/discourse/script/import_scripts/base.rb:490:in each’
8: from /var/www/discourse/script/import_scripts/base.rb:491: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.6.0/set.rb:338:in each' 3: from /usr/local/lib/ruby/2.6.0/set.rb:338:in each_key’
2: from script/import_scripts/xenforo.rb:326:in block in process_xf_attachments' 1: from /usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/string/filters.rb:22:in squish!’
/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/string/filters.rb:22:in gsub!': can't modify frozen String (FrozenError) root@my-app:/var/www/discourse#プレフォーマットされたテキスト`

2019-11-15T23:00:00Z

gsub! 文字列の ! を削除しました。場所は以下の通りです。

/usr/local/lib/ruby/gems/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/string/filters.rb

これでインポートスクリプトは停止せず、添付ファイルに関する以下の情報を表示して処理を継続しました。

いずれにせよ、例えば最後の行は以下の通りです。

Could not find file /shared/tmp/attachments//2/2485-c3da9f6ee1e33d3ebf418c5dea1f9e8a.data. Skipping attachment id 2485

そのパスには確かにファイルが存在しますが、.data ではなく .JPG 拡張子になっています。

ご協力をよろしくお願いいたします。

2019-11-15T23:00:00Z

スクリプトにバグがあり、それを発見して修正しました。これで添付ファイルのインポートに成功しています。

「いいね!」 1