Configurar um provedor de armazenamento de objetos compatível com S3 para uploads

O R2 da Cloudflare está finalmente disponível publicamente (levou apenas um ano, aparentemente). (Aqui está o anúncio original: Announcing Cloudflare R2 Storage: Rapid and Reliable Object Storage, minus the egress fees)

Criei um bucket.

Criei um token https://developers.cloudflare.com/r2/data-access/s3-api/tokens que inclui: “Editar: Permitir acesso de edição a todos os objetos e operações de Listar, Gravar e Excluir de todos os buckets”

Aqui está o que tentei:

  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

Mas o upload de ativos falha com isto:

Aws::S3::Errors::NotImplemented: Header 'x-amz-acl' with value 'public-read' not implemented

E então lembrei-me de tornar o bucket público, como descrito em Public buckets · Cloudflare R2 docs

Mas ainda assim não funcionou.

S3 API compatibility · Cloudflare R2 docs mostra que x-amz-acl não é implementado.

Analisando o código do Discourse, não me parece óbvio que seja possível fazer o R2 funcionar sem alterações no núcleo.

Após desativar os uploads, os backups funcionam, então o R2 parece ser uma maneira muito barata de ter backups S3. Mas como eu tinha tornado aquele bucket público, o backup também era público (se você conseguir adivinhar o nome do arquivo), então se isso for resolvido, você vai querer buckets separados para backups e uploads.

Removi esta linha e consegui ver que ele carregou um arquivo, e consegui acessá-lo usando um domínio personalizado como s3_cdn_url. (E uma edição semelhante na tarefa rake do s3 permite que os ativos sejam carregados.)

5 curtidas