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 позволяет загружать ресурсы.)