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:
- Configure o armazenamento de backup para o Cloudflare R2 usando o caminho de backup compatível com S3.
- Utilize um arquivo de backup maior que o limite multipart.
- Execute um backup manual ou agendado.
- 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