s3への移行が失敗しました

比較的トラフィックの多いサイトでアップロードをS3に移行しようとしています。
すべて計画通りに進みますが、rake uploads:migrate_to_s3 を実行すると、次のエラーが表示されます。

データベース内のURLを更新中...
古い最適化された画像を削除中...
ライトボックスを含むすべての投稿にリベイクのフラグを立てています...
2023 件の投稿にリベイクのフラグが立てられました
rake が中止されました!
FileStore::ToS3MigrationError: 9629 件中 1 件のアップロードが S3 に移行されていません。db 'default' の S3 移行に失敗しました。
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in `raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:79:in `migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:373:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:66:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:123:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:102:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:80:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/rails_multisite-4.0.0/lib/rails_multisite/connection_management.rb:90:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:100:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:96:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_to_s3
(フルトレースを表示するには、--trace オプションを付けてタスクを実行してください)

特にこの行 FileStore::ToS3MigrationError: 1 of 9629 uploads are not migrated to S3. S3 migration failed for db 'default'. が気になりました。
これは、問題のあるファイルが 1 つあり、それが原因で rake タスク全体が失敗しているということでしょうか?問題の原因となっているファイルを見つけて、削除して、残りのタスクをスムーズに完了させる方法はありますか?

「いいね!」 1

アップデート情報:
サイトは正常に読み込まれているようで、見たところ、アップロードされた画像はCDNから提供されています。
すべてのアップロードのローカルコピーはサーバー上にまだ存在します。これは、移行が失敗としてマークされているためだと思われます。
もし役立つようでしたら、rake uploads:s3_migration_status の出力を以下に示します。

# rake uploads:s3_migration_status
9630件中1件のアップロードがS3に移行されていません。'default'データベースのS3移行に失敗しました。
19件の投稿が新しいS3アップロードURLにリマップされていません。'default'データベースのS3移行に失敗しました。
リベイクが必要な投稿はありません。
サイトは移行の準備ができていません。

Admin > Logs > Error Logs でどのファイルでエラーが発生したかの参照が見つかるかもしれません。

それでも解決しない場合は、cookedyourdomain/uploads/ を含む投稿をデータベースで検索すると、移行ステータスで言及されている 19 件の投稿のリストが得られると思います。最悪の場合、それらを個別に確認し、S3 内のアップロードと比較することができます。

以下のようなコマンドです。

rails c
Post.where("cooked like '%discourse.example.com/uploads/%'")
「いいね!」 1

こんにちは、@Simon_Manning さん

ご提案いただいた方法を試しましたが、残念ながらエラーログに関連するものは何も見つかりませんでした。
Failed to optimize image: unknown reason のようなエントリはありますが、それ以上の情報は得られません。

ご提案いただいたクエリも試しましたが、多くの投稿が結果として表示されました。しかし、それらの投稿を実際に見てみると、oneboxプレビューから多くのサムネイルが含まれていました。それらのサムネイルを新しいタブで開こうとすると、CDNから読み込まれているようです。

19件中18件、あるいはアップロードが失敗した1件が複数のアップロードを含む投稿であった場合、19件すべてでそのような結果になると予想されます。

より簡単な方法としては、クエリ結果からすべてのファイル名(例: f8a2d9381889b8693db2777acac566bd7b134fa5.png)を抽出し、S3で検索することです。理論上、1つだけ見つからないはずです。デリバティブは無視して、パスに/originals/が含まれるものだけを探してください。

少し手間はかかりますが、そのクエリが19件の投稿のみを選択したのであれば、それほど時間はかからないはずです。

「いいね!」 2

犯人を見つけました。どうすればいいですか?

私にとって論理的に思えることが、最善の解決策ではないかもしれません。
考えられる選択肢は以下の通りです。

  1. 問題のある投稿からファイルの参照を削除する
  2. サーバーからファイルを削除する
  3. ファイルリンクを汎用的なものに再マッピングする

あるいは、全く間違った考え方をしているのでしょうか?

アップロードを正常に完了させるための明白な解決策がない場合は、オプション1または3のいずれかが良い方法のように思われます。オプション2は、おそらくDiscourseに任せ、具体的には孤立したアップロードをクリーンアップするジョブに任せることになります。このジョブの間隔は、「孤立したアップロードのクリーンアップ猶予期間(時間)」設定で制御されます。

ただし、削除される前にファイルを取得しておくと良いかもしれません。機密データが含まれていない場合は、移行中にアップロードできない理由をテストするのに役立つ可能性があります。

ファイルを削除して移行を完了した後(そして失敗したファイルをダウンロードした後)に試せる別の方法として、投稿を再度編集してファイルを元に戻すことが挙げられます。S3へのアップロード全体が失敗するのか、それとも移行タスク中のみ失敗するのかを知ることができるのは興味深いでしょう。

64件の投稿で同じエラーが発生しました。80Kファイルでは見つけられません…

ローカルファイルを削除するとどうなりますか(ほとんどはすでに移行済みです)?

ファイルが移行されたことは確認しましたが、同じエラーが発生しました。

何か提案はありますか?アップロードはS3で行われ、正常に動作しますが、タスク「S3への移行」が失敗します。

もしその64件のファイルを失っても構わないのであれば、私が行ったのは、この同じレークタスクが失敗し続けたときに、それを編集して、1件ではなく100件のエラーがあった場合にのみエラーを発生させるようにすることでした。

それで構いません。
タスクを編集するにはどうすればよいですか?

まず、SKIP_FAILED=1 rake uploads:migrate_to_s3 を実行してみてください。

それでもうまくいかない場合は、ここの行を編集して、もう一度試してください。

SKIP_FAILED=100 rake uploads:migrate_to_s3 を使用して試しました

=> 0 個のファイル

  • S3 ファイルをリストしています
    … .. => 81070 個のファイル
  • ファイルを S3 に同期しています

データベースの URL を更新しています…
古い最適化された画像を削除しています…
ライトボックスを含むすべての投稿に再ベイクのフラグを立てています…
54453 件の投稿が再ベイクのフラグを立てられました
53 件の投稿が新しい S3 アップロード URL にリマップされていません。S3 移行は DB ‘default’ で失敗しました。

変更されたファイルを Discourse スクリプトに配置する方法がわかりませんでした

私の勘違いかもしれませんが、SKIP_FAILED をオンにするには、金額を指定するのではなく SKIP_FAILED=1 を実行する必要があると思います。

「いいね!」 1

このコマンドで試しました。…同じです
結果

残念ながら、それは残念です。@Falcoの別の提案として、rakeタスクを編集するというものがありますが、残念ながらその方法がわかりませんし、検索しても説明が見つかりません。:slightly_smiling_face:

誰か他の人が助けてくれることを願っていますか?:crossed_fingers:

「いいね!」 1

/shared フォルダに myscript.rb を作成しましたが、実行できません。

他に何か提案はありますか? @vulkanino 同様の problemas を抱えていたことに気づきました