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!