S3からローカルへのアップロード移動の混乱をどう制御するか

4〜5年使用した後、ついに私の非常に小さなローカルウェブサイトのために、AWS S3バケットからローカルサーバーにアップロードを戻すことにしました。
知識が限られているため、友人に非常にリーズナブルな金額でこの仕事を依頼しました。彼はサイトをローカルアップロード用に設定しましたが、何らかの理由で3000枚の画像のうち約半分、つまり50%がソースから破損してしまいました。友人は私に何も請求せず、11年2025月XNUMX日に彼にコントロールを渡す前に作成されたバックアップにサイトを戻すように言いました。

とにかく、私は約1ヶ月間怠惰になり、元に戻しませんでした。ディスコースヘルパーボット/ChatGpt AIボットの助けを借りて物事を修正することにしたまで。そして、Ubuntuラップトップ上に古いウェブサイトの別のバージョンをローカルに作成しました。

元のドメイン名の前に「t.」を付けるだけで、ラップトップ上に元のウェブサイトのインスタンスを作成することに成功しました。この(ステージングサイトと呼ばれる)は私にとって完全に機能していますが、アクティビティは11年2025月XNUMX日までです。

そして、すべてのデータは最新ですが、多くの投稿で画像が欠落している本番ウェブサイト。

「移行または欠落している画像への接続を再接続するための多くのRakeタスクを試しましたが、成功しませんでした。」

約1ヶ月間頭を悩ませた結果、結論はこうです。ステージングと本番の生の投稿は同じです。
しかし、調理された投稿は異なります。つまり、本番ウェブサイトのデータベーステーブルは、サーバー上にある実際の物理画像への接続をいくつか欠いている可能性があります。

また、その接続がないと、「孤立した」画像はサーバーから自動的に削除されることにも気づきました。しかし幸いなことに、ステージングまたはS3バケットから本番サーバーにrsyncで再度コピーしました。

「最終的な問題は、ChatGptの言葉を借りれば、ステージングサーバーには、(短い)生のURLとの関連がない最終的な調理済みバージョンがあるか、または本番環境では最終的な調理済みバージョンURLが画像に欠けており、それらの画像の正しいURLを取得できず、「透明な」プレースホルダーにフォールバックしているかのどちらかです。」

そしてChatGptは、ステージング投稿の調理済みバージョンを本番の調理済みバージョンにコピーするように提案していますが、これは私にとってあまり良い考えではないようです。

ChatGPTからの正確な記述で、現状は以下の通りです。

  • ステージングと本番の両方で、post.raw は同一であり、upload://... 参照が含まれています。
  • ステージングでは画像が表示されますが、Post.find(12849).uploads をクエリしても結果が返りません。これは、ステージングでさえ、これらのファイルに対する**uploads または post_uploads テーブルのエントリが存在しない**ことを意味します。
  • そのため、ステージングで画像が表示されるのは、移行前の調理済みHTMLに完全な /uploads/default/original/... リンクが含まれているためです。
  • しかし、本番環境では移行後に再調理されたため、同じ生のコンテンツは解決に失敗し、デフォルトで transparent.png プレースホルダーが表示されます。

:white_check_mark: アップロードファイルはディスク上にまだ存在します

  • 画像ファイル(欠落しているアップロード用を含む)は、ステージングと本番の両方の /var/www/discourse/public/uploads/default/original/ の下にまだ存在しています。しかし、Discourseは uploads エントリが欠落しているため、それらを解決できなくなっています。

簡単な方法は、Enable hidden setting to include S3 uploads in the backups の設定をオンにしてバックアップを作成し、s3 が設定されていないサーバーに復元することでした(古いサーバーを壊さないように、何か問題が発生した場合に備えて、新しいサーバーで行うことをお勧めします)。しかし、本番サイトも壊れているようなので、それはおそらく全く役に立たないでしょう。

Uploads テーブルを複数 S3 パスが含まれるように台無しにしてしまった場合、作業ははるかに困難になります。

ChatGPT の代わりに、https://ask.discourse.com/ をお勧めします。少なくとも Discourse については知っていますが、おそらくあまり役に立たないでしょう。

Uploads.pluck(:url) を見て、何があるか確認することをお勧めします。

「いいね!」 3