Cloudflare R2: настройка и устранение ошибок конфигурации

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

Включая загрузки S3?

Очень полезно, спасибо. Но когда я загружаю изображение из буфера обмена через копирование, это не работает. Вы сталкивались с этой проблемой? В итоге изображение было загружено в R2, но не отображается в посте:

Вы посмотрели на URL изображения? Как он выглядит?

Так что мы всё ещё не можем настроить r2 через app.yml? Только через настройки сайта, то есть DB_S3_CONFIG?

Используя этот метод, можно ли загрузить старые локальные файлы в R2 через rake uploads : migrate_to_s3?

Привет, спасибо всем за это.

Если я правильно понимаю, “DISCOURSE_CDN_URL” может совпадать с “DISCOURSE_S3_CDN_URL”, то есть это пользовательский публичный домен, привязанный к бакету в Cloudflare? Или для этого требуется какая-то другая конфигурация?

Да, вы должны добавить то же имя домена в файл discourse container.yml. Вот пример использования:

  ## HTTP или HTTPS CDN-адрес для этого экземпляра Discourse (настроен на извлечение)
  ## Подробнее см. https://meta.discourse.org/t/14857
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  #DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: 'auto'
  DISCOURSE_S3_ENDPOINT: 'https://45dv544v56x****************************564564.eu.r2.cloudflarestorage.com'
  DISCOURSE_S3_ACCESS_KEY_ID: '564dfds4f54sdfs********65564545'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'sddfsdf564564**********6545sd4f54sd56f4s6d5'
  DISCOURSE_S3_CDN_URL: 'https://cdn.discourse.com.br'
  ##DISCOURSE_CDN_URL: 'https://cdn.discourse.com.br'
  #DISCOURSE_S3_BUCKET: 'cloudflarebucketname'
  #DISCOURSE_S3_BACKUP_BUCKET: 'cloudflarebackupbucketname/backups'
  #DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_S3_INSTALL_CORS_RULE: false

Настройки, отключённые с помощью этого символа, следует конфигурировать через панель администратора; примеры приведены в коде. Если хотите, вы также можете включить эти настройки в разделе конфигурации — это зависит от вас.

Эта опция сломает сайт при настройке в app.yml, так как не все статические файлы, например JavaScript, по какой-то причине размещены на R2.

Это отлично. Я только что следовал руководству в посте #39, и всё заработало. У меня есть одно предложение и два вопроса.

Предложение:
Судя по тому, что я прочитал, бакет для файлов CDN должен быть общедоступным, а бакет для резервных копий — приватным. Поэтому я создал два бакета: оставил бакет для резервных копий приватным, а бакет для файлов сделал общедоступным с пользовательским доменом. Это означало лишь то, что мне пришлось указать два разных пути в двух полях в панели администратора.
Я видел, что многие пользователи размещают свои резервные копии как путь внутри своего основного бакета. Неужели я неправильно мыслю в этом вопросе? Или это просто особенность CF R2?

Вопрос 1:
Я добавил ‘DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true’ в свой app.yml и пересобрал приложение, но при переходе к резервным копиям и нажатии кнопки создания резервной копии всё равно появляется всплывающее окно с сообщением, что загрузки не будут включены. Это просто потому, что у всплывающего окна нет никакой логики, или что-то настроено неправильно?

Вопрос 2:
Если я хочу переместить текущие загрузки в R2, какие краткие команды для этого нужны?
Я поискал и попробовал:

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

Но кажется, что первая команда rake работает только если я установлю параметры S3 в файле app.yml. Это верно?

Если я это сделаю, будет ли R2 продолжать работать?

Хорошо, протестировали — результат неутешительный.
Похоже, что первая команда rake работает только для AWS.

rake aborted!
Seahorse::Client::NetworkingError: Failed to open TCP connection to exotics-unlimited.s3.auto.amazonaws.com:443 (getaddrinfo: Name or service not known) (Seahorse::Client::NetworkingError)

Есть ли другая команда, которая выполняет ту же задачу для других провайдеров S3?

Вы предпринимали какие-либо дальнейшие шаги, чтобы проверить, можем ли мы сделать R2 полностью рабочим решением?

R2 работает отлично; просто не используйте и не устанавливайте эту опцию: DISCOURSE_CDN_URL

Верно, что означает, что всё работает не до конца, так как некоторые статические файлы не передаются/не размещаются корректно.
Я просто хочу, чтобы всё работало, а не только часть.

Я не могу заставить Discourse думать, что это AWS, хотя на самом деле это Cloudflare R2, и резервные копии просто не загружаются. Я хочу использовать его только для резервных ZIP-архивов вместо AWS. Я считаю, что правильно заполнил все настройки, и мой токен доступа имеет scope «object read & write», привязанный к этому конкретному бакету. Также добавил политику CORS из темы.

[2025-09-06 13:56:44] Сжатие архива, это может занять некоторое время...
[2025-09-06 13:56:49] Загрузка архива...
[2025-09-06 13:56:49] ИСКЛЮЧЕНИЕ: Aws::S3::Errors::Forbidden
[2025-09-06 13:56:49] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/object.rb:559:in `rescue in exists?'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/object.rb:554:in `exists?'
/var/www/discourse/lib/backup_restore/s3_backup_store.rb:46:in `upload_file'
/var/www/discourse/lib/backup_restore/backuper.rb:351:in `upload_archive'
/var/www/discourse/lib/backup_restore/backuper.rb:41:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:9:in `backup'
/var/www/discourse/script/spawn_backup_restore.rb:31:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'
[2025-09-06 13:56:49] Удаление старых резервных копий...
[2025-09-06 13:56:49] Очистка...
[2025-09-06 13:56:49] Удаление архива из локального хранилища...
[2025-09-06 13:56:49] Удаление остатков '.tar'...
[2025-09-06 13:56:49] Пометка резервной копии как завершённой...
[2025-09-06 13:56:49] Уведомление 'Firsh' об окончании резервного копирования...
[2025-09-06 13:56:54] Готово!

У меня тоже всё работает отлично! (не забудьте указать URL CDN, иначе загрузки будут работать, а получение — нет)