Lors de la tentative de restauration d’une sauvegarde (vers un multisite, mais cela ne semble pas importer, voir ci-dessous), voici ce qui se produit :
Migration de la base de données...
EXCEPTION : lib/discourse.rb:57:in `exec' : Échec de la migration de la base de données.
rake aborted!
Errno::ENOENT : Aucun fichier ou répertoire du type @ 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
Au début, je pensais qu’il s’agissait purement d’un problème lié au multisite, mais l’échec se produit également sur un site non multisite.
Le plus drôle, c’est que les uploads n’étaient même pas encore extraits à ce moment-là (EDIT : à ce moment précis). Pourtant, ce fichier spécifique est bien inclus dans l’archive.
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
Version du dump de base de données original : v20190130013015
J’ai ensuite extrait manuellement les uploads (dans default) puis relancé la restauration, qui a réussi.
Et c’est là que j’ai vu… les uploads sont extraits APRÈS db:migrate, mais db:migrate exécute SiteIconManager.ensure_optimized!, qui exige que les fichiers soient déjà présents…
Il y a donc deux problèmes :
SiteIconManager.ensure_optimized!s’exécute avant que les images ne soient extraites ; (en réalité, elle s’exécute deux fois – une fois de plus après l’extraction des uploads)- elle attend les fichiers dans
defaultcar la réaffectation n’a pas encore été exécutée.
Dans ce cas précis, l’échec est critique car le code relatif à un upload SVG emprunte un chemin d’exécution différent. Pour d’autres uploads, il semble échouer silencieusement.
Au passage, en examinant le code, il semble que cela puisse être contourné en utilisant SKIP_POST_DEPLOYMENT_MIGRATIONS=1, car cela saute l’optimisation des images lors de db:migrate, mais cela n’a pas fonctionné lorsque je l’ai essayé.