最新のベータ版を実行しており、S3 を使ってアップロードされたファイルを管理するように設定しています。
投稿内のアップロードは正常に動作しています(ファイルが S3 にアップロードされ、投稿に表示されます)。しかし、プロフィール写真のアップロードを試みると、UI で「Access Denied」エラーが発生するようになりました。管理者のエラーログには何も記録されていません。
初期のユーザーの中には、アバター画像のアップロードに成功した人もいますが、それらはローカルに保存されているようです。ソースを確認すると以下のようになっています:
<img alt="" width="45" height="45" src="/user_avatar/example.com/jackie/90/29_2.png" class="avatar" title="image title" aria-label="Imagery/FIT">
プロフィール画像を S3 に移行し、新しい画像も S3 にアップロードできるようにする方法はありますか?
編集:Secure Media Uploads が有効になっていることを追加で記載すべきでした。
「いいね!」 1
Cloudflareをお使いでしょうか?プロフィール画像は実際にはS3に保存されているものの、あなたのサーバー経由でプロキシされていると考えています。これと似た問題(アップロードされたアバターがすべて空白に表示される)を解決した際、CloudflareでサーバーのIPアドレスをホワイトリストに登録することで修正できました。
「いいね!」 1
ありがとうございます。ただし、CDN は使用していません。セキュアなメディア付きの通常の S3 を使用しています。リクエストがプロキシされているかどうかを確認する方法はわかりませんが、以下の curl ヘッダー出力をご覧ください。
これにより、プロキシされていないと推測されますが、確信が持てません…
curl -I https://example.com/user_avatar/discourse.psy.plymouth.ac.uk/jackie/90/29_2.png
HTTP/2 200
server: nginx
date: Thu, 09 Sep 2021 11:26:33 GMT
content-type: image/jpeg
content-length: 4068
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-download-options: noopen
x-permitted-cross-domain-policies: none
referrer-policy: strict-origin-when-cross-origin
x-discourse-route: user_avatars/show
last-modified: Thu, 09 Sep 2021 09:38:05 GMT
content-transfer-encoding: binary
cache-control: max-age=31556952, public, immutable
「いいね!」 1
その URL 構造はプロキシされたアバターと一致していますが、少し混乱を招きます(Meta 上のアバター URL の実装は、標準的な Discourse インスタンスとは異なります)。curl の出力からは、Discourse がアバターのプロキシを行っていないことを示す情報が含まれているかどうかは判断できません(私は専門家ではありません)。
過去の経験から言うと、投稿画像が S3 にアップロードされている場合、非常にカスタマイズされた設定を行っていない限り、アバターも同様に S3 に保存されます。以前、セキュアなメディアアップロードや CDN なしの S3 使用を試したことがないため、それらが大きな違いをもたらす可能性があります。
新しいアバターをアップロードして、ローカルストレージまたは S3 バケットにファイルが存在するか確認することをお勧めします。
私の推測では、サーバーの IP アドレスを S3 でホワイトリストに登録する必要があるのではないかということです。ただし、私は専門家ではありませんので、他の誰かがコメントしてくれることを願っています。
「いいね!」 1
問題は、S3 へのアップロードは投稿では機能するものの、アバター画像のアップロードでは機能しない点です。私の推測では、アバターを持っているユーザーは、S3 設定前に画像をアップロードしたユーザーのみである可能性がありますが、これは確認できていません。
「いいね!」 1
これは役立つかもしれません:How are avatars stored and accessed? - #5 by DanielMarquard
私も同様の問題に直面しました。投稿画像は表示されましたが、プロフィール画像は表示されませんでした。両方のアップロードは S3 へのアップロードが正常に完了していましたが、表示に問題がありました(サーバーの IP がレート制限またはブロックされていました)。
「いいね!」 2
確認しましたが、アバターをアップロードしようとするとプログレスバーが更新され100%に達しますが、その後にのみ「エラー:アクセス拒否」と表示されます。
JSコンソールを確認すると、以下のエラーが発生しています:
https://discourse.psy.plymouth.ac.uk/uploads.json?client_id=0a2569993a6b43d6b5f8c60fdd2c913e
リソースの読み込みに失敗しました。サーバーはステータス 422 () で応答しました。
その URL を直接アクセスすると:
{"errors":["リクエストされた URL またはリソースが見つかりません。"],"error_type":"not_found"}
S3 バケットを確認しましたが、「Originals」フォルダには何も保存されていません。
これは、投稿に画像をアップロードする場合とは対照的です。その場合はすべて正常に動作し、画像は S3 バケットに表示され、サムネイル化および最適化もされています。
「いいね!」 1
HTTP ステータス 422 は、どうやら「Unprocessable Entity」を意味するようです。これは、Discourse が何らかの理由でアップロードを拒否していることを示唆していますが、他の要因の可能性もあります。422 は基本的に「リクエストの形式は正しいが、リクエストの内容に問題がある」ことを意味すると考えられます。
アップロードしようとしている画像は、特殊な形式でしょうか、あるいは非常に巨大な画像でしょうか?
その画像ファイルをそのまま投稿に含めてみたことはありますか?
アバターはデフォルトで複数のサイズにリサイズされるため、そこで何らかのエラーが発生している可能性があります。例えば、画像が巨大すぎてメモリ制限に達しているなどです。ただし、これは主に推測に過ぎません。
S3 から 422 が返されるとは考えにくく、S3 の API リファレンスにもエラー応答としてリストされていません。そのため、問題は S3 へのアップロードを試みる前に、Discourse 側で発生していると思われます。
「いいね!」 1
アバター画像の処理に関連していることは間違いありません。今回は iOS モバイルクライアントで同じ画像を再度試しましたが、投稿内では正常にアップロードされるものの、アバターとして同じ画像を使用すると同じ「アクセス拒否」エラーが発生します。
S3 をセキュアメディアとして使用している他の方で、同様のエラーを再現できますか?投稿へのアップロードは正常に動作していることから、バケットの権限設定に問題があるのでしょうか。
「いいね!」 1