Проблема
На S3-совместимых бэкендах, которые не поддерживают ACL для отдельных объектов, secure_uploads не может сосуществовать с публично доступным контентом.
Аватары и ресурсы темы/сайта, похоже, обслуживаются через прямые, неаутентифицированные URL-адреса S3, что требует публичного чтения объекта. Но в том же бакете хранятся защищённые загрузки постов, которые в моей желаемой конфигурации должны оставаться приватными — и оба типа файлов (публичные и приватные) используют одни и те же префиксы путей (original/..., optimized/...). Без поддержки ACL для отдельных объектов нет способа сделать публичные файлы доступными для всех, а остальные — приватными.
Моя текущая ситуация: аватары и ресурсы не работают (бакет приватный → ошибка 403 для этих файлов), в то время как защищённые загрузки постов работают нормально через прокси /secure-uploads/.
Суть конфликта
Защищённые загрузки требуют аутентифицированного пути чтения; аватары и ресурсы требуют неаутентифицированного. Оба находятся за границами одного бакета, который не может их различать без поддержки ACL для отдельных объектов.
Предлагаемые решения
- Обслуживать аватары и ресурсы через pre-signed URL-адреса, когда бакет приватен и ACL отключены — используя тот же механизм, что и для защищённых загрузок. С моей точки зрения, это также может работать только для авторизованных пользователей в сценариях с непубличным экземпляром Discourse.
- Поддержка отдельных бакетов или префиксов для публичных ресурсов и защищённых загрузок, чтобы граница доступа соответствовала границе публичного/приватного доступа, и можно было бы настроить подходящие ACL.
Реализуем ли какой-либо из этих подходов, или я упустил уже существующий поддерживаемый способ решения?