Beim Versuch, ein Backup wiederherzustellen (bei einem Multisite-Setup, was jedoch, wie unten ersichtlich, keine Rolle zu spielen scheint), tritt Folgendes auf:
Migrating the database...
EXCEPTION: lib/discourse.rb:57:in `exec': Failed to migrate database.
rake aborted!
Errno::ENOENT: No such file or directory @ rb_sysopen - /var/www/discourse/public/uploads/default/original/2X/7/7be997f9f48c034ddf5d4eb95d2ea7416f010241.svg
/var/www/discourse/app/models/optimized_image.rb:87:in `block in create_for'
/var/www/discourse/app/models/optimized_image.rb:24:in `block (2 levels) in lock'
/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:23:in `block in lock'
/var/www/discourse/lib/distributed_mutex.rb:33:in `block in synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:29:in `synchronize'
/var/www/discourse/lib/distributed_mutex.rb:14:in `synchronize'
/var/www/discourse/app/models/optimized_image.rb:22:in `lock'
/var/www/discourse/app/models/optimized_image.rb:59:in `create_for'
/var/www/discourse/lib/site_icon_manager.rb:28:in `block in ensure_optimized!'
/var/www/discourse/lib/site_icon_manager.rb:24:in `each'
/var/www/discourse/lib/site_icon_manager.rb:24:in `ensure_optimized!'
/var/www/discourse/lib/tasks/db.rake:83:in `block in <top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/ruby_executable_hooks:24:in `eval'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/ruby_executable_hooks:24:in `<main>'
Tasks: TOP => db:migrate
Zunächst dachte ich, es handele sich um ein reines Multisite-Problem, doch der Fehler tritt auch bei einem Nicht-Multisite-Setup auf.
Das Lustige ist: Die Uploads wurden zu diesem Zeitpunkt noch nicht einmal extrahiert (EDIT: zu diesem Zeitpunkt). Dieser spezifische Upload ist jedoch im Archiv enthalten.
tar tvf public/backups/default/redacted-forum-2020-03-02-165725-v20190130013015.tar.gz |grep 7be997f9f48c034ddf5d4eb95d2ea7416f010241
-rw-r--r-- daemon/daemon 3074 2019-05-27 08:21 uploads/default/original/2X/7/7be997f9f48c034ddf5d4eb95d2ea7416f010241.svg
Ursprüngliche Datenbank-Dump-Version v20190130013015
Anschließend habe ich die Uploads manuell extrahiert (in default) und die Wiederherstellung erneut durchgeführt, was erfolgreich war.
Dann habe ich es bemerkt… die Uploads werden NACH db:migrate extrahiert, aber db:migrate führt SiteIconManager.ensure_optimized! aus, was erfordert, dass die Dateien bereits vorhanden sind…
Es gibt also zwei Probleme:
SiteIconManager.ensure_optimized!wird ausgeführt, bevor die Bilder extrahiert wurden; (tatsächlich wird es zweimal ausgeführt – einmal nach der Extraktion der Uploads)- Es werden die Dateien in
defaulterwartet, da die Remap-Operation noch nicht ausgeführt wurde.
In diesem speziellen Fall schlägt dies hart fehl, da der Code für einen SVG-Upload einen anderen Codepfad nimmt. Bei anderen Uploads scheint der Fehler stillschweigend zu scheitern.
Übrigens: Beim Durchsehen des Codes scheint es, als könnte dies durch die Verwendung von SKIP_POST_DEPLOYMENT_MIGRATIONS=1 umgangen werden, da dies die Bildoptimierung während db:migrate überspringt. Das funktionierte jedoch nicht, als ich es versucht habe.