Gestisco un sito Discourse e vorrei iniziare dicendo quanto ami questo software. Grazie a tutto il team per il ottimo lavoro, è uno strumento fantastico.
Dopo un aggiornamento alla versione 2.5.0, ho avuto grossi problemi. Ecco un riepilogo e la soluzione temporanea che ho adottato. Forse questo porterà a una correzione migliore nelle versioni future.
Alcuni dei topic presenti nel nostro database contengono upload danneggiati. Avevamo utilizzato la funzionalità “S3 uploads” e per errore abbiamo eliminato il bucket. Sì, è stata una cosa molto stupida da fare, ma beh, l’abbiamo fatta! Il risultato è stato che tutte le immagini dei topic sono andate perse.
A parte il fatto che avevamo perso molte immagini, tutto funzionava correttamente: Discourse mostrava link rotti verso immagini inesistenti, ma il sistema era stabile.
Tuttavia, quando abbiamo cercato di aggiornare alla versione 2.5.0, tutto è impazzito: tutti gli utenti loggati ricevevano errori 500, mentre i visitatori anonimi potevano vedere il sito.
Dopo aver indagato, ho capito che Discourse si bloccava a causa di errori “No such file”. Sembra che stesse tentando di scaricarle. Ho dovuto forzare il metodo local? a true in /var/www/discourse/app/models/upload.rb e questo ha risolto il problema, ma sono un po’ preoccupato per i prossimi aggiornamenti…
È chiaramente una novità, poiché gli aggiornamenti precedenti non avevano causato problemi.
A proposito, esiste un metodo che posso seguire per rimuovere tutti i link alle immagini non più presenti nei nostri topic?
Abbiamo riscontrato il comportamento opposto: l’utente loggato funziona correttamente, mentre quelli non loggati non riescono a connettersi e ricevono un errore 500.
Certo, nel mio log/production.log ho trovato la seguente eccezione (quando Discourse stava accedendo al bucket S3 vuoto (che ho ricreato, sperando che ciò avrebbe risolto il problema).
Started GET “/” for 86.246.127.170 at 2020-05-16 14:29:06 +0000
Processing by ListController#latest as HTML
Creating scope :open. Overwriting existing method Poll.open.
Completed 500 Internal Server Error in 3638ms (ActiveRecord: 0.0ms | Allocations: 135090)
NoMethodError (undefined method path' for nil:NilClass) /var/www/discourse/lib/file_store/base_store.rb:150:in cache_file’
Grazie, potrebbe essere proprio quello. In effetti ho installato due plugin: Discourse Adsense e discourse-chat-integration. Proverò a ricostruire senza di essi.
Posso confermare che questo non è causato da un plugin: ho riprodotto lo stesso bug con un’installazione pulita + ripristino del mio ultimo backup e senza plugin installati, a eccezione di docker_manager.
Il primo stacktrace che ho ottenuto è:
Completato 500 Internal Server Error in 4169ms (ActiveRecord: 0.0ms | Allocazioni: 72058)
NoMethodError (metodo path non definito per nil:NilClass)
/var/www/discourse/lib/file_store/base_store.rb:150:in `cache_file’
if file.nil?
return
end
FileUtils.cp(file.path, path)
Ciò ha portato a un secondo errore (quello che ho menzionato nel mio post iniziale):
Inizio GET “/” per 86.246.127.170 il 2020-05-18 07:37:40 +0000
Elaborazione da parte di CategoriesController#index come HTML
Completato 500 Internal Server Error in 4342ms (ActiveRecord: 0.0ms | Allocazioni: 60478)
NoMethodError (metodo path non definito per nil:NilClass)
/var/www/discourse/app/models/upload.rb:193:in `fix_dimensions!’
Che ho risolto forzando local? a true:
def local?
return true
!(url =~ /^(https?:)?///)
end
Sì, l’ho fatto. Ma poi il bucket è stato eliminato. E sono tornato all’archiviazione locale (con link alle immagini non funzionanti nei post precedenti, ovviamente).
Sì, sono d’accordo, ma ho paura di eseguire manualmente un’operazione di questo tipo sul database. Hai suggerimenti per farlo in modo “corretto”? Oppure è meglio farlo davvero “a mano”?
Inoltre, ho la sensazione che questo cambiamento di comportamento da parte di Discourse sia un po’ preoccupante. Significa, per quanto riesco a capire, che se in futuro ci sarà un link a un’immagine non valido da qualche parte, l’applicazione si bloccherà.
Prima non era così. Suggerirei di renderla più robusta in queste situazioni.
Sì, sembra lo stesso problema. @sukria, se aggiorni all’ultima versione con i test superati, ho aggiunto una correzione che rende il sistema più robusto per i caricamenti danneggiati (anche se dovresti comunque provare a pulire i riferimenti ai caricamenti danneggiati).
Grazie @david, confermo che una nuova compilazione contro tests-passed ha funzionato immediatamente. Grazie!
Hai qualche suggerimento su un modo adeguato e semplice per eliminare quei link non funzionanti negli argomenti?