При попытке восстановления резервной копии (для мультисайта, но, судя по всему, это не имеет значения, см. ниже) происходит следующее:
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
Сначала я подумал, что это исключительно проблема мультисайта, но ошибка возникает и на одиночном сайте.
Забавно то, что в этот момент архив даже не распаковывался (РЕДАКТИРОВАНО: на тот момент). Однако указанный файл загрузки включён в архив.
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
Исходная версия дампа базы данных: v20190130013015
Затем я вручную распаковал файлы загрузки (в default) и снова запустил восстановление, которое завершилось успешно.
После этого я заметил следующее: файлы загрузки извлекаются ПОСЛЕ выполнения db:migrate, но db:migrate запускает SiteIconManager.ensure_optimized!, который требует, чтобы файлы уже присутствовали…
Таким образом, есть две проблемы:
SiteIconManager.ensure_optimized!выполняется до извлечения изображений (на самом деле оно запускается дважды — ещё раз после извлечения файлов загрузки);- оно ожидает наличие файлов в
default, поскольку переназначение ещё не выполнено.
В данном конкретном случае ошибка возникает критически, так как код для загрузки SVG идёт по другому пути. Для других загрузок, похоже, ошибка подавляется.
Кстати, судя по коду, эту проблему можно обойти, установив SKIP_POST_DEPLOYMENT_MIGRATIONS=1, так как это пропускает оптимизацию изображений во время db:migrate, но при моей попытке это не сработало.