Ошибки S3 при загрузке фотографий профиля

Я использую последнюю бета-версию и включил S3 для управления загружаемыми файлами.

Загрузка файлов в сообщениях работает корректно (файл загружается в S3 и отображается в сообщении), но при попытке загрузить аватар профиля в интерфейсе возникает ошибка «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 и обеспечить загрузку новых изображений туда?

РЕДАКТИРОВАНИЕ: следовало упомянуть, что у меня включена защищённая загрузка медиафайлов.

1 лайк

Случайно не используете Cloudflare? Я полагаю, что изображения профиля действительно хранятся на S3, но проксируются через ваш сервер. Я решил похожую проблему (все загруженные аватары отображались пустыми): мне пришлось добавить IP-адрес сервера в белый список в Cloudflare, чтобы это исправить.

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, отличается от стандартных инстансов Discourse). По выводу curl я не могу точно сказать, есть ли там информация, исключающая проксирование аватарок через Discourse (я не эксперт).

По своему прошлому опыту, если изображения постов загружаются в S3, то и аватарки тоже, если не используется какая-то очень кастомная настройка. Я ранее не пробовал безопасную загрузку медиа или использование S3 без CDN, так что эти факторы могут существенно повлиять.

Стоит попробовать загрузить новую аватарку и проверить, сможете ли вы найти файл в локальном хранилище или в бакете 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 ()

Если перейти по этой ссылке:

{"errors":["Запрошенный URL или ресурс не найден."],"error_type":"not_found"}

При проверке ведра S3 ничего не попало в папку «Originals».

Это контрастирует с ситуацией при загрузке изображения в пост: тогда всё работает корректно, изображение появляется в ведре S3 и автоматически создаётся его уменьшенная копия/оптимизация.

1 лайк

HTTP-статус 422, судя по всему, означает «unprocessable entity» (необработанный объект). Это наводит на мысль, что Discourse по какой-то причине не принимает загружаемый файл, хотя это может быть и что-то другое. На мой взгляд, 422 в целом просто означает: «запрос сформирован корректно, но в нём есть ошибка».

Является ли изображение, которое вы пытаетесь загрузить, необычного формата или, возможно, оно имеет огромный размер?
Пытались ли вы вставить именно этот файл изображения в пост?

Аватар (по умолчанию) изменяет свой размер до нескольких разных форматов, поэтому проблема может быть именно в этом, например, из-за превышения лимита памяти, если изображение слишком большое. Однако это лишь предположение.

Я не думаю, что статус 422 может вернуть S3; он не указан в документации по ошибкам их API. Поэтому, скорее всего, проблема возникает в самом Discourse ещё до попытки загрузки в S3.

1 лайк

Это, безусловно, связано с обработкой изображений аватара. Только что попробовал снова с тем же изображением (на этот раз через мобильный клиент iOS), и оно успешно загружается внутри поста, но при использовании того же изображения в качестве аватара возникает та же ошибка «доступ запрещён».

Может ли кто-то ещё, использующий S3 с защищёнными медиафайлами, воспроизвести эту ошибку? Не связано ли это с правами доступа к бакету, учитывая, что загрузка для поста работает?

1 лайк