Настройте поставщика объектного хранилища, совместимого с S3, для загрузки

R2 от Cloudflare наконец-то стал общедоступным (как выяснилось, на это ушло всего лишь год). (Вот оригинальное объявление: Announcing Cloudflare R2 Storage: Rapid and Reliable Object Storage, minus the egress fees)

Я создал бакет.

Я создал токен со следующими правами: «Редактирование: разрешить редактирование всех объектов, а также операции перечисления, записи и удаления для всех бакетов».

Вот что я пробовал:

  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: auto
  DISCOURSE_S3_ACCESS_KEY_ID: redacted
  DISCOURSE_S3_SECRET_ACCESS_KEY: redacted
  DISCOURSE_S3_CDN_URL: https://pub-72eaa03782c542edbe00598fd1666be1.r2.dev
  DISCOURSE_S3_BUCKET: lc-testing
  DISCOURSE_S3_BACKUP_BUCKET: lc-testing/backups
  DISCOURSE_BACKUP_LOCATION: s3
  DISCOURSE_S3_ENDPOINT: https://cb46accbfcc3db1bdbba2bce07f8b509.r2.cloudflarestorage.com
  DISCOURSE_S3_INSTALL_CORS_RULE: false
  DISCOURSE_S3_CONFIGURE_TOMBSTONE_POLICY: false
  FORCE_S3_UPLOADS: 1

Однако загрузка ресурсов завершается ошибкой:

Aws::S3::Errors::NotImplemented: Header 'x-amz-acl' со значением 'public-read' не реализован

Затем я вспомнил о необходимости сделать бакет общедоступным, как описано здесь: Public buckets · Cloudflare R2 docs

Но это всё равно не помогло.

На странице S3 API compatibility · Cloudflare R2 docs указано, что заголовок x-amz-acl не поддерживается.

Беглый взгляд на код Discourse не позволяет однозначно сказать, что возможно заставить R2 работать без изменений в ядре.

После отключения загрузки резервные копии создаются успешно, так что R2 оказывается очень дешёвым решением для хранения резервных копий S3. Однако, поскольку я сделал этот бакет общедоступным, резервная копия также стала публичной (если угадать имя файла). Поэтому, если проблема будет решена, вам понадобятся отдельные бакеты для резервных копий и для загрузки ресурсов.

Я удалил эту строку и смог убедиться, что файл был загружен, а также получить к нему доступ через пользовательский домен, указанный в параметре s3_cdn_url. (Аналогичное изменение в задаче rake для S3 позволяет загружать ресурсы.)

5 лайков