Cloudflare の R2 がついに一般公開されました(1 年かかったようです)。(元の発表はこちらです: https://blog.cloudflare.com/introducing-r2-object-storage/)
バケットを作成しました。
トークンを作成しました。トークンを作成したところ、以下の権限が含まれていました。「編集: すべてのオブジェクトの編集アクセスと、すべてのバケットのリスト、書き込み、削除操作を許可」
試したことは以下の通りです。
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' with value 'public-read' not implemented
そして、Public buckets · Cloudflare R2 docs で説明されているように、バケットを公開する必要があることを思い出しました。
しかし、それでも機能しませんでした。
S3 API compatibility · Cloudflare R2 docs を見ると、x-amz-acl が実装されていないことが示されています。
Discourse のコードをざっと見ましたが、コアに変更を加えないと R2 が機能する可能性があるかどうかは明らかではありませんでした。
アップロードを無効にした後、バックアップは機能したので、R2 は S3 バックアップを持つための非常に安価な方法のようです。しかし、そのバケットを公開していたため、バックアップも公開されていました(ファイル名を推測できれば)、したがって、これが解決された場合、バックアップとアップロードには別のバケットを用意したいと思うでしょう。
この行を削除したところ、ファイルがアップロードされ、カスタムドメインを s3_cdn_url として使用してアクセスできることがわかりました。(同様の編集を s3 rake タスクに加えることで、アセットのアップロードが可能になります。)