Recentemente ho aggiornato i nostri testforum a 3.3.0beta1. Il testforum è fondamentalmente una copia un po’ obsoleta (a livello di contenuti) dei nostri forum live. Lo utilizziamo per testare aggiornamenti e nuove funzionalità. Utilizza la stessa connessione Amazon S3 per i caricamenti dei file dei forum live.
Dopo aver aggiornato il sistema operativo host all’ultima versione di Ubuntu 24.04 LTS e aver aggiornato i forum a 3.3.0beta1, tutti gli avatar personalizzati sono scomparsi e viene visualizzata l’icona della testa bianca/grigia.
Dopo aver esaminato i log, trovo messaggi come:
Impossibile trovare il file nello store situato all'URL: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/6/9/69ca9110f27d91561axyz52a9cd9485a970fe9.jpeg
Anche se in realtà l’immagine esiste a quell’URL e funziona abbastanza bene. Ho provato a scaricare il file dal server con wget per vedere se ci fossero problemi di DNS o altro che potessero impedire al proxy avatar locale di ottenerlo, ma anche questo non è il caso.
Sembra che questo non stia accadendo solo sui forum di test, ma anche sui forum live gli avatar stanno scomparendo pezzo per pezzo con gli stessi errori nel log.
Mi chiedo se il forum di test stia eliminando cose che non si aspetta nel bucket s3, ma dici che la roba è nel bucket, quindi non è quello. Forse ripristina un database per il testing e guarda cosa c’è nel modello di caricamento.
Il fatto è che il messaggio di errore nel log indica che non riesce a caricare una certa immagine, ma quell’immagine esatta è effettivamente disponibile. Quindi, suppongo che ci sia qualcosa che impedisce al proxy del forum/avatar di recuperare l’immagine.
Ho appena caricato un nuovo avatar sul testserver (in esecuzione 3.3.0beta1). È stato caricato, è apparso nell’anteprima ma poi non è riuscito a caricarsi di nuovo.
/var/www/discourse/app/models/optimized_image.rb:81: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:73:in `create_for'
/var/www/discourse/app/models/upload.rb:130:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:218:in `get_optimized_image'
/var/www/discourse/app/controllers/user_avatars_controller.rb:136:in `show_in_site'
/var/www/discourse/app/controllers/user_avatars_controller.rb:89:in `block (2 levels) in show'
/var/www/discourse/lib/hijack.rb:64:in `instance_eval'
/var/www/discourse/lib/hijack.rb:64:in `block in hijack'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:911:in `callback_on_resolution'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:797:in `call_callback'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:803:in `call_callbacks'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:692:in `resolve_with'
concurrent-ruby-1.2.3/lib/concurrent-ruby/concurrent/promises.rb:1325:in `resolve'
/var/www/discourse/lib/scheduler/defer.rb:115:in `block in do_work'
rails_multisite-5.0.1/lib/rails_multisite/connection_management/null_instance.rb:49:in `with_connection'
rails_multisite-5.0.1/lib/rails_multisite/connection_management.rb:21:in `with_connection'
/var/www/discourse/lib/scheduler/defer.rb:109:in `do_work'
/var/www/discourse/lib/scheduler/defer.rb:97:in `block (2 levels) in start_thread'
Questo è tratto dal log.
Il messaggio di log per questo è:
Impossibile trovare il file nello store situato all'URL: //ourbucket.s3.dualstack.eu-central-1.amazonaws.com/original/3X/0/2/02832e36e27bbad791fda46e2290df31e5ee2dda.jpeg
(ho modificato l’URL in modo che non funzioni, anche se quello reale funziona)
‘block in hijack’ è ciò che mi lascia perplesso.
Stiamo operando dietro Cloudflare sul sistema live. Il sistema di test è “solo DNS”, quindi ovviamente non filtrato da cloudflare. Abbiamo avuto alcuni problemi di recente con i bot sul sito principale con cui abbiamo giocato un po’ con i filtri di Cloudflare.
Ma allora perché il recupero da un URL amazonaws.com dovrebbe essere un problema per questo - e di nuovo il sito di test non è gestito da cloudflare.
Sono davvero bloccato su questo. Sembra interessare sia i forum live che quelli di test: il live è ancora su una versione precedente e il problema non sembra nemmeno essere iniziato con l’aggiornamento, ma è apparso qualche giorno fa senza che avvenissero modifiche degne di nota.
Quindi quello che succede è che Discourse carica correttamente i nuovi avatar personalizzati su S3, applica loro le ACL per quanto posso vedere correttamente e i file sono anche pubblicamente accessibili tramite l’URL che discourse cerca di utilizzare per importarli nel proxy avatar, tuttavia non riesce a farlo (vedi lo stack trace sopra).
Qualcuno con una buona conoscenza di come funziona il proxy avatar ha qualche idea o può estrarre qualcosa da quello stack trace?
Ho fatto un wget dell’URL dell’immagine dai server e funzionano tutti bene, quindi non c’è nulla che dovrebbe bloccare l’accesso a quell’URL.
Ah sì, scusa se non è stato chiaro. Posso accedervi dal browser (quindi ho presunto la disponibilità pubblica) e anche dal server (per escludere che sia qualche tipo di problema che il server ha nell’ottenerli. È davvero solo discourse che non li ottiene per qualsiasi motivo (vedi stack trace sopra).
Hai trovato una soluzione al tuo problema? Stiamo riscontrando esattamente lo stesso problema nella versione 3.2.1. Il bucket ha tutto l’accesso pubblico bloccato, tuttavia funzionava ancora tramite URL pre-firmati. Ora sto riscontrando esattamente lo stesso errore:
Impossibile trovare il file nello store situato all'URL: