Wiederherstellung schlägt aufgrund eines S3-Migrationsfehlers fehl

Wir hosten unsere eigene Discourse-Datenbank und versuchen, auf einen neuen Server zu migrieren.

Beide Seiten (alt & neu) wurden auf die neueste Discourse-Version aktualisiert (ein App-Rebuild auf beiden Seiten wurde mit einem Abstand von wenigen Minuten durchgeführt), und die Migration zur neuen PostgreSQL-Datenbank wurde vor einigen Tagen erfolgreich auf dem alten Server durchgeführt. Ich würde diese Punkte als Ursache unserer Probleme ausschließen.

Alle unsere Uploads werden in einem S3-kompatiblen Objektspeicher (Digitalocean Spaces) gespeichert, sodass die Migration theoretisch einfach sein sollte. Ich dachte, wenn der „Beiträge & Kategorien“-Teil der Wiederherstellung einwandfrei funktioniert, sollten die Links zu den S3-Uploads einfach funktionieren, oder?

Falsch. Immer wenn ich die Wiederherstellung unseres Backups auf dem neuen Server durchführe, verläuft der Teil mit den Beiträgen zu 100 % erfolgreich, schlägt dann aber beim S3-Teil fehl.

Dies ist der Fehler, den wir sehen.

Reconnecting to the database...
Reloading site settings...
Disabling outgoing emails for non-staff users...
Running seed fu...
Disabling readonly mode...
Clearing category cache...
Reloading translations...
Remapping uploads...
Restoring uploads, this may take a while...
Migrating uploads to S3 for 'default'...
Uploading files to S3...
 - Listing local files
 => 3 files
 - Listing S3 files
..................................................................................................................................................... => 148892 files
 - Syncing files to S3
...
Updating the URLs in the database...
Removing old optimized images...
Flagging all posts containing lightboxes for rebake...
29368 posts were flagged for a rebake
EXCEPTION: rake posts:missing_uploads identified 2274 issues. S3 migration failed for db 'default'.
/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>'
Trying to rollback...
Rolling back...
Cleaning stuff up...
Dropping functions from the discourse_functions schema...
Removing tmp '/var/www/discourse/tmp/restores/default/2026-08-11-075958' directory...
Unpausing sidekiq...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]
Restore done.

Ich habe einige Fragen:

  • Warum schlägt es fehl, obwohl die in der Datenbank gespeicherte Konfiguration für die S3-Umgebung unverändert ist?
  • Warum stürzt es ab, anstatt eine Liste der 2274 gefundenen Probleme mit den Uploads zu erstellen, die ich dann irgendwie bearbeiten könnte?
  • Warum wird automatisch auf eine leere Datenbank zurückgesetzt, sodass ich völlig im Ungewissen dastehe?
  • Gibt es eine Möglichkeit, dass ich die Kontrolle übernehme, die Wiederherstellung erfolgreich abschließen lasse oder zumindest kein Rollback durchführe, damit ich mich um die gefundenen Upload-Probleme kümmern kann?

Vielen Dank im Voraus für jede Hilfe!

Weil es lediglich Flags zählt, die mit dem Backup mitkommen. Dieser Prozess findet die Probleme nicht tatsächlich.

Idealerweise würdest du zuerst die Flags für fehlende Uploads auf dem alten Server löschen und dann ein neues Backup erstellen.

Du kannst eine Aufgabe ausführen, die die fehlenden Uploads auf dem alten Server auflistet und versucht, sie zu reparieren (das kann eine Weile dauern)

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

und markiere alle verbleibenden als ignoriert, wenn du fortfahren möchtest.

GIVE_UP=1 VERBOSE=1 rake posts:missing_uploads

An dieser Stelle kannst du ein neues Backup erstellen und wiederherstellen.

Vielen Dank für diese Antwort! Sie hilft mir tatsächlich sehr, denn zumindest habe ich jetzt eine vollständige Liste aller Themen, bei denen Probleme mit dem Hochladen auftreten.

Ich werde versuchen, so viele wie möglich zu beheben, aber zumindest habe ich jetzt eine Richtung, in die ich gehen kann!