При использовании SSO с настройкой sso overrides avatar: true Discourse, похоже, загружает аватар и всегда отображает его локально, вместо того чтобы ссылаться напрямую на предоставленный URL.
Разумнее ли было бы разрешить отображение аватаров напрямую из предоставленного avatar_url? В текущем виде для каждого отображаемого аватара происходит лишний запрос к бэкенду Discourse. Возможно, это можно сделать опцией SSO?
Если проблема в том, что аватары могут исчезнуть, это можно решить с помощью события onerror для изображений, при котором src будет переключаться на локальную копию (или отображаться изображение по умолчанию). Я не знаю, можно ли ограничить размер слишком больших аватаров только с помощью CSS.
Я полагаю, что отключение download_remote_images_to_local должно решить вашу проблему, хотя при этом изображения внутри постов будут отображаться удалённо, а не локально.
Интересно. Я знаю, что плагин OIDC позволяет переопределять email при каждом входе. Возможно, что-то подобное можно реализовать и для переопределения аватара через SSO.
Если аватар SSO имеет формат https://central.avatar.service/<username>, вы можете использовать настройку сайта external_system_avatars_url, чтобы включить эту функцию.
Возвращаюсь к этому вопросу спустя пару лет, так как, похоже, я раньше что-то неправильно понял. Однако я всё ещё считаю, что здесь есть простой способ улучшить производительность.
Раньше я думал, что аватары хранятся локально (на самом сервере Discourse), и задавался вопросом, почему они не обслуживаются напрямую по внешнему URL аватара из SSO, а не через Discourse. Но после небольшого исследования я понял, что внешние аватары из SSO уже загружаются в объектное хранилище (например, S3) и доступны в требуемых размерах.
Итак, если я правильно понимаю, в настоящее время Discourse проксирует аватары из объектного хранилища клиенту. Однако такое поведение, похоже, характерно только для случаев использования внешних аватаров SSO, поскольку аватары здесь, на meta, загружаются напрямую из объектного хранилища (через CDN). Но при использовании SSO с внешними URL адреса аватаров имеют вид:
где для каждого отображаемого аватара происходит обращение к Rails (до кэширования на стороне клиента).
И, если я правильно понимаю код, даже есть настройка, позволяющая использовать редирект вместо проксирования, но в этом случае запрос всё равно уже достигает Rails, а редирект лишь увеличивает время загрузки для клиента.
Разве не было бы быстрее просто указывать ссылки на аватары напрямую в объектное хранилище (возможно, обслуживаемое через CDN), одновременно освобождая ресурсы Rails? /cc @Falco
Это не так. По умолчанию Discourse проксирует запросы на получение аватаров, как вы видите на вашем сайте.
Однако в прошлом году мы добавили настройку, которую можно включить через переменную окружения DISCOURSE_REDIRECT_AVATAR_REQUESTS=1, чтобы активировать поведение, которое вы наблюдаете здесь.