@Falco — Стоит добавить предупреждение для Scaleway: она поддерживает только 1000 частей при многочастной загрузке, тогда как AWS поддерживает 10 000. Для обычных загрузок это не проблема, но при резервном копировании файлов определённого размера возникает проблема, так как S3 SDK использует 10 000 частей, если их количество не изменено вручную, что приводит к ошибке.
Отличное открытие! Если можете, добавьте его в OP-вики.
Спасибо. Также хочу добавить, что вы можете использовать любой из этих инструментов для копирования между облачными хранилищами, особенно в/из совместимых с S3 объектных хранилищ, например, Rclone, Shargate, Gs Richcopy360 и GoodSync. Все они совместимы с аналогичными облачными платформами.
Мы только что обнаружили проблему: Cloudflare R2 не разрешает публичный доступ (public-read) через URL конечной точки S3, поддерживается только доступ через пользовательский домен или случайный домен r2.dev.
(Скачивания по предподписанным ссылкам работают, но прямой публичный доступ не поддерживается.)
Однако Discourse использует URL CDN только для встроенных изображений, а не для прямых загрузок, которые используют URL конечной точки S3.
Есть ли способ заставить его использовать URL CDN для всех файлов или принудительно применять предподписанные URL?
Связано:
Упомянутый в том сообщении обходной путь работает: добавление ?dl=1 исправляет проблему, так как это заставляет Discourse использовать предподписанный URL S3.
Исправлено в 2023-03-16. Теперь R2 работает с Discourse как по маслу даже в бесплатном тарифном плане.
Но довольно часто резервные копии не удавались без уведомления, и они оставались на локальной машине, заполняя диск. Я изучил логи Wasabi и ошибки Discourse, но так и не нашёл объяснения, которое позволило бы какой-либо стороне «исправить» ситуацию.
Я тоже сталкиваюсь с этим довольно часто (раз в несколько месяцев), даже несмотря на то, что мой Discourse работает в AWS Lightsail, а резервные копии загружаются в AWS S3. Поэтому я не уверен, что проблема в Wasabi.
Возможно ли перехватывать эту ошибку и отправлять уведомление администратору? Я проверяю свободное место на диске и удаляю старые резервные копии при обновлении, но иногда это происходит слишком поздно, и форум перестаёт работать из-за нехватки места на диске.
Я тоже довольно часто вижу это (раз в несколько месяцев), даже несмотря на то, что мой Discourse работает в AWS Lightsail, а загрузка идет в AWS S3. Так что я не уверен, что дело в Wasabi.
Я почти уверен, что проблема заключалась в том, что автоматические перезагрузки ОС для установки обновлений безопасности происходили во время выполнения резервного копирования. Убедитесь, что вы запланировали перезагрузки ОС и резервное копирование в разное время. Я пришел к этому объяснению уже после того, как перенес этот сайт с Wasabi, но я вполне уверен, что дело именно в этом.
uptime показывает, что система работает уже 300 дней, так что, думаю, дело не в этом. Но, по аналогии, у меня были запланированы резервные копии Discourse в 2:00 ночи, а снимки Lightsail — в 2:30 ночи. Возможно, иногда загрузка не успевает завершиться, и снимок вносит помехи. Я разнес эти две операции на час — посмотрим, поможет ли это.
В любом случае, считаю разумным предупреждать администраторов в случае сбоя загрузки, по какой бы то ни было причине.
Думаю, пришло время обновить ядро и перезагрузить систему. ![]()
Возможно, у вас заканчивается оперативная память?
После настройки удалённых резервных копий Backblaze я вижу в панели управления эту ошибку:
Сервер настроен на загрузку файлов в S3, но не настроена CDN S3. Это может привести к высоким затратам на S3 и снижению производительности сайта. Подробнее см. в разделе «Использование объектного хранилища для загрузки файлов».
Я не настраивал загрузку файлов, я настроил только резервное копирование с помощью следующей конфигурации:
DISCOURSE_S3_REGION: "s3.us-west-00X"
DISCOURSE_S3_INSTALL_CORS_RULE: false
DISCOURSE_S3_ENDPOINT: https://s3.us-west-00X.backblazeb2.com
DISCOURSE_S3_ACCESS_KEY_ID: mykeyid
DISCOURSE_S3_SECRET_ACCESS_KEY: myaccesskey
DISCOURSE_S3_BUCKET: community-forum
DISCOURSE_S3_BACKUP_BUCKET: community-forum/backups
DISCOURSE_BACKUP_LOCATION: s3
Неужели я что-то сделал неправильно?
Кажется, что что-то настроено неверно: при попытке загрузить файл в пост я получаю эту ошибку:
Недопустимое значение для canned acl ‘public-read’
Буду признателен за любую помощь.
DISCOURSE_S3_BUCKET: community-forum
Удалите это, если не хотите, чтобы загрузки отправлялись в S3.
Ты спас день, брат.
Большое спасибо!
Я разделил две операции на час — посмотрим, поможет ли это.
Кажется, это сработало?
За последний месяц это произошло один раз, после того как я разнес эти два процесса на час. Это не «исправило» проблему, и случается она не так часто, чтобы можно было сказать, помогло ли это.
С другой стороны, я заметил, что на странице администратора есть раздел со статусом резервного копирования, который показывает доступное место на диске. Это избавляет меня от необходимости постоянно открывать терминал и выполнять команду df, чтобы проверить, не застряло ли резервное копирование. Я изменил текст, чтобы напомнить себе, что ожидаю около 80 ГБ свободного места.
Я изменил текст, чтобы напомнить себе, что у меня должно быть свободно около 80 ГБ
Отличная идея.
Я увидел изображение до того, как прочитал, что вы изменили текст, и wondered, какая логика привела к тому, что это было признано «хорошим»!
Мне так и не удалось заставить это работать с Scaleway, используя образ Bitnami Discourse.
Переменные окружения были заданы, но явно не читались/применялись корректно (или вообще не применялись?).
Поэтому я установил переменные S3 в панели администратора и указал регион напрямую в консоли Rails (все еще надеясь, что это просто станет текстовым полем):
SiteSetting.s3_region="fr-par"
Это вызвало ошибку валидации, но я просто закомментировал проверку валидации перед обновлением настройки, а затем вернул её обратно.
У меня не получилось заставить это работать с Scaleway, используя образ Bitnami Discourse.
Образ Bitnami не упакован нами и не следует нашим рекомендациям. Всё, что документировано здесь, протестировано только на официальной установке.
Это было решено включением опции «использовать CDN-URL S3 для всех загрузок», которая недавно была добавлена в Discourse.
Поскольку ранее мы использовали R2, нам нужно было использовать discourse remap для ручного исправления нерабочих ссылок, а также синхронизировать файлы S3 на всякий случай, после чего мы перекомпилировали все сообщения.
Я пытаюсь настроить это с помощью idrive e2, который совместим с S3. Однако в конце команды ./launcher rebuild app я получаю не очень полезную ошибку/трассировку стека:
I, [2023-10-14T15:08:08.026184 #1] INFO -- : > cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets
rake aborted!
Aws::S3::Errors::InternalError: We encountered an internal error, please try again.
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/dualstack.rb:27:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/plugins/accelerate.rb:56:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/checksum_algorithm.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/request_callback.rb:71:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.130.2/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/client.rb:12369:in `put_object'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.114.0/lib/aws-sdk-s3/object.rb:1472:in `put'
/var/www/discourse/lib/s3_helper.rb:78:in `upload'
/var/www/discourse/lib/tasks/s3.rake:41:in `block in upload'
/var/www/discourse/lib/tasks/s3.rake:41:in `open'
/var/www/discourse/lib/tasks/s3.rake:41:in `upload'
/var/www/discourse/lib/tasks/s3.rake:197:in `block (2 levels) in <main>'
/var/www/discourse/lib/tasks/s3.rake:197:in `each'
/var/www/discourse/lib/tasks/s3.rake:197:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:upload_assets
(See full trace by running task with --trace)
I, [2023-10-14T15:08:16.413098 #1] INFO -- : Installing CORS rules...
skipping
Uploading: assets/admin-2ebebf57104b0beb47a1c82fe5a8c6decd07f60a706640345fed296a094d1536.js
Это конфигурация, которую я использовал, но я также пробовал с DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY и DISCOURSE_S3_HTTP_CONTINUE_TIMEOUT.
DISCOURSE_USE_S3: true
DISCOURSE_S3_REGION: Dallas
DISCOURSE_S3_ENDPOINT: https://y0o9.tx21.idrivee2-4.com
DISCOURSE_S3_ACCESS_KEY_ID: <snip>
DISCOURSE_S3_SECRET_ACCESS_KEY: <snip>
DISCOURSE_S3_BUCKET: discourse
DISCOURSE_S3_INSTALL_CORS_RULE: false
Обратите внимание, что я не использую это для резервных копий (они уже настроены в интерфейсе с помощью Backblaze), а также не использую DISCOURSE_CDN_URL, так как не уверен, что idrive это поддерживает. Я планировал поэкспериментировать с этим, когда в бакет попадут реальные файлы.
Похоже, что это недостаточно совместимо с S3 для нужд Discourse.
Если вы хотите разобраться глубже, следующим шагом будет воспроизведение проблемы в установке для разработки и получение точного вызова API, который не работает.
