SSOで sso overrides avatar: true を使用すると、Discourseはアバターをダウンロードし、提供されたURLに直接リンクするのではなく、常にローカルで配信するようです。
アバターを avatar_url から直接配信できるようにした方が合理的ではないでしょうか?現状では、表示されるアバターごとにDiscourseのバックエンドが不必要にアクセスされてしまいます。これをSSOオプションとして追加できるかもしれません。
もしアバターが消失する可能性があることが懸念点であれば、画像の onerror イベントで src をローカルにダウンロードしたコピー(またはデフォルトのもの)にフォールバックさせることで対応できます。ただし、CSSだけで大きなアバター画像を制限できるかどうかはわかりません。
「いいね!」 1
DrewH
(Drew)
2
download_remote_images_to_local を無効にすれば、ご質問の課題が解決すると思われます。ただし、これにより投稿内の画像もローカルではなくリモートから表示されるようになります。
それは投稿内の画像にのみ適用されるようですが、SSOで上書きされていない場合、ローカルアバターにも適用されるかもしれません。
「いいね!」 1
DrewH
(Drew)
4
興味深い点ですね。OIDC プラグインはログイン時に毎回メールアドレスを上書きできるようです。同様に、SSO によってアバターも上書き可能ではないでしょうか。
Falco
(Falco)
5
SSO アバターが https://central.avatar.service/<username> の形式である場合、この機能を利用するには external_system_avatars_url サイト設定を使用できます。
当社のケースでは該当しません(S3 から配信されているため)し、効率的にキャッシュできるよう、通常はその形式で提供されることも少ないでしょう。
数年後にフォローアップします。以前は何かを誤解していたと思いますが、パフォーマンスの簡単な改善策がまだあると考えています。
以前は、アバターがローカル(Discourseサーバー自体)に保存されていると考えており、なぜSSO外部アバターURLから直接提供されず、Discourseにヒットするのか疑問に思っていました。しかし、いくつか調べてみると、SSOから外部アバターはすでにオブジェクトストレージ(例:S3)にアップロードされ、必要な複数のサイズになっていることがわかりました。
したがって、私の理解が正しければ、現在Discourseはオブジェクトストレージからクライアントにアバターをプロキシしています。しかし、この動作はSSO外部アバターを使用する場合に特有のようです。なぜなら、ここメタのアバターは(CDN化された)オブジェクトストレージから直接提供されているからです。しかし、SSOで外部URLを使用する場合、アバターURLは次の形式になります。
https://discourse-host/user_avatar/discourse-host/{username}/{size}/{uploadid}_{version}.png
ここで、クライアントによってキャッシュされる前に、すべてのアバター表示でrailsにヒットします。
コードを理解している限り、プロキシの代わりにリダイレクトを許可する設定さえありますが、その時点ですでにrailsにヒットしており、リダイレクトはクライアントのロード時間に時間を追加するだけです。
アバターをオブジェクトストレージ(潜在的にはCDNから提供)に直接リンクし、同時にrailsリソースを解放する方が速いのではないでしょうか? /cc @Falco
Falco
(Falco)
9
そうではありません。デフォルトでは、Discourseはアバターのリクエストをプロキシします。これは、あなたのサイトで見られるとおりです。
しかし、昨年、ここで見られる動作をトリガーするために、ENV DISCOURSE_REDIRECT_AVATAR_REQUESTS=1 を介して有効にできる設定を導入しました。
「いいね!」 1