Al intentar restaurar una copia de seguridad (en un entorno multisitio, pero eso no parece importar, ver más abajo), ocurre lo siguiente:
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
Al principio pensé que se trataba exclusivamente de un problema multisitio, pero también falla en un entorno no multisitio.
Lo curioso es que ni siquiera estaba extrayendo las subidas (EDIT: en ese momento). Sin embargo, esa subida específica está incluida en el archivo.
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
Versión del volcado de base de datos original v20190130013015
Luego extraje las subidas manualmente (en default) y ejecuté la restauración nuevamente, lo cual tuvo éxito.
Y entonces lo vi… las subidas se extraen DESPUÉS de db:migrate, pero db:migrate está ejecutando SiteIconManager.ensure_optimized!, lo que requiere que los archivos ya estén presentes…
Así que hay dos problemas:
SiteIconManager.ensure_optimized!se ejecuta antes de que las imágenes hayan sido extraídas; (de hecho, se ejecuta dos veces: una vez más después de que las subidas hayan sido extraídas)- Espera los archivos en
defaultporque el remapeo aún no se ha ejecutado.
En este caso específico, falla de manera crítica porque el código para una subida de SVG sigue una ruta de código diferente. Para otras subidas, parece fallar en silencio.
Por cierto, al revisar el código, parece que esto podría evitarse usando SKIP_POST_DEPLOYMENT_MIGRATIONS=1, ya que eso omite la optimización de imágenes durante db:migrate, pero eso no funcionó cuando lo intenté.