Вот переменные, которые мы устанавливаем, связанные с 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 мы не определяем.
@Falco Насколько я помню, одна из вещей, делающих это очень контринтуитивным, заключается в различии поведения при установке DISCOURSE_S3_CDN_URL как переменной окружения или GlobalSetting по сравнению с его конфигурацией как SiteSetting. Возможно, стоит обратить на это внимание в вашем howto.
Да, извините, это опечатка в моем предыдущем сообщении. DISCOURSE_S3_BACKUP_BUCKET не устанавливает s3_bucket в GlobalSetting для меня. Не совсем понимаю, как вы запускаете эту rake-задачу без установки DISCOURSE_S3_BUCKET.
Кстати, я очень ценю вашу помощь и понимаю, что это не ваша проблема решать, так что спасибо.
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
Есть ещё одна интересная проблема: Discourse пытается получить файлы активов по неверному пути. Он пытается обратиться к путь brotli_asset, но такого пути в бакете S3 нет.
Также он пытается получить файлы JavaScript и стилей по URL CDN. Но и этих файлов в бакете тоже нет.
Если настроить данные для S3 через админ-панель, всё работает корректно, и всё загружается в S3. У меня нет никаких настроек в ENV. Это плохо? Это обязательно, если всё работает?
Второй пример отличается тем, что я не могу мигрировать старые данные в S3 (работают только новые). Но здесь ввод этих данных в файл app.yml (DISCOURSE_S3_ACCESS_KEY_ID: ‘key’ и т. д.) ничего не меняет, и всё равно не работает (то есть
Нет, переменные окружения предоставляют дополнительный способ настройки этих параметров, например, до того, как у вас появится доступ к панели администратора.