アップロードにAmazon S3を使用するのをやめましょう

バックアップには多数のディレクトリとサブディレクトリが含まれています。両方のバケットからファイルを再帰的にコピーし、ローカルサーバーの対応する場所に配置する必要があると思います。例えば、両方のバケットにある「1X」と「2X」ディレクトリ内のすべての内容を、ローカルサーバーの「1X」と「2X」ディレクトリにコピーする必要があります。確信はありませんが、そのように思います。

すべてのファイルを正しくコピーしたことを確認していただけますか?

「いいね!」 2

はい、完全に理解しており、相対パスがそのまま維持されるよう確実にしました。

例えば、以前は以下のパスにファイルが存在していたとします:
//bucket1/uploads/original/2x/f/filename.jpg
そして、もう一つは:
//bucket2/uploads/original/1x/a/filename.png

これらは現在、以下のパスにも存在します:
/var/discourse/shared/web_only/uploads/default/original/2x/filename.jpg および ../original/1x/a/filename.png

問題点
バケットの内容をローカルサーバーにコピーする前に、一部の画像がアイコンとしてしか表示されず、ウェブサイト訪問者がそのアイコンをクリックすることで初めて完全な画像を確認できる状態でした。

その後、バケットの内容をすべて(移動ではなく)コピーして、上記のローカルサーバーの場所に配置し(相対パスは維持)、以下のコマンドを実行しました:
discourse remap:oldurl-or-path new-url-or-path

しかし、サイト上で視覚的な変化は何も起こりませんでした。その後、以下のコマンドを実行しました:
rake posts:rebake

すると、画像のアイコンさえも消えてしまい、画像のプレースホルダーの空白部分にマウスカーソルを合わせても、URL やパスが表示されなくなりました。

十分な詳細を記載できたことを願っています。

「いいね!」 1

その場合、以下の手順で問題が解決すると思います。

    ./launcher enter app
    discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
    discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
    rake posts:rebake
「いいね!」 1

ありがとうございます。

ただ、すでに説明した通り、「remap」と「rebake」の操作を行った後では、画像のアイコンさえも消えてしまい(状況が悪化します)。

「いいね!」 1

マッピングを行う際は正しいパスを指定する必要があります。そうでないと破損する可能性があります。以前提供されたサンプル出力から、S3 リンクを一つ手動でマッピングしましたが、問題なく動作しました。

バケットにホストされている画像:

https://bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/original/2X/9/9d8f29892278f164e8ce27a6b58cc8af0760802c.png

ローカルサーバーにホストされている同じ画像:

https://bathindahelper.com/uploads/default/original/2X/9/9d8f29892278f164e8ce27a6b58cc8af0760802c.png

新しいタブで画像を開き、上記の両方の画像のリンクを確認してください。これで動作すると思います。

 ./launcher enter app
  discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
  rake posts:rebake
「いいね!」 1

再度ありがとうございます。

(最初の) 画像を右クリックしたところ、URL バーに表示されたパスが私のバケットのものではありませんでした:

2 番目の画像も同様でした。

私のウェブサイトのサンプル投稿を こちら で確認できます(投稿はヒンディー語ですが、投稿の途中にある画像の小さなアイコンは簡単に見つかるはずです)。完全な画像は、その小さなアイコンをクリックした場合にのみ表示されます。

しかし、リマップして再ビルドすると、このアイコンも完全に消えてしまいます。その結果、訪問者が画像を見る方法がなくなってしまうのです。

「いいね!」 2

以前にキャッシュ用に CloudFront を使用していたようです。ブラウザのキャッシュをクリアして、もう一度お試しください。
CloudFront の設定を行った場合は、それらの設定をすべて元に戻すことをお勧めします。

「いいね!」 2

私のウェブサイトについては、過去約2年間、Cloudflare(編集:CloudFront)や他の CDN は一切関与していません。

メタ上の画像は、おそらく Cloudflare に保存されています。

「いいね!」 1

Cloudflare ではありません。CloudFront です。ブラウザのキャッシュをクリアしましたか?

「いいね!」 2

はい、CloudFront です(すみません)。

はい、クリアしました。さらに、このトピックを Firefox のシークレットモードで開きました。

「いいね!」 1

現在、私も同じ CloudFront リンクが表示されています。あなたのサイトでは AWS CloudFront が有効になっているようです。CloudFront がバケット内の画像をキャッシュしています。CloudFront のディストリビューションを削除する必要があると思います。AWS アカウントにログインして、CloudFront のディストリビューションがアクティブかどうかを確認してください。

「いいね!」 2

こんにちは、CloudFront の件、私たちが誤解していました。実際には、meta discourse が画像をキャッシュしていました。私のミスです。

「いいね!」 1

私は AWS やフロントエンドで CloudFront(または他の CDN)を使ったことはありません。約 2 年前に 1 ヶ月ほど CloudFlare を使用したことがありますが、その後完全に削除しました。
また、AWS で CloudFront を選択したこともありません。そのため、そこにも疑問は生じません。

さらに、私の PC で画像を開くと、AWS バケットのアドレスが表示され、他の CDN は表示されません。

「いいね!」 1

CloudFront について誤解していました。実際には、meta discourse が画像をキャッシュしていました。前の投稿を編集しましたので、ご覧ください。

「いいね!」 2

あなたは画像パスの再マッピング(S3 バケットの URL からローカルサーバーのパスへ)と、その後の再ベイクを提案しているだけです。

しかし前述の通り、私は既にそれを行いましたが、むしろ問題が悪化しました(さらに、再ベイク後には「Restore」も機能せず、元に戻すのが困難です)。

他に役立つアイデアはありますか?

「いいね!」 1

マッピングを再設定する際、以下のパスが同じであることを確認しましたか?

discourse remap //bxyzbucket1.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/
discourse remap //bhdisco.s3.dualstack.ap-south-1.amazonaws.com/uploads/ /uploads/default/

再設定時に指定したパスは何ですか?

以前のスレッドで例を提示済みです。それは機能しました。他に方法があるとは知りません。

「いいね!」 2

できるだけ慎重に、もう一度試してみます。
ただし、裏側で何が起こっているのかを把握できる方法を探していました。少なくともサンプルの投稿 1 つを使って、どの投稿にどのバケットがマッピングされているか、そして自分がどのような状況に陥っているかを確認したかったのです。

とにかく、もう一度試して、ここで結果をお知らせします。改めてありがとうございます。

「いいね!」 1

以前の remap で指定したパスは、以下のコマンドの出力に反映されます。両方のバケットがまだ存在しているため、以前の remap が失敗した可能性があります。いずれにせよ、これからはご自身の判断にお任せします。解決策が見つかることを願っています。幸運を祈ります。

./launcher enter app
rails c
Upload.all.sample(2000).pluck(:url)

ありがとうございます。

「いいね!」 2

私より詳しいわけではありませんが、実際にやってみました。@Pravi の助けを借りて無事に完了しました。

S3 アップロードからバニラ状態に戻すために必要な手順

これは簡単ではありません。テキストやリンクには細心の注意を払ってください。失敗すると整理するのが大変なことになります。ただし、十分に実行可能です。

ステップ 1 - S3 バケットから public/uploads/default フォルダへファイルをコピーする

まず、アプリコンテナ内で AWS CLI をインストールします。

cd /var/discourse
./launcher enter app
sudo apt install awscli

S3 の ID とパスワードで AWS を設定します(通常は簡単です)。

aws configure

その後、aws を使ってバケットの内容をすべて public/uploads/default/ にコピーします。

aws s3 sync s3://my-bucket-name/ public/uploads/default/

ステップ 2 - S3 URL の再マッピング

これは、フォーラム上の画像を見つけて URL を検査するのが最も簡単です。実際のファイル名までのすべての部分(最後の / も含む)が必要です。

discourse remap //the-long-url-in-your-images-until-the-filename /uploads/default/

ステップ 3 - ポストの再構築とアプリの再ビルド

rake posts:rebake
exit
./launcher rebuild app

ステップ 4 - S3 の無効化

  1. 設定(または app.yml で設定している場合はそちら)で S3 アップロードをオフにします。CDN を使用していた場合は、設定からのリンクも削除してください(そうしないと実際にはオフになりません)。
  2. コンテナをオフにします。私はまずバックアップとしてコンテンツを新しいコンテナに移動させるという手順で行いました。

お疲れ様でした!完了です。現時点では問題には遭遇していません。ぜひ試してみてください!

「いいね!」 10

よくできました!それらは最終的に私の成功に導いてくれた手順だと信じていますが、うまくいかなかったリマップもたくさん試しました!正式な手順がまとまっていて素晴らしいですね。

「いいね!」 4