Defining DISCOURSE_S3_CDN_URL links to assets in S3 CDN URL

Вы можете проверить, какие переменные мы устанавливаем здесь: infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

Вот переменные, которые мы устанавливаем, связанные с S3/CDN:

  • DISCOURSE_CDN_URL
  • DISCOURSE_S3_ACCESS_KEY_ID
  • DISCOURSE_S3_BACKUP_BUCKET
  • DISCOURSE_S3_CDN_URL
  • DISCOURSE_S3_REGION
  • DISCOURSE_S3_SECRET_ACCESS_KEY
  • DISCOURSE_S3_UPLOAD_BUCKET
  • USE_DB_S3_CONFIG: true

Я полагаю, что DISCOURSE_S3_BUCKET устарел в пользу DISCOURSE_S3_UPLOAD_BUCKET и DISCOURSE_S3_BACKUP_BUCKET. Вам следует устанавливать именно эти переменные.

Я так и думал, но без установки обоих переменных окружения DISCOURSE_S3_UPLOAD_BUCKET и DISCOURSE_S3_BUCKET я не продвигаюсь. Как видно из приведённого выше фрагмента кода, метод use_s3? по-прежнему ищет s3_bucket, а не s3_upload_bucket.

Установка DISCOURSE_BACKUP_BUCKET, насколько я могу судить, не решает эту проблему.

Если я задаю обе переменные окружения для бакетов, я продвигаюсь на шаг вперёд, но теперь столкнулся с новой проблемой: Discourse игнорирует мой URL S3 CDN и пытается загрузить ресурсы из базового пути. Это вызывает ошибки CSP, поскольку Content Security Policy включает только путь к ресурсам из моего S3 CDN.

Должно быть DISCOURSE_S3_BACKUP_BUCKET, а не DISCOURSE_BACKUP_BUCKET. Если вы задаёте все переменные, то с двумя распределёнными облачными облаками Cloudfront всё должно работать. Если посмотреть наши настройки, то DISCOURSE_S3_BUCKET мы не определяем.

Не уверен, нужен ли также пересборка (rebake).

@Falco Насколько я помню, одна из вещей, делающих это очень контринтуитивным, заключается в различии поведения при установке DISCOURSE_S3_CDN_URL как переменной окружения или GlobalSetting по сравнению с его конфигурацией как SiteSetting. Возможно, стоит обратить на это внимание в вашем howto.

Да, извините, это опечатка в моем предыдущем сообщении. DISCOURSE_S3_BACKUP_BUCKET не устанавливает s3_bucket в GlobalSetting для меня. Не совсем понимаю, как вы запускаете эту rake-задачу без установки DISCOURSE_S3_BUCKET.

Кстати, я очень ценю вашу помощь и понимаю, что это не ваша проблема решать, так что спасибо.

Не волнуйтесь, это не проблема. Я забыл упомянуть, что мы также определяем USE_DB_S3_CONFIG: true в нашем файле app.yml. infra/modules/services/discourse/web.yml at master · debtcollective/infra · GitHub

И я думаю, что вы правы, поскольку это меняет поведение определения бакетов S3 (discourse/lib/tasks/s3.rake at 427d54b2b00fa94474c0522eaed750452c4e7f43 · discourse/discourse · GitHub), и, вероятно, это баг.

Проверьте, поможет ли вам установка этого параметра.

Уважаемый @eatcodetravel, спасибо за ваш замечательный пост.

Я пытаюсь настроить Cloudfront, как у вас.

Нужно ли мне загружать папку с ресурсами в мой бакет S3, или это произойдет автоматически?

Что произойдет после обновления Discourse? Нужно ли мне снова загружать тему, если это не произойдет автоматически?

Спасибо.

Конечно.

def ensure_s3_configured!
  unless GlobalSetting.use_s3? || use_db_s3_config
    STDERR.puts "ERROR: Убедитесь, что S3 настроен в config/discourse.conf или в переменных окружения"
    exit 1
  end
end

use_db_s3_config избавляет вас от необходимости устанавливать эту дополнительную переменную. Это должно быть ошибкой в global_setting.rb, так как я должен иметь возможность просто установить DISCOURSE_S3_UPLOAD_BUCKET, если только нет разницы между ним и DISCOURSE_S3_BUCKET, но, думаю, вы правы: последнее должно быть устаревшим.

Независимо от ошибки в global_setting.rb, я по-прежнему сталкиваюсь с проблемой: Discourse ищет ассеты в их обычном месте, а не на моём S3 CDN, хотя я объявил все переменные и установил DISCOURSE_ENABLE_S3_UPLOADS в значение true.

Для этого есть задача: bundle exec rake uploads:migrate_to_s3. После настройки ваших бакетов запустите эту задачу, чтобы перенести файлы загрузок в S3. За последние несколько месяцев в S3/CDN произошли изменения, и документация устарела, поэтому обязательно сделайте резервную копию и подготовьтесь на случай сбоев.

Когда я впервые включал эту функцию, у нас были простои, пока мы разбирались во всём.

Думаю, это потому, что у вас отсутствует переменная DISCOURSE_CDN_URL. В нашем конфиге она настроена так:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # указывает на сервер
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # указывает на бакет S3

Стили подгружаются с сервера, поэтому используется DISCOURSE_CDN_URL. JavaScript загружается в бакет S3 и использует DISCOURSE_S3_CDN_URL. @Falco объяснил мне это здесь.

Да, я это видел. Я установил DISCOURSE_CDN_URL, но проблема остаётся. Хотя, возможно, я что-то упустил из-за усталости и всех этих экспериментов. Вернусь к этому завтра. Спасибо за помощь.

Загрузит ли это файлы одновременно как изображения и как JS-файлы в S3? И стоит ли использовать ссылку CloudFront или достаточно самого S3? Спасибо за помощь.

bundle exec rake uploads:migrate_to_s3 загрузит только вложения в S3. Эту задачу нужно выполнить один раз. После включения S3 новые загрузки будут сохраняться в бакетах S3.

Для загрузки ресурсов используйте bundle exec rake s3:upload_assets. Эту команду необходимо запускать после каждой пересборки или обновления.

Я выполнил ваши рекомендации, и загрузка файлов в S3 (изображения и т. д.) прошла успешно, но для assets я получаю следующую ошибку:

ERROR: Ensure S3 is configured in config/discourse.conf or environment vars

Я установил оба параметра:

DISCOURSE_CDN_URL: 'https://d16zv78c963s69.cloudfront.net' # указывает на сервер
DISCOURSE_S3_CDN_URL: 'https://community-cdn-prod.debtcollective.org' # указывает на бакет S3

Скорее всего, это связано с USE_DB_S3_CONFIG: true. Попробуйте установить эту переменную, чтобы проверить, поможет ли это.

Вот все переменные, которые я настроил, связанные с S3/CDN:

Да. Спасибо :slightly_smiling_face:. Это решило проблему.

Есть ещё одна интересная проблема: Discourse пытается получить файлы активов по неверному пути. Он пытается обратиться к путь brotli_asset, но такого пути в бакете S3 нет.

Также он пытается получить файлы JavaScript и стилей по URL CDN. Но и этих файлов в бакете тоже нет.

@ufukayyildiz Я считаю, что все ответы на ваши вопросы есть в этой ветке. Я буквально только что прошел через такую же настройку.

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

Подождите.
Я не понимаю одного момента.

Зачем настраивать эти данные в ENV?

Приведу свой пример.

Если настроить данные для S3 через админ-панель, всё работает корректно, и всё загружается в S3. У меня нет никаких настроек в ENV. Это плохо? Это обязательно, если всё работает?

Второй пример отличается тем, что я не могу мигрировать старые данные в S3 (работают только новые). Но здесь ввод этих данных в файл app.yml (DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ и т. д.) ничего не меняет, и всё равно не работает (то есть

rake uploads:migrate_to_s3

не работает).

Можете ли вы объяснить мне это?

Нет, переменные окружения предоставляют дополнительный способ настройки этих параметров, например, до того, как у вас появится доступ к панели администратора.