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

**URL:** <https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916>\
**Category:** Self-Hosting\
**Tags:** cdn, configuring, how-to, reference\
**Created:** [22.Апрель.2020 22:37:37 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916 "2020-04-22T22:37:37Z")\
**Posts on this page:** 1\
**Showing post:** 365

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [02.Октябрь.2022 19:28:39 UTC](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916/365 "2022-10-02T19:28:39Z")

</div>

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

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

Я [создал токен](https://developers.cloudflare.com/r2/data-access/s3-api/tokens) со следующими правами: «Редактирование: разрешить редактирование всех объектов, а также операции перечисления, записи и удаления для всех бакетов».

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

```plaintext
  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

```

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

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

```

Затем я вспомнил о необходимости сделать бакет общедоступным, как описано здесь: [Public buckets · Cloudflare R2 docs](https://developers.cloudflare.com/r2/data-access/public-buckets/#enable-public-access-for-your-bucket)

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

На странице [S3 API compatibility · Cloudflare R2 docs](https://developers.cloudflare.com/r2/data-access/s3-api/api/) указано, что заголовок `x-amz-acl` не поддерживается.

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

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

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

> <https://github.com/discourse/discourse/blob/main/lib/file_store/s3_store.rb#L87>

---

_[View the full topic](https://meta.discourse.org/t/configure-an-s3-compatible-object-storage-provider-for-uploads/148916)._
