Il ripristino non riesce a causa di un errore nella migrazione S3

Gestiamo in proprio il database di Discourse e stiamo cercando di migrare su un nuovo server.

Entrambi i lati (vecchio e nuovo) sono aggiornati all’ultima versione di Discourse (è stata eseguita una ricostruzione dell’app su entrambi i lati con pochi minuti di differenza) e la migrazione al nuovo Postgresql è stata completata con successo sul server vecchio qualche giorno fa. Escluderei quindi questi elementi come fonte dei nostri problemi.

Tutti i nostri caricamenti (uploads) sono memorizzati su un object storage compatibile con S3 (Digitalocean Spaces), quindi in teoria la migrazione dovrebbe essere semplice. Pensavo che se la parte “post e categorie” del ripristino funzionava correttamente, allora i link ai caricamenti su S3 avrebbero funzionato, giusto?

Sbagliato. Ogni volta che eseguo il ripristino del backup sul nuovo server, la parte dei post va al 100% a buon fine, ma poi fallisce sulla parte S3.

Questo è l’errore che vediamo.

Riconnessione al database...
Ricaricamento delle impostazioni del sito...
Disattivazione delle email in uscita per gli utenti non staff...
Esecuzione di seed fu...
Disattivazione della modalità sola lettura...
Cancellazione della cache delle categorie...
Ricaricamento delle traduzioni...
Rimappatura dei caricamenti...
Ripristino dei caricamenti, questa operazione potrebbe richiedere del tempo...
Migrazione dei caricamenti su S3 per 'default'...
Caricamento dei file su S3...
 - Elenco dei file locali
 => 3 file
 - Elenco dei file S3
..................................................................................................................................................... => 148892 file
 - Sincronizzazione dei file su S3
...
Aggiornamento degli URL nel database...
Rimozione delle immagini ottimizzate vecchie...
Marcatura di tutti i post contenenti lightbox per la ricottura (rebake)...
29368 post sono stati marcati per una ricottura
ECCEZIONE: rake posts:missing_uploads ha identificato 2274 problemi. La migrazione S3 per il db 'default' è fallita.
/var/www/discourse/lib/file_store/to_s3_migration.rb:132:in 'FileStore::ToS3Migration#raise_or_log'
/var/www/discourse/lib/file_store/to_s3_migration.rb:104:in 'FileStore::ToS3Migration#migration_successful?'
/var/www/discourse/lib/file_store/to_s3_migration.rb:384:in 'FileStore::ToS3Migration#migrate_to_s3'
/var/www/discourse/lib/file_store/to_s3_migration.rb:59:in 'FileStore::ToS3Migration#migrate'
/var/www/discourse/lib/file_store/s3_store.rb:372:in 'FileStore::S3Store#copy_from'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:69:in 'BackupRestore::UploadsRestorer#restore_uploads'
/var/www/discourse/lib/backup_restore/uploads_restorer.rb:49:in 'BackupRestore::UploadsRestorer#restore'
/var/www/discourse/lib/backup_restore/restorer.rb:179:in 'BackupRestore::Restorer#restore_uploads'
/var/www/discourse/lib/backup_restore/restorer.rb:72:in 'BackupRestore::Restorer#run'
script/discourse:242:in 'DiscourseCLI#restore'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/command.rb:28:in 'Thor::Command#run'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/invocation.rb:127:in 'Thor::Invocation#invoke_command'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor.rb:538:in 'Thor.dispatch'
/var/www/discourse/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/base.rb:585:in 'Thor::Base::ClassMethods#start'
script/discourse:396:in '<top (required)>'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli/exec.rb:61:in 'Kernel.load'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli/exec.rb:61:in 'Bundler::CLI::Exec#kernel_load'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli/exec.rb:24:in 'Bundler::CLI::Exec#run'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli.rb:504:in 'Bundler::CLI#exec'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/vendor/thor/lib/thor.rb:538:in 'Bundler::Thor.dispatch'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/cli.rb:29:in 'Bundler::CLI.start'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/exe/bundle:28:in 'block in <top (required)>'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/lib/bundler/friendly_errors.rb:118:in 'Bundler.with_friendly_errors'
/usr/local/lib/ruby/gems/3.4.0/gems/bundler-4.0.11/exe/bundle:20:in '<top (required)>'
/usr/local/bin/bundle:25:in 'Kernel#load'
/usr/local/bin/bundle:25:in '<main>'
Tentativo di rollback...
Rollback in corso...
Pulizia in corso...
Eliminazione delle funzioni dallo schema discourse_functions...
Rimozione della directory tmp '/var/www/discourse/tmp/restores/default/2026-08-11-075958'...
Ripristino di sidekiq...
Marcatura del ripristino come completato...
Notifica a 'system' della fine del ripristino...
Completato!
[FAILED]
Ripristino effettuato.

Ho alcune domande:

  • perché fallisce quando in principio la configurazione dell’ambiente S3 che abbiamo salvato nel database è invariata?
  • perché crasha, invece di creare un elenco dei 2274 problemi che ha trovato con i caricamenti che potrei gestire in qualche modo?
  • perché esegue automaticamente il rollback a un database vuoto, lasciandomi in mezzo al nulla?
  • C’è un modo per me di prendere il controllo, lasciarlo completare il ripristino con successo o almeno non eseguire il rollback e lasciarmi gestire i problemi che ha trovato con i caricamenti?

Grazie mille in anticipo per qualsiasi aiuto!

Perché sta semplicemente contando i flag associati al backup. Questo non è il processo che individua effettivamente i problemi.

Idealmente, dovresti prima eliminare i flag dei caricamenti mancanti sul server vecchio, per poi creare un backup fresco.

Puoi eseguire un task che elencherà e tenterà di riparare i caricamenti mancanti sul server vecchio (potrebbe richiedere un po’ di tempo)

cd /var/discourse
./launcher enter app
VERBOSE=1 rake posts:missing_uploads

e poi segnare come ignorati eventuali rimanenti, se desideri procedere

GIVE_UP=1 VERBOSE=1 rake posts:missing_uploads

A quel punto potrai creare un nuovo backup e ripristinarlo.

Mille grazie per questa risposta! Mi è stata davvero molto utile perché, almeno, ho ottenuto un elenco completo di tutti gli argomenti che presentano problemi con i caricamenti.

Proverò a risolvere il maggior numero possibile di problemi, ma ora almeno ho una via d’uscita!