DISCOURSE_S3_CDN_URL の定義:S3 CDN URL 内のアセットへのリンク

ここで設定している変数は infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub で確認できます。

S3/CDN に関連して設定している変数は以下の通りです。

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

DISCOURSE_S3_BUCKETDISCOURSE_S3_UPLOAD_BUCKET および DISCOURSE_S3_BACKUP_BUCKET の導入により廃止されたと考えられます。代わりにこれらを設定してください。

私はそう想定していましたが、DISCOURSE_S3_UPLOAD_BUCKETDISCOURSE_S3_BUCKET の両方を設定しない限り、進展がありません。上記のコードスニペットをご覧いただければわかる通り、use_s3?s3_upload_bucket ではなく s3_bucket を参照しています。

DISCOURSE_BACKUP_BUCKET を設定しても、私の知る限りこの問題は解決しません。

両方のバケット環境変数を設定すると、一歩前進しますが、今度は新しい問題に遭遇しました。Discourse が私の S3 CDN URL を無視し、ベースパスからアセットを読み込もうとしているのです。これにより CSP エラーが発生しています。Content Security Policy には、S3 CDN のアセットパスのみが含まれているためです。

DISCOURSE_BACKUP_BUCKET ではなく、DISCOURSE_S3_BACKUP_BUCKET とする必要があります。それ以外は、すべての変数を設定すれば、2 つの Cloudfront ディストリビューションで動作するはずです。当社の設定をご覧いただければわかる通り、DISCOURSE_S3_BUCKET は定義していません。

リベイクも必要かどうかはわかりません。

@Falco 記憶が正しければ、この点が非常に直感的でないと感じさせた要因の一つは、DISCOURSE_S3_CDN_URL を環境変数または GlobalSetting として設定する場合と、SiteSetting として設定する場合で動作が異なる点です。もしかしたら、あなたの howto でこの点に注意を払いたいかもしれません。

はい、すみません、前の投稿のタイプミスでした。DISCOURSE_S3_BACKUP_BUCKET は、私の環境では GlobalSettings3_bucket を設定しません。DISCOURSE_S3_BUCKET を設定せずに、どのようにその rake タスクを実行しているのか分かりません。

余談ですが、本当に助けていただきありがとうございます。これはあなたが解決する必要のない問題だと理解しています。ありがとうございます。

ご心配なく、問題ありません。付け加えるのを忘れていましたが、app.yml ファイルにも USE_DB_S3_CONFIG: true を定義しています。infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

おっしゃる通りだと思います。これにより S3 バケットの定義方法の動作が変更されるため(discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub

その設定が解決策になるか確認してみてください。

@eatcodetravel さん、素晴らしい投稿をありがとうございます。

私もあなたのように CloudFront を設定しようとしています。

アセットフォルダは S3 バケットにアップロードする必要がありますか、それとも自動的にアップロードされますか?

Discourse のアップデート後はどうなりますか?自動的にアップロードされない場合は、テーマを再度アップロードする必要がありますか?

ありがとうございます。

もちろん。ruby def ensure_s3_configured! unless GlobalSetting.use_s3? || use_db_s3_config STDERR.puts "ERROR: Ensure S3 is configured in config/discourse.conf or environment vars" exit 1 end end use_db_s3_config は、追加の変数を設定する必要からあなたを守っています。これは global_setting.rb におけるバグに違いありません。なぜなら、DISCOURSE_S3_UPLOAD_BUCKET を設定するだけで済むはずだからです。ただし、それが DISCOURSE_S3_BUCKET と異なる場合を除きますが、後者が廃止される予定であるという点では、あなたが正しいと思います。

global_setting.rb のバグとは別に、すべての変数を宣言し DISCOURSE_ENABLE_S3_UPLOADS を true に設定しているにもかかわらず、Discourse が通常のアセット場所を探し、S3 CDN 上のアセットを探していないという問題が依然として発生しています。

bundle exec rake uploads:migrate_to_s3 というタスクがあります。バケットの設定が完了したら、そのタスクを実行してアップロードデータを S3 へ移行してください。最近の数ヶ月で S3/CDN が変更されており、ドキュメントが最新ではないため、何か問題が発生した場合に備えてバックアップを取得し、準備を整えておくことをお勧めします。

私が初めてこれを有効化した際、すべてを確認している間に少しダウンタイムが発生しました。

おそらく、DISCOURSE_CDN_URL が不足しているためでしょう。私たちの設定では以下のようにしています。

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # サーバーを指します
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # S3 バケットを指します

スタイルシートはサーバーから取得されるため DISCOURSE_CDN_URL を使用します。JavaScript は S3 バケットにアップロードされ、DISCOURSE_SDN_CDN_URL を使用します。@Falco がここで詳しく説明してくれました。

はい、それを見ました。DISCOURSE_CDN_URL を設定しましたが、同じ問題が発生しています。ただ、疲れもあって、いろいろいじっている間に何か見落としているかもしれません。明日また続けます。ご支援ありがとうございます。

これは、画像とアセットを S3 にアップロードする際、両方ともアップロードされるのでしょうか?また、CloudFront の URL を使うべきか、それとも S3 のみで十分でしょうか?ご協力ありがとうございます。

bundle exec rake uploads:migrate_to_s3を実行すると、S3への添付ファイルのアップロードのみが行われます。このタスクは一度だけ実行する必要があります。S3を有効化すると、新しいアップロードはS3バケットに保存されます。

アセットをアップロードするには、bundle exec rake s3:upload_assetsを使用してください。これは再ビルドまたはアップグレードのたびに実行する必要があります。

あなたが述べたことを実行しました。S3 へのアップロード(画像など)は成功しましたが、assets については以下のエラーが発生します。

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

両方を設定しました。

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # これはサーバーを指します
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # これは S3 バケットを指します

おそらく、USE_DB_S3_CONFIG: true に関連していると思われます。その変数を設定して動作を確認してみてください。

以下は、S3/CDN に関連して私が設定したすべての変数です。

はい、ありがとうございます :slightly_smiling_face:。これで問題が解決しました。

興味深い問題が発生しています。Discourse が誤ったパスからアセットファイルにアクセスしようとしています。具体的には、brotli_asset パスからアクセスを試みていますが、S3 バケットにはそのパスが存在しません。

また、JavaScript ファイルやスタイルシートファイルも CDN URL からアクセスしようとしていますが、これらもバケットには存在しません。

@ufukayyildiz ご質問の答えは、このスレッドにすべて含まれていると思います。私もまさに今、同じセットアップを行いました。

簡単に言うと、アセットをプリコンパイルしたら、それをアップロードする必要があります。

待ってください。
一つ理解できないことがあります。

なぜこのデータを ENV に設定する必要があるのでしょうか?

私の例をお見せします。

管理パネルで S3 関連の設定を行うと、すべて正常に動作し、すべてのデータが S3 にアップロードされます。ENV には何も設定していません。これは問題でしょうか?すべて動作しているのに、設定は必要なのでしょうか?

2 つ目のケースは異なります。古いデータを S3 に移行できないからです(新しいデータのみ動作します)。しかし、ここで app.yml ファイルに DISCOURSE_S3_ACCESS_KEY_ID: 'key' などのデータを入力しても何も変化せず、依然として動作しません(つまり、

rake uploads:migrate_to_s3

が機能しません)。

これを説明していただけますか?

いいえ、環境変数は、管理パネルにアクセスする前など、この設定を行うための追加手段を提供します。