Проблемы с AWS CDN и S3

,

@Falco, это всё ещё актуально? Мне казалось, я читал что-то о недавних проблемах с использованием AWS, но не могу найти эту тему снова.

У меня возникает множество проблем при использовании AWS S3, следуя различным соответствующим темам в качестве руководства.

Резервное копирование работает как ожидалось, но использование Cloudfront в качестве CDN или раскомментирование DISCOURSE_USE_S3 и/или DISCOURSE_S3_BUCKET приводит к вечному индикатору загрузки.

Я подозреваю, что что-то неверно настроено в бакете для загрузок и/или в распределении Cloudfront, но не могу найти ошибку. Оба бакета (для загрузок и резервных копий) находятся за распределением, и резервное копирование работает нормально, так что???

discourse-cdn.repealobbba.org CNAME —> amazonassigned.cloudfront.net

DISCOURSE_CDN_URL: https://discourse-cdn.repealobbba.org

## Конфигурация хранения S3
#  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: us-east-1
  DISCOURSE_S3_ACCESS_KEY_ID: ACCESS_KEY_ID
  DISCOURSE_S3_SECRET_ACCESS_KEY: SECRET_ACCESS_KEY
  DISCOURSE_S3_CDN_URL: amazonassigned.cloudfront.net  или
#  DISCOURSE_S3_BUCKET: repeal-obbba-discuss-uploads
  DISCOURSE_S3_BACKUP_BUCKET: repeal-obbba-discuss-backups
  DISCOURSE_BACKUP_LOCATION: s3

Кроме того, добавление этого в конфигурацию

    after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

вызывает ошибку FAILED TO BOOTSTRAP

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets завершилась с кодом возврата #<Process::Status: pid 8484 exit 1>
Место ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
выполнение не удалось с параметрами {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
загрузка не удалась с кодом выхода 1
** FAILED TO BOOTSTRAP ** пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть несколько.

как всегда… Буду благодарен за любые мысли или предложения.

Вам нужно добавить блок конфигурации для загрузки ресурсов в S3.

Ох. Я ошибся, вы уже это делаете.

Это указывает на проблему с конфигурацией бакета.

Кажется, раньше была тема, которая генерировала JSON для настройки бакета, но не уверен, что она всё ещё доступна.

Согласен.
Хотя для бакета резервных копий политика бакета не использовалась, добавление политики в бакет загрузки устранило ошибку при загрузке начальных данных.

Файл политики JSON доступен по пути: CloudFront > Distributions > ваша дистрибуция > Edit origin
Screenshot 2025-12-10 141220

К сожалению, вечный индикатор загрузки продолжает отображаться.

Изменение владения объектами и ACL не меняет результат.

Текущие настройки. Я полагаю, что они являются рекомендуемыми, либо я что-то путаю.


После изменения настроек необходимо выполнить задачу rant для загрузки ресурсов.

Кроме того, вы можете открыть консоль разработчика и проверить, существуют ли файлы, к которым осуществляется доступ, в хранилище, или же проблема связана с CDN.

Спасибо за продолжение…

Да, задачи rake выполняются, разницы нет.

./launcher enter app
rake posts:rebake
rake uploads:migrate_to_s3
rake posts:rebake_uncooked_posts

Индикатор загрузки (спиннер) продолжает отображаться.

Задача rake uploads:migrate_to_s3 выдает ошибку:

Migrating uploads to S3 for 'default'...
Some uploads were not migrated to the new scheme. Running the migration, this may take a while...
rake aborted!
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)
/var/www/discourse/lib/file_store/to_s3_migration.rb:156:in `migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in `migrate'
/var/www/discourse/lib/tasks/uploads.rake:126:in `migrate_to_s3'
/var/www/discourse/lib/tasks/uploads.rake:106:in `block in migrate_to_s3_all_sites'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:104:in `migrate_to_s3_all_sites'
/var/www/discourse/lib/tasks/uploads.rake:100:in `block in <main>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

Как минимум один чекер CDN показывает: discourse-cdn.repealobbba.org → Amazon CloudFront.

В консоли по-прежнему видно, что изображения и JS-файлы загружаются с CDN:

Активы запрашиваются через CDN, но находятся ли они там? Если нет, то в бакете? Доступны ли они из бакета?

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

Выполняется ли задача по загрузке активов? Индикатор загрузки продолжает крутиться, потому что остальные активы не загружаются.

Да, они там есть, файлы находятся в бакете как активы
Доступны по адресу: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png

Всего два бакета: uploads и backups. С резервными копиями всё в порядке.

Команда rake s3:upload_assets выдала ошибку:
rake aborted!
Aws::S3::Errors::AccessControlListNotSupported: The bucket does not allow ACLs (Aws::S3::Errors::AccessControlListNotSupported)

Включил поддержку ACLs и снова запустил s3:upload_assets edit: uploads:migrate_to_s3, но…
FileStore::ToS3MigrationError: Some uploads could not be migrated to the new scheme. You need to fix this manually. (FileStore::ToS3MigrationError)

??? Вам нужно исправить это вручную. (FileStore::ToS3MigrationError)

Похоже, вы исправили бакет, и теперь он может загружать ресурсы, так что сайт должен работать. Проблема с ресурсами, которые не мигрируют, — это отдельный (сложный) вопрос.

Вот один из ресурсов, который вы пытаетесь предоставить:

https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

Сертификат не работает, вот в чём проблема. Сертификат есть, но он не соответствует URL.

Как я уже предлагал ранее, откройте вкладку «Network» в инструментах разработчика вашего браузера и посмотрите это:

редактирование сверху
Переключился на включенные ACL и снова запустил s3:upload_assets редактирование: uploads:migrate_to_s3

s3:upload_assets теперь завершается без ошибок

Я вижу сетевые ошибки. Проблема с сертификатом на стороне AWS?

Спасибо еще раз за ваше время, уделенное этому!!

Да. Сертификат не совпадает с именем хоста. Он соответствует *.cloudfront.net

Это работает: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/logo-815195ae.png

Это не работает: https://discourse-cdn.repealobbba.org/assets/start-discourse-6f03a463.br.js

Это работает: https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com/assets/start-discourse-6f03a463.br.js

Так что вам нужно изменить ваш CDN S3 на https://repeal-obbba-discuss-uploads.s3.us-east-1.amazonaws.com — хотя, кажется, это адрес ведра, так что это было бы не совсем идеально, но это сработало бы.

Меня не очень устраивает фраза «так что это не совсем идеально» :wink:

Рассматриваю возможность использования альтернативных доменных имен AWS как возможное решение.

Возможно, это только я так думаю, но добавление CDN, который @Discourse использует internally, не должно быть настолько сложным и требовать такой поддержки от таких людей, как @pfaffman.

Возможно, @Falco или @sam, а также @team (не могу упомянуть team) смогут высказаться??

Да, все сайты, которые мы хостим, используют связку S3 и CloudFront. Даже этот сайт, который вы сейчас просматриваете.

Спасибо за подтверждение! После этого я снова изменил DISCOURSE_S3_CDN_URL на amazonassigned.cloudfront.net, надеясь, что это решит проблемы с сертификатом и URL.

Я пересобрал проект и снова выполнил все rake-задачи, упомянутые в документации:
rake posts:rebake
rake uploads:migrate_to_s3 по-прежнему вызывает ошибку FileStore::ToS3MigrationError
rake posts:rebake_uncooked_posts

rake s3:upload_assets
rake s3:expire_missing_assets

Сайт всё ещё не загружается.

Есть какие-то предложения?

Оказалось, что это помогло.

@chapoi, пожалуйста, перенесите эту ветку в раздел поддержки.
Возможно, @JammyDodger переместил её в раздел установки для лучшей видимости, хотя форум работает стабильно уже несколько месяцев.

В любом случае, спасибо за внимание!

Установка нужна не только для настройки форума

Понял, спасибо за уточнение.

Как упоминалось выше, добавьте альтернативную доменную справку.
Сайт загружается, но без таблиц стилей и…

При просмотре в бакете я не вижу папки stylesheets/

Похоже, что s3:upload_assets не завершена.

И есть проблема с CORS?

Добиваюсь прогресса, разобравшись с несколькими моментами в документации, которые либо вводили в заблуждение, либо были запутанными, либо просто слишком сложными для человека с СДВГ. :distorted_face:

Для нас, людей с СДВГ, выделение этого ярко-красным цветом помогло бы донести мысль: «вам понадобятся две дистрибуции CloudFront».

а также инструкции о том, как

Неплохо было бы обновить и объединить темы, связанные с S3. Я думаю, что одна главная тема с актуальными данными по AWS S3 CDN и резервным копиям была бы отличной идеей.

продолжаем…

Теперь у меня есть две дистрибуции CloudFront, но:

  • Индикатор загрузки (throbber) остаётся на месте: https://discuss.repealobbba.org/
  • Некоторые ресурсы не отображаются в бакете uploads
  • Некоторые ресурсы пытаются загрузиться из бакета backups
  • Очевидно, множество ошибок в консоли, например: Ресурс по адресу «https://discourse-cdn.repealobbba.org/stylesheets/common_theme_6_1f8270be80babb5906f2dfb4fa157b7d9f9d12f8.css?__ws=discuss.repealobbba.org» был заблокирован из-за OpaqueResponseBlocking. Причина: «после анализа: код статуса не входит в разрешённый диапазон».
  • Я не уверен, что моя реализация двух дистрибуций верна.

Все задачи rake выполняются без ошибок, и
теперь это больше не вызывает сбой при загрузке.

after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

Проверка CDN выглядит ближе к желаемому результату

В целом прогресс есть, но советы от команды инфраструктуры Discourse были бы очень полезны.

Фух! Это потребовало уйму времени и несколько часов (8 часов за два звонка) в разговоре с очень полезным инженером Amazon, но я, кажется, наконец разобрался. На сайте RepealOBBBA всё работает отлично, и мой процесс можно воспроизвести на других сайтах.

Возможно, я позже оформлю это в виде статьи, но пока несколько заметок:

  1. DISCOURSE_CDN_URL (если используется AWS S3) и DISCOURSE_S3_CDN_URL требуют собственных распределений CloudFront.
  2. DISCOURSE_CDN_URL не использует бакет.
  3. DISCOURSE_CDN_URL может быть CDN, отличным от AWS. Bunny.net работает отлично. (Мне сообщили, что Bunny Storage с поддержкой S3 должен выйти в первом квартале 2026 года.)
  4. CDN для DISCOURSE_CDN_URL и DISCOURSE_S3_CDN_URL могут быть брендированными URL-адресами при правильной настройке DNS.
  5. DISCOURSE_S3_CDN_URL требует бакета для загрузок.
  6. Бакет для загрузок должен иметь включённые ACL, параметр «Все (публичный доступ)» должен быть установлен в значение «Чтение», и необходимо задать политику для бакета.
  7. Бакет для резервных копий не требует ни ACL, ни политики.

Редактирование(я)

  1. Установите флажок в S3 «Использовать CDN URL для всех загрузок»: используйте CDN URL для всех файлов, загружаемых в S3, а не только для изображений. Невключение этой опции всегда приводило к сбоям в моём случае.

Представляю, многие прочитают вышеизложенное и подумают: «Ду-у-х, Фил, это же очевидно», но… моя голова, привыкшая к BBS, не поняла этого сразу.