Impossibile caricare Avatars con S3 Storage abilitato (File esiste, fallisce comunque)

Ciao a tutti,

Sto riscontrando uno strano problema con Discourse + archiviazione S3.

Quando carico avatar, ricevo un errore come quello sottostante, anche se il file esiste nel bucket S3 ed è accessibile tramite un s3_cdn_url valido.

I caricamenti per post e allegati funzionano perfettamente. L’unica cosa che fallisce sono i caricamenti degli avatar utente.


:fire: Messaggio di errore da gig.ovh/logs


Messaggio (2 copie segnalate)

Impossibile trovare il file nello store situato all'URL: //gig.s3.ru-1.storage.selcloud.ru/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active\ _support/broadcast\ _logger.rb:134:in `block in error'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `block in dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active\ _support/broadcast\ _logger.rb:231:in `each'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active_support/broadcast_logger.rb:231:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activesupport-7.2.2.1/lib/active\ _support/broadcast\ _logger.rb:134:in `error'
/var/www/discourse/app/models/optimized_image.rb:91:in `block in create\ _for'
/var/www/discourse/app/models/optimized\ _image.rb:19:in `block (2 levels) in lock'
/var/www/discourse/lib/distributed_mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:19:in `block in lock'
/var/www/discourse/lib/distributed\ _mutex.rb:53:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed\ _mutex.rb:49:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:34:in `synchronize'
/var/www/discourse/app/models/optimized\ _image.rb:18:in `lock'
/var/www/discourse/app/models/optimized_image.rb:83:in `create\ _for'
/var/www/discourse/app/models/upload.rb:151:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:219:in `get\ _optimized_image'
/var/www/discourse/app/controllers/user\ _avatars_controller.rb:137:in `show_in_site'
/var/www/discourse/app/controllers/user_avatars_controller.rb:90:in `block (2 levels) in show'
/var/www/discourse/lib/hijack.rb:68:in `instance_eval'
/var/www/discourse/lib/hijack.rb:68:in `block (2 levels) in hijack'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/i18n-1.14.7/lib/i18n.rb:353:in `with_locale'
/var/www/discourse/lib/hijack.rb:68:in `block in hijack'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:797:in `call\ _callback'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve\ _with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/concurrent-ruby-1.3.5/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'
/var/www/discourse/lib/scheduler/defer.rb:125:in `block in do\ _work'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails\ _multisite-6.1.0/lib/rails\ _multisite/connection\ _management/null\ _instance.rb:49:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rails_multisite-6.1.0/lib/rails_multisite/connection_management.rb:21:in `with\ _connection'
/var/www/discourse/lib/scheduler/defer.rb:119:in `do_work'
/var/www/discourse/lib/scheduler/defer.rb:105:in `block (2 levels) in start\ _thread'

Questo è un URL S3 per il container

//gig.s3.ru-1.storage.selcloud.ru/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

L’immagine è disponibile all’URL:

https://s3.gig.ovh/original/1X/fd42dfa3362b66090450f2ae40f0917193fcd355.jpeg

:white_check_mark: Informazioni aggiuntive

  • Versione di Discourse: (ultima stabile)
  • Archiviazione esterna compatibile con S3 utilizzata (enable_s3_uploads = true)
  • s3_cdn_url è configurato correttamente e utilizzato
  • L’URL CDN restituisce correttamente il file
  • Il file è confermato presente nella posizione S3 prevista
  • Altri caricamenti (immagini, allegati, ecc.) funzionano correttamente
  • L’errore si verifica solo con gli avatar utente

:red_question_mark: Domanda

Cosa potrebbe causare il fallimento di Discourse nel recuperare il file per l’elaborazione dell’avatar, mentre il file esatto esiste ed è raggiungibile tramite l’URL CDN corretto?

C’è qualcosa di specifico nell’elaborazione degli avatar (come get_optimized_image) che potrebbe essere configurato in modo errato o memorizzato nella cache in modo errato?

Qualsiasi suggerimento o approfondimento sarebbe apprezzato!

Grazie :folded_hands:

1 Mi Piace

Ciao, hai mai risolto questo problema?

Sto riscontrando esattamente lo stesso sintomo su Discourse + S3 (solo avatar):
Could not find file in the store located at url: //\u003cbucket\u003e.s3.dualstack.\u003cregion\u003e.amazonaws.com/original/1X/\u003chash\u003e.jpeg

Alcuni dettagli sulla mia configurazione, nel caso corrisponda alla tua:

  • enable_s3_uploads = true, gli oggetti si trovano in original/* e optimized/* (nessun prefisso uploads/default)

  • Accesso tramite CloudFront (OAC), il bucket stesso è privato

  • L’oggetto esiste a quella chiave; l’URL CDN funziona

  • L’errore si verifica solo per l’elaborazione degli avatar

  • (Possibile complicazione) i caricamenti sono crittografati con SSE-KMS

Se hai trovato la causa principale o una soluzione (modifica delle policy, permessi KMS, allineamento del percorso del bucket, ecc.), potresti condividere cosa ha funzionato? Grazie!