I backup su Cloudflare R2 falliscono durante il multipart upload con aws-sdk-s3 1.182.0 (undefined method 'downcase' for nil)

Priorità/Gravità:

Alta per le istanze self-hosted che utilizzano storage di backup compatibile con S3, poiché i backup programmati falliscono dopo la creazione dell’archivio.

Piattaforma:

Discourse self-hosted sull’ultimo ramo.

Versione live corrente al momento dell’osservazione: v2026.4.0-latest

Ruby: 3.4.0

aws-sdk-s3: 1.182.0

Descrizione:

I backup su Cloudflare R2 falliscono nell’ultimo passaggio “Caricamento dell’archivio…”.

Il dump del database e la creazione dell’archivio locale vengono completati con successo, ma il caricamento multipart dell’archivio di backup finito fallisce.

Risultato effettivo:

Il backup fallisce con:

ECCEZIONE: caricamento multipart fallito: metodo 'downcase' non definito per nil

Lo stack trace include:

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

Risultato atteso:

L’archivio di backup dovrebbe essere caricato con successo sullo storage di backup compatibile con S3 configurato.

Passaggi per riprodurre:

  1. Configurare lo storage di backup su Cloudflare R2 utilizzando il percorso di backup compatibile con S3.
  2. Utilizzare un archivio di backup più grande della soglia multipart.
  3. Eseguire un backup manuale o programmato.
  4. Osservare il fallimento durante il passaggio “Caricamento dell’archivio…”.

Configurazione rilevante:

  • 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

Estratto dello stack trace osservato:

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

Ciò suggerisce che checksum_algorithm è nil nel percorso del caricamento multipart.

Ulteriori contesti:

Esiste un argomento Meta recente simile per Backblaze B2:

Inoltre, le voci del changelog di aws-sdk-s3 successive alla versione 1.182.0 sembrano pertinenti:

  • 1.201.0: Correzione del caricamento multipart per rispettare request_checksum_calculation in modalità when_required
  • 1.210.2: Ripiega sui checksum delle richieste tramite header quando si utilizzano endpoint personalizzati o provider di endpoint per le operazioni PutObject e UploadPart

Discourse main attualmente sembra ancora bloccare aws-sdk-s3 alla versione 1.182.0:

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