S3 (pas AWS) a cessé de fonctionner aléatoirement, vraisemblablement depuis une mise à jour

J’ai un bucket configuré mais il semble qu’il essaie d’utiliser la valeur par défaut ?

J’utilise GarageHQ comme alternative légère à MinIO.

Je suis sur la version 3.6.0.beta1-dev
( ed6beea336 )

[2025-09-14 10:40:34] Suppression du répertoire tmp ‘/var/www/discourse/tmp/backups/default/2025-09-14-104012’…
[2025-09-14 10:40:34] Téléchargement de l’archive…
[2025-09-14 10:40:35] EXCEPTION : Bucket introuvable : default

[2025-09-14 10:40:35] /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/seahorse/client/plugins/raise_response_errors.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/sse_cpk.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/dualstack.rb:21:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/plugins/accelerate.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/checksum_algorithm.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/jsonvalue_converter.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/invocation_id.rb:16:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/idempotency_token.rb:19:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/param_converter.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/seahorse/client/plugins/request_callback.rb:89:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/response_paging.rb:12:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/seahorse/client/plugins/response_target.rb:24:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `block in call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/telemetry/no_op.rb:29:in `in_span'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/telemetry.rb:53:in `span_wrapper'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/telemetry.rb:39:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/seahorse/client/request.rb:72:in `send_request'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/client.rb:3710:in `create_multipart_upload'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/multipart_file_uploader.rb:67:in `initiate_upload'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/multipart_file_uploader.rb:58:in `upload'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/file_uploader.rb:42:in `block in upload'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/user_agent.rb:90:in `metric'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/file_uploader.rb:40:in `upload'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/customizations/object.rb:477:in `block in upload_file'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-core-3.227.0/lib/aws-sdk-core/plugins/user_agent.rb:90:in `metric'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/aws-sdk-s3-1.182.0/lib/aws-sdk-s3/customizations/object.rb:476:in `upload_file'
/var/www/discourse/lib/backup_restore/s3_backup_store.rb:48:in `upload_file'
/var/www/discourse/lib/backup_restore/backuper.rb:351:in `upload_archive'
/var/www/discourse/lib/backup_restore/backuper.rb:41:in `run'
/var/www/discourse/script/spawn_backup_restore.rb:9:in `backup'
/var/www/discourse/script/spawn_backup_restore.rb:31:in `block in <main>'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `fork'
/var/www/discourse/script/spawn_backup_restore.rb:4:in `<main>'

La dernière sauvegarde date d’hier mais maintenant cela ne fonctionne plus, d’autres services peuvent toujours sauvegarder sur mon S3 local sans problème.

Quelqu’un sait comment je peux résoudre ce problème ?

Oui. AWS a cassé la bibliothèque S3 pour de nombreux autres services.

Can't rebuild due to AWS SDK gem bump and new AWS Data Integrity Protections contient des solutions de contournement.

J’ai créé ce aws-revert-template.yml pour revenir à une ancienne version. Je ne sais pas si cela fonctionne encore ; mon fichier date du 2025-08-06T05:00:00Z

Hmm, je ne suis pas entièrement convaincu que ce soit le problème, cependant

à moins que je ne me trompe, j’étais sur la version 3.6 plus longtemps que 2 jours, et pourtant j’ai eu une sauvegarde il y a 2 jours et 10 jours.

Pas beaucoup plus. Je pense que vous vous trompez.

Voici le commit sur lequel vous êtes :

Mais aussi :

Votre bucket s’appelle-t-il « default » ?

Oui, je suis maintenant sur le commit, je ne l’étais pas initialement lorsque j’ai posté ce problème, j’ai mis à jour pour exclure un bug.

non, comme indiqué dans le premier message, c’est pourquoi je ne crois pas qu’il s’agisse du même problème auquel vous faites référence, mon bucket est spécifié, j’ai essayé à la fois dans les paramètres de l’interface utilisateur de la section de sauvegarde et via des variables d’environnement dans le yaml, il essaie toujours d’utiliser la valeur par défaut quoi qu’il en soit.

pour clarifier, rien n’a changé du côté de discourse ou de garage depuis qu’il a cessé de fonctionner, à l’exception d’une mise à jour vers 3.5 puis vers 3.6.

1 « J'aime »

peut-être que quelqu’un avec un vrai S3 pourrait vérifier s’il sélectionne correctement un bucket ? Idem pour d’autres tiers comme Backblaze, R2, etc. ?

J’ai donc créé un bucket nommé « Default » et il fonctionne comme prévu, donc oui, il ne sélectionne pas correctement le nom du bucket que je lui indique.

Sauf que des milliers de personnes et l’hébergement CDCK seraient également probablement affectés et ce n’est pas le cas. Il est beaucoup plus probable que vous ayez supprimé ou ajouté un caractère à une ligne de votre app.yml.

Vous pouvez faire des choses comme ceci :

grep -i S3 /var/discourse/containers/*
docker exec -it app bash -c 'grep s3 /var/www/discourse/config/discourse.conf

Et si vous avez configuré s3 dans les paramètres au lieu d’utiliser des variables d’environnement, vous pouvez consulter Configurer un fournisseur de stockage d’objets compatible S3 pour les téléchargements pour voir à quoi ils ressemblent.

rien ne va pas avec ma configuration, rien n’a été modifié à part la mise à jour de Discourse. J’ai essayé la configuration dans le yaml et la configuration dans l’interface utilisateur, les paramètres de l’interface utilisateur l’affichent littéralement comme « cyanlabs-community » et pourtant la sauvegarde essaie toujours de sauvegarder dans « default »

malgré la configuration s3 dans l’interface utilisateur, le fichier discourse.conf ne contient aucune référence s3 comme le montre votre deuxième commande

Cependant, cela signifie que le bucket n’existe pas. Pouvez-vous essayer de créer un tout nouveau bucket et de nouvelles informations d’identification et voir si le téléchargement fonctionne alors ?

1 « J'aime »

Merci, mais j’ai l’impression de tourner en rond ici.

Le bucket par défaut n’existait pas au début de cette conversation, je l’ai depuis créé et il utilise ce bucket malgré le fait que le bucket cyanlabs-community soit défini dans les paramètres.

cyanlabs-community et default existent tous deux dans l’instance s3, mais Discourse n’utilisera pas cyanlabs-community quoi que j’essaie.

Nouveau bucket cyanlabsdiscourse

Résultat de la sauvegarde

[2025-09-22 15:14:59] Finalizing backup...
[2025-09-22 15:14:59] Finalizing database dump file: cyanlabs-official-community-2025-09-22-151437-v20250916082012.sql.gz
[2025-09-22 15:14:59] Removing tmp '/var/www/discourse/tmp/backups/default/2025-09-22-151437' directory...
[2025-09-22 15:14:59] Uploading archive...
[2025-09-22 15:15:37] Executing the after_create_hook for the backup...
[2025-09-22 15:15:37] Deleting old backups...
[2025-09-22 15:15:37] Cleaning stuff up...
[2025-09-22 15:15:37] Removing archive from local storage...
[2025-09-22 15:15:37] Removing '.tar' leftovers...
[2025-09-22 15:15:37] Marking backup as finished...
[2025-09-22 15:15:37] Refreshing disk stats...
[2025-09-22 15:15:37] Notifying 'CyanLabs' of the end of the backup...
[2025-09-22 15:15:40] Finished!

Bucket cyanlabsdiscourse

Bucket default

Ce qui est intéressant, c’est qu’il tente toujours d’établir la connexion à bucketname.s3.domain.tld, par exemple cyanlabsdiscourse.s3.domain.tld, car sans ajouter d’enregistrement DNS, cela ne fonctionnerait pas à ce sous-sous-domaine. Le paramètre est donc respecté pour l’URL, mais il semble être ignoré par la sélection du bucket.

J’ai l’impression d’avoir tout essayé, pour l’instant je vais juste utiliser le bucket par défaut, je suppose.

AWS peut être mystérieux ! Désolé que vous n’ayez pas pu obtenir le nom de bucket souhaité. Difficile d’aider sans pouvoir le reproduire, donc je suppose que vous devrez vous contenter d’utiliser le nom de bucket par défaut.