Implosione dopo l'aggiornamento 2.7beta7

Ciao a tutti,

Gestiamo un’istanza auto-ospitata di Discourse all’indirizzo https://discourse.bokeh.org da diversi anni. In generale, è stata estremamente stabile e ha richiesto quasi zero manutenzione; in particolare, gli aggiornamenti sono stati quasi sempre eventi insignificanti che si sono conclusi perfettamente senza alcun problema.

Tuttavia, oggi, dopo un aggiornamento alla versione 2.7beta7 (che sembrava completarsi senza errori), il nostro sito è collassato completamente. Ha continuato a funzionare in modo precario per un po’ con pagine visualizzate in modo errato e errori nella console JS, ma dopo aver tentato un rollback, l’interfaccia utente è diventata non funzionante. Accedendo al droplet, ho anche provato invano:

Ricostruzione

./launcher rebuild app

Questo è fallito in diversi modi in diversi tentativi.

Discourse Doctor

./discourse-doctor

Ripristino

./launcher enter app
discourse restore <backup file>

Questo è fallito.

Pulizia

Ho anche provato a eseguire un “wipe” e poi un ripristino:

./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/

Dopo questo, sono riuscito almeno a far riuscire una ricostruzione, che ha portato a uno stato di “installazione pulita”, ad esempio “Congratulazioni, hai installato Discourse!”.

Quindi ora ho provato a eseguire nuovamente discourse restore, ma anche questo è fallito:

ECCEZIONE: 1 post non sono stati rimappati al nuovo URL di caricamento S3. La migrazione S3 è fallita per il database 'default'. /var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log' /var/www/discourse/lib/file_store/to_s3_migration.rb:86:in `migration_successful?' /var/www/discourse/lib/file_store/to_s3_migration.rb:357:in `migrate_to_s3' /var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate' /var/www/discourse/lib/file_store/s3_store.rb:240:in `copy_from' /var/www/discourse/lib/backup_restore/uploads_restorer.rb:62:in `restore_uploads' /var/www/discourse/lib/backup_restore/uploads_restorer.rb:44:in `restore' /var/www/discourse/lib/backup_restore/restorer.rb:62:in `run' script/discourse:145:in `restore' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/command.rb:27:in `run' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch' /var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.1.0/lib/thor/base.rb:485:in `start' script/discourse:286:in `' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `load' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:63:in `kernel_load' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli/exec.rb:28:in `run' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:494:in `exec' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:30:in `dispatch' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/cli.rb:24:in `start' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:49:in `block in ' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors' /usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.7/exe/bundle:37:in `' /usr/local/bin/bundle:23:in `load' /usr/local/bin/bundle:23:in `' Tentativo di rollback in corso... Rollback in corso... Pulizia dei dati... Rimozione delle funzioni dallo schema discourse_functions... Rimozione della directory tmp '/var/www/discourse/tmp/restores/default/2021-04-23-235404'... Segnatura del ripristino come completato... Notifica al sistema della fine del ripristino... Completato! [FALLITO]

La cosa strana è che durante il ripristino, il sito sembrava tornare alla normalità, con la comparsa dei vecchi contenuti. Poi si è verificato il fallimento e ora non viene mostrato nulla, gli account sono spariti, ecc.

Potrei davvero usare qualsiasi guida o suggerimento qui. Abbiamo backup giornalieri fino a una settimana fa (e anche più indietro su Glacier se necessario). Abbiamo eliminato una categoria non utilizzata qualche giorno fa; potrebbe essere la causa del problema? Proverò con un backup più vecchio per verificare, ma qualsiasi indicazione su un processo di ripristino infallibile sarebbe benvenuta.

2 Mi Piace

Un backup più vecchio non ha aiutato. Durante il ripristino, le cose sembrano “abbastanza bene”

Fino alla fine, per poi passare immediatamente a questo:

A proposito, il backup non contiene i post che sono stati importati inizialmente da una mailing list, ma che sono presenti sul sito Discourse da anni?? Avevamo 24k post, non 5k prima di questo.

2 Mi Piace

È possibile ricompilare l’app su una versione precedente di Discourse, ad esempio 2.7beta6?

2 Mi Piace

In alternativa, immagino che ci sia letteralmente un solo post che sta causando qualche problema

ECCEZIONE: 1 post non è stato rimappato al nuovo URL di caricamento S3. La migrazione S3 è fallita per il database ‘default’.

È possibile trovare questo post ed eliminarlo o rimuoverlo?

2 Mi Piace

Hai immagini su S3?

2 Mi Piace

@pfaffman Sì, abbiamo immagini su S3

2 Mi Piace

Mmh. Beh, forse c’è solo un post danneggiato? Immagino che dovresti ripristinare il database, correggerlo e poi ricreare il file di backup con il nuovo database. Ma è davvero difficile dirlo con certezza.

2 Mi Piace

Ci sono delle istruzioni da qualche parte su come farlo? Come posso capire qual è il singolo post rotto?

Modifica: in alternativa, c’è qualcuno con le competenze necessarie che può essere ingaggiato per fornire servizi?

2 Mi Piace

Hai un backup o uno snapshot recente di un droplet da cui puoi ripristinare?

2 Mi Piace

Hai un backup recente di un droplet o uno snapshot da cui puoi ripristinare?

Purtroppo, no. I backup di DO sono solo settimanali e avevo configurato backup giornalieri di Discourse su S3, mantenendo una settimana di dati aggiornati e un anno di archivio su Glacier. Data la mia precedente esperienza positiva con molti aggiornamenti di Discourse, pensavo che sarebbe stato sia sufficiente sia migliore (e avevo già eseguito con successo dei test di ripristino).

2 Mi Piace

diciamo
version: 94301854938a0b36dd64666fb7a7c8406544a781, che è il commit immediatamente precedente all’aumento della versione beta

3 Mi Piace

Bene, in realtà si tratta di un aggiornamento. In un momento di disperazione, ho semplicemente interrotto bruscamente lo script di ripristino durante la fase di

Sincronizzazione dei file su S3

prima che segnalasse il singolo post errato e iniziasse un rollback.

Il sito è effettivamente tornato online ed era accessibile in modalità sicura. Ho disabilitato il componente del tema “Copia e incolla” per i blocchi di codice, che sembra ora essere ampiamente incompatibile con l’ultima beta. Dopo di ciò, il sito sembra essere per lo più funzionante, anche senza modalità sicura. Tuttavia:

  • Ci sono azioni consigliate per assicurarsi che tutto sia il più possibile “pulito”? Ad esempio, ricaricare le risorse su S3 e “ribaking”? Dove si trovano le istruzioni migliori e più aggiornate per farlo?

EDIT: per quanto ne so, tutto è tornato alla normalità. Le immagini nei vecchi post vengono caricate correttamente da S3/CDN. Quindi la mia domanda è: se stiamo caricando le immagini su S3, dovremmo deselezionare questa opzione?

Includi gli upload nei backup programmati. Disabilitando questa opzione, verrà effettuato il backup solo del database.

Pensavo che averla selezionata offrisse un ulteriore livello di ridondanza, ma sembra che sia la causa di tutti questi problemi durante il ripristino?

2 Mi Piace

L’ultima volta che ho migrato verso un altro provider di hosting ho avuto problemi anche con S3 durante il ripristino. Quindi ho chiesto informazioni e la risposta è stata sì. Quando archivi le immagini su S3, devi eseguire il backup senza includere gli upload. Solo il database. Ma non so se nel tuo caso questa sia la soluzione. Se decidi di provarlo, crea prima uno snapshot.

Puoi vedere maggiori informazioni qui: Restore a backup from the command line - #28

L’ho appena provato e ha funzionato perfettamente senza alcun problema. :slightly_smiling_face:

2 Mi Piace

Posso aiutarti. Lunedì, o prima per un compenso straordinario.

Puoi Contact Us - Literate Computing il nostro S3, l’indirizzo email in fondo alla pagina.

2 Mi Piace

@pfaffman Grazie! Il sito sembra ora funzionare completamente normalmente, ma non rifiuterei un rapido controllo / verifica di sanità mentale a tua convenienza, se sei disponibile. In ogni caso, ho annotato le tue informazioni di contatto commerciali per eventuali future emergenze. :slight_smile:

Ecco un resoconto retroattivo, nel caso sia utile per qualcun altro


SINTESI

Dopo un aggiornamento (riuscito), un componente del tema non ufficiale incompatibile ha reso l’interfaccia utente del sito rotta. Questo non era noto al momento, quindi è stato avviato il processo di ripristino dal backup, ma ha incontrato problemi a causa di una configurazione meno che ideale.

DETTAGLI

  1. È stato avviato un aggiornamento a 2.7beta7, completato con successo.

  2. Tuttavia, dopo l’aggiornamento, l’interfaccia utente del sito è stata gravemente compromessa: i corpi dei post erano completamente assenti, la navigazione superiore (incluso utente/accesso) era completamente assente, la console JS segnalava errori.

    1. La ragione di ciò si è rivelata essere un componente di tema di terze parti incompatibile per copiare-incollare i blocchi di codice, ma questo non era noto al momento.

    2. Inoltre, non era nota al momento la possibilità di entrare in modalità sicura. Se ciò fosse stato noto, gli altri problemi avrebbero potuto essere evitati.

  3. È stato ottenuto l’accesso a \admin tramite navigazione diretta e è stato avviato un tentativo di rollback. Questo ha immediatamente disconnesso l’utente e non sembrava esserci alcun modo per riaccedere con l’interfaccia utente rotta.

  4. Accesso al Droplet di DO per avviare un ripristino manuale con l’ultimo file tar di backup da S3.

  5. Molti tentativi di ripristino sono falliti vicino al passaggio finale, dopo il caricamento delle risorse S3, a causa di un singolo post con qualche errore.

    1. Questo è evidentemente dovuto al fatto che i ripristini che tentano di ricaricare le risorse su S3 possono essere instabili (diversi report su Meta).
    2. Tuttavia, non era necessario eseguire il backup delle risorse di caricamento, poiché sono già memorizzate su S3!
  6. Durante uno dei molti tentativi di ripristino, il sito è stato anche cancellato per ripartire da “zero” in modo che i rollback dopo i fallimenti del ripristino ora tornassero a un sito vuoto.

  7. Alla fine, in una scommessa disperata, ho eseguito il ripristino e ho interrotto bruscamente lo script durante il caricamento su S3 (proprio prima del fallimento e del rollback).

  8. Il sito è tornato online, ma presentava i precedenti problemi di interfaccia utente. Tuttavia, ora la modalità sicura era nota e utilizzata, e il sito funzionava normalmente con plugin e temi disabilitati.

  9. Tutti i plugin e i temi non ufficiali sono stati rimossi (incluso il componente “copia-incolla”), dopo di che il sito ha funzionato normalmente.

  10. Verificato che le immagini precedentemente caricate fossero ancora visibili e provenienti dal CDN S3.

Sospetto che l’ultimo caricamento e la “ricottura” non fossero necessari poiché le risorse erano già presenti su S3 e i post non dovevano essere aggiornati per utilizzare nuovi URL.

Non sono certo quali passaggi di ripristino, se ce ne fossero stati, siano stati saltati dopo l’interruzione dello script, ma finora nessuno ha riscontrato problemi con il sito nel suo stato attuale.

LEZIONI / AZIONI

  • Iniziare con la modalità sicura per diagnosticare problemi in futuro.
  • Disattivare l’impostazione per includere i caricamenti nei backup (suggerirò a Discourse di avvisare su questa situazione).
  • Rimuovere tutti i plugin e i componenti del tema non ufficiali.
  • Suggerire di attivare la nuova funzione integrata di copia dei blocchi di codice.
  • Abilitare i backup settimanali delle immagini di Digital Ocean come misura di sicurezza per il recupero.
6 Mi Piace

Componente del tema o plugin? Potresti informare l’autore?

3 Mi Piace

@merefield Sembra che sia già noto, ed è così che ho scoperto questa possibilità

https://meta.discourse.org/t/copy-option-for-code-blocks-in-discourse/60961

4 Mi Piace

Se dovessi fare un suggerimento riguardo al processo di ripristino, sarebbe quello di offrire alcune opzioni per renderlo più robusto. Ad esempio, se l’unico ostacolo per un ripristino riuscito è un post difettoso, premerei il tasto Y senza esitazione se mi venisse chiesto: ‘Eliminare il post difettoso?’

3 Mi Piace

Questo sarà disponibile in una delle prossime betas 2.8. Purtroppo non è ancora pronto per la prossima release 2.7.

Mi dispiace di non aver visto prima la tua richiesta di aiuto. Ecco un consiglio per chiunque altro abbia problemi con il ripristino di backup archiviati su S3: estrai il file dump.sql.gz dal backup e rinominalo. Ad esempio, se il backup originale era discourse-2020-10-09-133921-v20201007124955.tar.gz, il file risultante dovrebbe chiamarsi discourse-2020-10-09-133921-v20201007124955.sql.gz. Il ripristino di quel file dovrebbe funzionare.

7 Mi Piace