Les sauvegardes vers Cloudflare R2 échouent lors du téléversement multipart avec aws-sdk-s3 1.182.0 (méthode undefined 'downcase' pour nil)

Priorité/Sévérité :

Élevée pour les instances auto-hébergées utilisant un stockage de sauvegarde compatible S3, car les sauvegardes planifiées échouent après la création de l’archive.

Plateforme :

Discourse auto-hébergé sur la dernière branche.

Version en production actuelle lors de l’observation : v2026.4.0-latest

Ruby : 3.4.0

aws-sdk-s3 : 1.182.0

Description :

Les sauvegardes vers Cloudflare R2 échouent à l’étape finale « Téléchargement de l’archive… ».

Le dump de la base de données et la création de l’archive locale se déroulent avec succès, mais le téléchargement multipart de l’archive de sauvegarde terminée échoue.

Résultat réel :

La sauvegarde échoue avec :

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

La pile d’appels inclut :

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

Résultat attendu :

L’archive de sauvegarde devrait être téléchargée avec succès vers le magasin de sauvegarde compatible S3 configuré.

Étapes pour reproduire :

  1. Configurer le stockage de sauvegarde vers Cloudflare R2 en utilisant le chemin de sauvegarde compatible S3.
  2. Utiliser une archive de sauvegarde supérieure au seuil multipart.
  3. Lancer une sauvegarde manuelle ou planifiée.
  4. Constater l’échec durant « Téléchargement de l’archive… ».

Configuration pertinente :

  • 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

Extrait de la pile d’appels observée :

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

Cela suggère que checksum_algorithm est nil dans le chemin du téléchargement multipart.

Contexte supplémentaire :

Il existe un sujet Meta récent similaire concernant Backblaze B2 :

De plus, les entrées du journal des modifications (changelog) d’aws-sdk-s3 après la version 1.182.0 semblent pertinentes :

  • 1.201.0 : Correction du téléchargement multipart pour respecter le mode request_checksum_calculation when_required
  • 1.210.2 : Recours aux en-têtes de somme de contrôle de la requête lors de l’utilisation de points de terminaison personnalisés ou de fournisseurs de points de terminaison pour les opérations PutObject et UploadPart

Discourse main semble toujours verrouiller aws-sdk-s3 sur la version 1.182.0 :

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