Backups para Cloudflare R2 falham durante upload multipart com aws-sdk-s3 1.182.0 (método 'downcase' não definido para nil)

Prioridade/Severidade:

Alta para instâncias auto-hospedadas que utilizam armazenamento de backup compatível com S3, pois os backups agendados falham após a criação do arquivo.

Plataforma:

Discourse auto-hospedado na branch mais recente.

Versão ao vivo atual quando observado: v2026.4.0-latest

Ruby: 3.4.0

aws-sdk-s3: 1.182.0

Descrição:

Os backups para o Cloudflare R2 falham na etapa final “Enviando arquivo…”.

O despejo do banco de dados e a criação do arquivo local são concluídos com sucesso, mas o upload multipart do arquivo de backup finalizado falha.

Resultado real:

O backup falha com:

EXCEPTION: multipart upload failed: undefined method 'downcase' for nil

O rastreamento de pilha inclui:

aws-sdk-s3-1.182.0/lib/aws-sdk-s3/multipart_file_uploader.rb
lib/backup_restore/s3_backup_store.rb:48
lib/backup_restore/creator.rb:434

Resultado esperado:

O arquivo de backup deve ser enviado com sucesso para o armazenamento de backup compatível com S3 configurado.

Etapas reproduzíveis:

  1. Configure o armazenamento de backup para o Cloudflare R2 usando o caminho de backup compatível com S3.
  2. Utilize um arquivo de backup maior que o limite multipart.
  3. Execute um backup manual ou agendado.
  4. Observe a falha durante “Enviando arquivo…”.

Configuração relevante:

  • DISCOURSE_BACKUP_LOCATION=s3
  • DISCOURSE_S3_ENDPOINT=https://.r2.cloudflarestorage.com
  • DISCOURSE_S3_FORCE_PATH_STYLE=true
  • DISCOURSE_S3_BACKUP_BUCKET=
  • AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_REQUIRED
  • AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_REQUIRED

Trecho do rastreamento de pilha observado:

algorithm = resp.context.params[:checksum_algorithm]
k = "checksum_#{algorithm.downcase}".to_sym

Isso sugere que checksum_algorithm é nil no caminho de upload multipart.

Contexto adicional:

Existe um tópico recente semelhante no Meta para o Backblaze B2:

Além disso, as entradas do changelog do aws-sdk-s3 após a versão 1.182.0 parecem relevantes:

  • 1.201.0: Corrige o upload multipart para respeitar o modo request_checksum_calculation quando_required
  • 1.210.2: Recua para checksums de solicitação via cabeçalho ao usar endpoints personalizados ou provedores de endpoint para operações PutObject e UploadPart

O Discourse main atualmente ainda parece travar o aws-sdk-s3 na versão 1.182.0:

https://raw.githubusercontent.com/discourse/discourse/main/Gemfile.lock