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

Эта строка отформатирована с неправильным отступом. В ней должно быть ровно 2 пробела, как в after_code.

Это проблема? Потому что некоторые настройки начинаются без пробелов. И при компиляции ошибок не возникает. Пример:

Всё выглядит отлично. Как выглядит та часть after_assets_precompile, о которой я спрашивал?

Вам нужно вставить два пробела перед “after_assets_precompile”.

Я сделаю это и сообщу вам. Большое спасибо за ваше время <3

При применении этого возникает следующая ошибка, и сайт не загружается: доступ к сайту невозможен:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake s3:upload_assets failed with return #<Process::Status: pid 4803 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "cmd"=>["sudo -E -u discourse bundle exec rake s3:upload_assets", "sudo -E -u discourse bundle exec rake s3:expire_missing_assets"]}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

Я запустил ./discourse-doctor, затем перекомпилировал, но ошибка осталась прежней.

При входе в контейнер и запуске следующего кода возникает ошибка:

rake uploads:migrate_to_s3

Ошибка:

rake uploads:migrate_to_s3 --trace
Plugin name is 'DiscourseMatheditor', but plugin directory is named 'discourse-matheditor'
Plugin name is 'discourse-post-voting', but plugin directory is named 'discourse-question-answer'
Plugin name is 'discourse-topic-voting', but plugin directory is named 'discourse-voting'
** Invoke uploads:migrate_to_s3 (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute uploads:migrate_to_s3
Please note that migrating to S3 is currently not reversible!
[CTRL+c] to cancel, [ENTER] to continue

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.2.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management/null_instance.rb:36:in `each_connection'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rails_multisite-6.0.0/lib/rails_multisite/connection_management.rb:21: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>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in `exec'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => uploads:migrate_to_s3

Некоторые похожие нерешённые проблемы:

Есть ли в других упомянутых вами темах инструкции по завершению загрузки вручную?

Это лишь итоговое сообщение о неудаче; фактические ошибки находятся выше, как и указано:

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

Я хотел попробовать снова. Я добавил необходимые подключения S3 в app.yml и перекомпилировал их. На этот раз я удалил after_assets_precompile. Все URL-адреса изменились на CDN, но файлы стилей не загрузились. Когда я вручную захожу в контейнер и пытаюсь выполнить команду: rake s3:upload_assets, получаю следующую ошибку.

Попытка применения правил CORS для S3-активов в бакете cloudflarebucketname.
rake aborted!
Aws::S3::Errors::AccessDenied: Доступ запрещен (Aws::S3::Errors::AccessDenied)

Если я попробую это: rake uploads:migrate_to_s3 --trace

Ошибка, которую я получил:


Миграция загрузок в S3 для 'default'...
Некоторые загрузки не были перенесены по новой схеме. Запуск миграции, это может занять некоторое время...
rake aborted!
FileStore::ToS3MigrationError: Некоторые загрузки не удалось перенести по новой схеме. Вам нужно исправить это вручную. (FileStore::ToS3MigrationError)

Все сообщения об ошибке для “rake s3:upload_assets”:

root@domain-app:/var/www/discourse# rake s3:upload_assets --trace
Имя плагина 'DiscourseMatheditor', но директория плагина названа 'discourse-matheditor'
Имя плагина 'discourse-post-voting', но директория плагина названа 'discourse-question-answer'
Имя плагина 'discourse-topic-voting', но директория плагина названа 'discourse-voting'
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment
** Execute s3:ensure_cors_rules
Установка правил CORS...
Попытка применения правил CORS для S3-активов в бакете cloudflarebucketname.
rake aborted!
Aws::S3::Errors::AccessDenied: Доступ запрещен (Aws::S3::Errors::AccessDenied)
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/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.143.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.143.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/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.191.3/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/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.191.3/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.191.3/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/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.191.3/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-core-3.191.3/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/aws-sdk-s3-1.143.0/lib/aws-sdk-s3/client.rb:5424:in `get_bucket_cors'
/var/www/discourse/lib/s3_helper.rb:385:in `fetch_bucket_cors_rules'
/var/www/discourse/lib/s3_helper.rb:166:in `ensure_cors!'
/var/www/discourse/lib/s3_cors_rulesets.rb:60:in `sync'
/var/www/discourse/lib/tasks/s3.rake:184:in `block in <main>'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `block in execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:281:in `execute'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:243:in `block in invoke_prerequisites'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:241:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:241:in `invoke_prerequisites'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:218:in `block in invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:199:in `invoke_with_call_chain'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/task.rb:188:in `invoke'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:188:in `invoke_task'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block (2 levels) in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `each'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:138:in `block in top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:147:in `run_with_threads'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:132:in `top_level'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:83:in `block in run'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:214:in `standard_exception_handling'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/rake-13.2.1/lib/rake/application.rb:80:in `run'
bin/rake:13:in `<top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:451:in `exec'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `run'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor.rb:527:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:34:in `dispatch'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/cli.rb:28:in `start'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:28:in `block in <top (required)>'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
/usr/local/lib/ruby/gems/3.2.0/gems/bundler-2.5.3/exe/bundle:20:in `<top (required)>'
/usr/local/bin/bundle:25:in `load'
/usr/local/bin/bundle:25:in `<main>'
Tasks: TOP => s3:upload_assets => s3:ensure_cors_rules

Из этой ситуации сложно выбраться.

Что-то подсказывает мне, что коды S3, запускаемые только после компиляции, поддерживают только Amazon S3. Что вы об этом думаете?

У меня работает. Кажется, есть настройка для пропуска правил CORS. Попробуйте посмотреть настройка провайдера объектного хранилища, совместимого с S3, для загрузки файлов, чтобы узнать, что это такое.

это?: DISCOURSE_S3_INSTALL_CORS_RULE: false

Это отлично сработало, но есть одна проблема: файлы theme-javascripts не загружаются в S3. Естественно, дизайн сайта нарушен. Загружается только папка assets. Что мы можем сделать, чтобы загрузить другие файлы дизайна?

В последний раз напоминаю: не забудьте добавить часть, вызывающую задачу Rake для загрузки в S3.

Удачи.

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


Когда я запускаю это, войдя в контейнер: rake uploads:migrate_to_s3, получаю следующую ошибку:

Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
1001 posts were flagged for a rebake
rake aborted!
FileStore::ToS3MigrationError: 9 of 3769 uploads are not migrated to S3. S3 migration failed for db 'default'. (FileStore::ToS3MigrationError)

Мой файл app.yml выглядит следующим образом. Я отключил эту настройку, потому что она не загружала theme-javascripts и style sheets: DISCOURSE_CDN_URL.

Попробую снова запустить это в полночь и скомпилировать, но не знаю, что именно я упустил. Я искал, что ещё может означать эта фраза, но ничего другого не нашёл: “задача rake для загрузки в S3”.

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: 'auto'
  DISCOURSE_S3_ENDPOINT: 'https://xxxxx.eu.r2.cloudflarestorage.com'
  DISCOURSE_S3_ACCESS_KEY_ID: 'xxxxx'
  DISCOURSE_S3_SECRET_ACCESS_KEY: 'xxxxx'
  DISCOURSE_S3_CDN_URL: 'https://cdn.xxxxx.com'
  #DISCOURSE_CDN_URL: 'https://cdn.xxxxx.com'
  DISCOURSE_S3_BUCKET: 'cloudflarer2xxxxx'
  #DISCOURSE_S3_BACKUP_BUCKET: 'cloudflarer2xxxxxbackups'
  #DISCOURSE_BACKUP_LOCATION: 's3'
  DISCOURSE_INCLUDE_S3_UPLOADS_IN_BACKUPS: true
  DISCOURSE_S3_INSTALL_CORS_RULE: false

Извините, что отнял ваше время, но было бы неплохо, если бы документация для пользователей включала подобные случаи. Теперь мы знаем, что R2 работает. Просто добавьте следующие две настройки:


DISCOURSE_S3_REGION: 'auto'
DISCOURSE_S3_INSTALL_CORS_RULE: false

Мы можем переместить папки изображений и активов на сайте в область S3. Проблема лишь в том, что файлы темы и стили не переносятся, и я попробую снова в полночь. Надеюсь, у меня получится, и я отмечу эту проблему как решённую, конечно, после объяснения решения.

Примечание: сервер PostgreSQL отдельный, я не использую тот, что на localhost. Думаю, с этим проблем нет.
Спасибо всем, кто уделил время.

Это команда для загрузки ассетов. Я предполагаю, что у вас всё ещё что-то не так, из-за чего ассеты не загружаются.

Хорошо, если я ничего не делаю неправильно, мне нужно найти проблему. Когда я захожу в контейнер и запускаю команду rake s3:upload_assets, всё кажется в порядке. Даже если я включаю или выключаю эту настройку, файлы стилей (theme-javascripts и stylesheets) не загружаются: DISCOURSE_CDN_URL: 'https://cdn.xxxxx.com'.

rake s3:upload_assets --trace
Имя плагина 'DiscourseMatheditor', но директория плагина названа 'discourse-matheditor'
Имя плагина 'discourse-post-voting', но директория плагина названа 'discourse-question-answer'
Имя плагина 'discourse-topic-voting', но директория плагина названа 'discourse-voting'
** Invoke s3:upload_assets (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke s3:ensure_cors_rules (first_time)
** Invoke environment
** Execute s3:ensure_cors_rules
Установка правил CORS...
пропуск
** Execute s3:upload_assets Пропуск: assets/break_string-cc617154cd04790e.js
....
....
....

Как я уже говорил, если я ничего не делаю неправильно, я пытаюсь найти ошибку и способ её исправить. Если будут какие-либо улучшения, я добавлю их сюда. Спасибо.

Всем привет,

Хочу поделиться своим опытом и пошаговой инструкцией по успешной настройке Cloudflare R2 для загрузки файлов и создания резервных копий в моём форуме на Discourse. Надеюсь, это поможет другим, кто планирует использовать Cloudflare R2 с Discourse.

Обзор настройки:

  • Платформа: Discourse (установка от Bitnami)
  • Ведро (Bucket): Cloudflare R2
  • Пользовательский домен: Настроен для публичного доступа к файлам
  • Конфигурация: Выполнена полностью через настройки сайта Discourse (переменные окружения не затрагивались)

Пошаговое руководство:

  1. Создание ведра Cloudflare R2:
  • Войдите в свою учётную запись Cloudflare и перейдите в раздел R2 Storage.
  • Создайте новое ведро для загрузок вашего форума (например, forum-uploads).
  • Запишите S3 API URL ведра, Access Key ID и Secret Access Key.
  1. Настройка пользовательского домена для CDN:
  • Чтобы публично предоставлять содержимое вашего ведра R2, создайте пользовательский домен в Cloudflare.
  • Например, я использовал forumfiles.example.in.
  • Убедитесь, что настройки DNS указывают на предоставленный Cloudflare CNAME. Поскольку мой домен уже находится в Cloudflare, это было сделано автоматически.
  1. Настройка параметров сайта Discourse:
    • s3_bucket: Имя вашего ведра R2 (например, forum-uploads).
    • s3_region: Установите значение US East (N. Virginia). Опции «автоматически» не было.
    • s3_endpoint: Используйте S3 API URL ведра, предоставленный Cloudflare (например, https://<your-bucket-unique-id>.r2.cloudflarestorage.com).
    • s3_access_key_id: Ваш Access Key ID для R2.
    • s3_secret_access_key: Ваш Secret Access Key для R2.
    • s3_cdn_url: Ваш пользовательский домен для CDN (например, https://forumfiles.example.in).
  • Убедитесь, что включены опции enable s3 backups и enable s3 uploads.
  1. Настройка прав доступа и CORS:
  • Установите для вашего ведра R2 приватный доступ и настройте политику CORS:
[
  {
      "AllowedHeaders": ["*"],
      "AllowedMethods": ["GET", "POST", "PUT", "HEAD"],
      "AllowedOrigins": ["*"],
      "ExposeHeaders": ["ETag"],
      "MaxAgeSeconds": 3000
  }
]
  • Это обеспечит корректную работу загрузок без проблем с CORS.
  1. Проверка настройки:
  • Загрузите тестовый файл или изображение через ваш форум на Discourse, чтобы убедиться, что загрузка работает корректно.
  • Проверьте доступность файлов по вашему пользовательскому домену (например, https://forumfiles.example.in/original/1X/...).
  • Проверьте резервные копии: у меня успешно выполнялись задачи создания резервных копий. Я также проверил это в ведре R2, и они отображаются в настройках сайта.

Заключение:

Следуя этим шагам, мне удалось бесшовно интегрировать Cloudflare R2 с Discourse, эффективно обрабатывая как загрузку файлов, так и создание резервных копий. Если у вас возникнут вопросы или возникнут проблемы, не стесняйтесь спрашивать!

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

Похоже, это не работает, потому что в R2 S3 API от Cloudflare чего-то не хватает, также не работает migrate_to_s3.