Après la mise à jour vers la dernière version, certains avatars d'utilisateurs sont devenus des images par défaut, aucun nouvel avatar ne peut être téléchargé. Le journal indique une erreur de conversion

J’ai mis à jour vers la version Discourse v2026.8.0-latest il y a quelques jours. Les avatars de certains utilisateurs sont passés à une image par défaut (et non à l’avatar avec une lettre). L’essai d’upload d’une nouvelle image ne fait rien. L’aperçu montre l’image, mais après avoir sauvegardé, elle revient à l’image par défaut. Cela ne fait aucune différence si c’est l’utilisateur ou un administrateur qui le fait. L’interface n’affiche aucun message d’erreur.

J’ai d’abord essayé de rafraîchir les avatars avec rake, sans succès. J’ai ensuite vérifié les journaux et regardé s’il y avait quelque chose qui s’affichait lorsque j’essayais de changer l’image de l’avatar, et j’ai trouvé le message de journal suivant :

Échec de l’optimisation de l’image : raison inconnue upload_id: location: {raise_on_error: true, quality: 90, upload_id: 235861} error_message: pas de conversion implicite de Hash en String instructions: [“convert”, “png:/var/www/discourse/public/uploads/default/original/3X/2/c/2c620efd4ee10548884a11b7237d5aa9135817b1.png[0]”, “-quality”, “90”, “-auto-orient”, “-gravity”, “center”, “-background”, “transparent”, “-thumbnail”, “24x24^”, “-extent”, “24x24”, “-interpolate”, “catrom”, “-unsharp”, “2x0.5+0.7+0”, “-interlace”, “none”, “-profile”, “/var/www/discourse/vendor/data/RT_sRGB.icm”, “png:/tmp/discourse-thumbnail20260730-360984-9yk3a1.png”]

Fichier envoyé /var/www/discourse/public/images/avatar.png (0,3 ms)

Je suppose donc qu’il y a une incompatibilité de type dans le code qui gère l’optimisation des images.

Ce qui est drôle, c’est que je ne peux pas non plus uploader un avatar sur ce forum, suspectant que quelque chose de similaire se produit ici aussi. Au moins ici, j’obtiens un message d’erreur disant que « quelque chose s’est mal passé ».

Une idée de comment je peux résoudre ce problème, ou n’y a-t-il rien que je puisse faire d’autre que d’attendre une correction ?

Pourriez-vous partager la trace complète (backtrace) pour ce journal ? Vous pouvez la trouver en accédant à /logs, en sélectionnant l’entrée concernée, puis en choisissant l’onglet « backtrace » en bas.

Bien sûr, la voici.

Message (5 copies signalées)

Échec de l'optimisation de l'image : raison inconnue

Traceback

/var/www/discourse/lib/discourse.rb:1115:in 'block in Discourse.warn'
/var/www/discourse/lib/discourse.rb:1109:in 'Array#each'
/var/www/discourse/lib/discourse.rb:1109:in 'Discourse.warn'
/var/www/discourse/app/models/optimized_image.rb:362:in 'OptimizedImage.convert_with'
/var/www/discourse/plugins/discourse-topic-previews-sidecar/lib/topic_previews/optimized_image_extension.rb:25:in 'TopicPreviews::OptimizedImageExtension#optimize'
/var/www/discourse/app/models/optimized_image.rb:317:in 'OptimizedImage.resize'
/var/www/discourse/lib/upload_creator.rb:583:in 'UploadCreator#crop!'
/var/www/discourse/lib/upload_creator.rb:115:in 'block in UploadCreator#create_for'
/var/www/discourse/lib/distributed_mutex.rb:53:in 'block in DistributedMutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in 'Thread::Mutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in 'DistributedMutex#synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in 'DistributedMutex.synchronize'
/var/www/discourse/lib/upload_creator.rb:102:in 'UploadCreator#create_for'
/var/www/discourse/app/models/user_avatar.rb:133:in 'UserAvatar.import_url_for_user'
/var/www/discourse/app/jobs/regular/download_avatar_from_url.rb:17:in 'Jobs::DownloadAvatarFromUrl#execute'
/var/www/discourse/app/jobs/base.rb:313:in 'block (2 levels) in Jobs::Base#perform'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management/null_instance.rb:49:in 'RailsMultisite::ConnectionManagement::NullInstance#with_connection'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/rails_multisite-7.0.0/lib/rails_multisite/connection_management.rb:17:in 'RailsMultisite::ConnectionManagement.with_connection'
/var/www/discourse/app/jobs/base.rb:300:in 'block in Jobs::Base#perform'
/var/www/discourse/app/jobs/base.rb:297:in 'Array#each'
/var/www/discourse/app/jobs/base.rb:297:in 'Jobs::Base#perform'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:220:in 'Sidekiq::Processor#execute_job'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:185:in 'block (4 levels) in Sidekiq::Processor#process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:180:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/suppress_user_email_errors.rb:6:in 'Sidekiq::SuppressUserEmailErrors#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/discourse_event.rb:6:in 'Sidekiq::DiscourseEvent#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/lib/sidekiq/pausable.rb:131:in 'Sidekiq::Pausable#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/job/interrupt_handler.rb:9:in 'Sidekiq::Job::InterruptHandler#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:183:in 'block in Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:26:in 'Sidekiq::Metrics::ExecutionTracker#track'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/metrics/tracking.rb:134:in 'Sidekiq::Metrics::Middleware#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:182:in 'Sidekiq::Middleware::Chain#traverse'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/middleware/chain.rb:173:in 'Sidekiq::Middleware::Chain#invoke'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:184:in 'block (3 levels) in Sidekiq::Processor#process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:145:in 'block (6 levels) in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/job_retry.rb:118:in 'Sidekiq::JobRetry#local'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:144:in 'block (5 levels) in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/config.rb:39:in 'block in <class:Config>'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:139:in 'block (4 levels) in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:281:in 'Sidekiq::Processor#stats'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:134:in 'block (3 levels) in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/job_logger.rb:15:in 'Sidekiq::JobLogger#call'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:133:in 'block (2 levels) in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/job_retry.rb:85:in 'Sidekiq::JobRetry#global'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:132:in 'block in Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/job_logger.rb:40:in 'Sidekiq::JobLogger#prepare'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:131:in 'Sidekiq::Processor#dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:183:in 'block (2 levels) in Sidekiq::Processor#process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'Thread.handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:182:in 'block in Sidekiq::Processor#process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Thread.handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:181:in 'Sidekiq::Processor#process'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:86:in 'Sidekiq::Processor#process_one'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/processor.rb:76:in 'Sidekiq::Processor#run'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/component.rb:10:in 'Sidekiq::Component#watchdog'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/sidekiq-7.3.10/lib/sidekiq/component.rb:19:in 'block in Sidekiq::Component#safe_thread'

Il semble que cela vienne du plugin d-topic-previews-sidecar. Je vais y jeter un œil et leur soumettre une PR pour la modification du code source.

C’est surprenant. Nous n’avons pas ce plugin installé ici, et les téléchargements d’avatars semblent fonctionner pour moi. Pourriez-vous essayer une fois de plus ? Si vous obtenez une erreur, un capture d’écran serait très apprécié !

Ah, il semble que ce plugin soit archivé et ne soit plus maintenu (readme). Vous devriez le supprimer de votre fichier app.yml et exécuter ./launcher rebuild app.

Oui, j’ai remplacé le plugin original par le package legacy après que le dépôt original ait été complètement supprimé et soit devenu inaccessible. Je vais essayer de le désinstaller pour voir si cela change quelque chose.

Voici le message d’erreur qui s’affiche lorsque j’essaie de télécharger un avatar ici :

Mais ça fonctionne maintenant, ça devait venir de mon côté.

En tout cas, je vous tiens au courant après avoir désactivé le plugin.

J’ai rencontré cette erreur après avoir ouvert un sujet il y a une demi-heure. Je n’ai pas d’étapes de reproduction.

J’ai supprimé l’extension et tout semble fonctionner correctement à nouveau. Merci pour votre aide et désolé pour le dérangement.