Ошибка при обновлении с 2.3.5 до 2.4.2

Я пытаюсь обновиться с версии 2.3.5 до 2.4.2 (в контейнере Docker от Bitnami на Google Cloud).

Восстановление архива резервной копии 2.3.5 в новую версию 2.4.2 полностью не удалось.

Я распаковал архив, получил файл pg_dump и загрузил его в новую базу данных. В целом всё выглядело хорошо, за исключением двух ошибок:

> ERROR:  schema "discourse_functions" does not exist
> ERROR:  schema "discourse_functions" does not exist

Значит, чего-то не хватает…

В любом случае я попробовал следующее…

> /opt/bitnami/apps/discourse/htdocs$ sudo bin/rake db:migrate RAILS_ENV=production
> rake aborted!
> PG::InsufficientPrivilege: ERROR:  permission denied for table site_settings
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/mini_sql-0.2.4/lib/mini_sql/postgres/connection.rb
> :118:in `exec'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/mini_sql-0.2.4/lib/mini_sql/postgres/connection.rb
> :118:in `run'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/mini_sql-0.2.4/lib/mini_sql/postgres/connection.rb
> :82:in `query'
> /opt/bitnami/apps/discourse/htdocs/lib/site_settings/db_provider.rb:19:in `all'
> /opt/bitnami/apps/discourse/htdocs/lib/site_settings/defaults_provider.rb:29:in `db_all'
> /opt/bitnami/apps/discourse/htdocs/lib/site_setting_extension.rb:277:in `block in refresh!'
> /opt/bitnami/apps/discourse/htdocs/lib/site_setting_extension.rb:274:in `synchronize'
> /opt/bitnami/apps/discourse/htdocs/lib/site_setting_extension.rb:274:in `refresh!'
> /opt/bitnami/apps/discourse/htdocs/lib/site_setting_extension.rb:495:in `block in setup_methods'
> /opt/bitnami/apps/discourse/htdocs/config/initializers/004-message_bus.rb:120:in `<top (required)>'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:319:in `load'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:319:in `block in load'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:291:in `load_dependency'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:319:in `load'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:667:in `block i
> n load_config_initializer'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notificatio
> ns.rb:182:in `instrument'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:666:in `load_co
> nfig_initializer'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:624:in `block (
> 2 levels) in <class:Engine>'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:623:in `each'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:623:in `block i
> n <class:Engine>'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:32:in `i
> nstance_exec'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:32:in `r
> un'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:61:in `b
> lock in run_initializers'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:50:in `e
> ach'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:50:in `t
> sort_each_child'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/initializable.rb:60:in `r
> un_initializers'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/application.rb:363:in `in
> itialize!'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public
> _send'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method
> _missing'
> /opt/bitnami/apps/discourse/htdocs/config/environment.rb:7:in `<top (required)>'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.2.2/lib/zeitwerk/kernel.rb:23:in `requi
> re'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/zeitwerk-2.2.2/lib/zeitwerk/kernel.rb:23:in `requi
> re'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:325:in `block in require'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:291:in `load_dependency'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/dependencie
> s.rb:325:in `require'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/application.rb:339:in `re
> quire_environment!'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/application.rb:515:in `bl
> ock in run_tasks_blocks'
> /opt/bitnami/apps/discourse/htdocs/vendor/bundle/ruby/2.6.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
> Tasks: TOP => db:migrate => db:load_config => environment
> (See full trace by running task with --trace)

Буду признателен за любые рекомендации.

Приносим извинения, но пакет Bitnami здесь не поддерживается. Это сторонний пакет, и если вы хотите продолжить его использование, вам необходимо обратиться к его разработчикам за помощью.

Мы рекомендуем создать полную резервную копию и выполнить повторную установку с использованием поддерживаемого стандартного метода установки.

Привет, Стивен,

Должна ли быть проблема при восстановлении архива резервной копии версии 2.3.5 в стандартной установке версии 2.4.2?

Так и должно быть, но не полагайтесь только на мои слова и обязательно имейте запасной план. Помните, что вы работаете на неподдерживаемой установке, поэтому я могу дать рекомендации, как перейти на более поддерживаемую конфигурацию. Однако установки Bitnami проблематичны — лучше быть готовым к худшему.

Если вы развернёте решение на отдельном сервере, вы сможете протестировать изменения, прежде чем вносить необратимые правки в вашу текущую установку.

Немного контекста:

У нас запущена версия 2.3.5 на Amazon.

Мы пытались собрать стандартный пакет установки в Docker на виртуальной машине Ubuntu 18.04 LTS как в Google Cloud, так и на VirtualBox локально. Проблема сохраняется.

Нам не удалось собрать образы Discourse 2.3.5 (с встроенными PostgreSQL и Redis) и 2.3.10. Оба варианта завершаются ошибкой из-за проблем с правами доступа к PostgreSQL как в Google Cloud, так и на виртуальной машине VirtualBox с Ubuntu 18.04.

Стабильная версия 2.4.2 собирается успешно, однако образы 2.4.2 не загружаются ни в Google Cloud, ни на VirtualBox. Оба случая завершаются ошибкой на этапе сборки «discourse functions».

Мы попробуем выполнить процесс сборки согласно ссылке, которую вы нам прислали, и сообщим о результатах. Нужно ли мне создавать отдельную тему для каждой попытки в разных окружениях?

Тогда я смогу указать, на каком именно этапе каждого окружения возникает проблема, если она возникнет.

Поддерживаются ли экземпляры Google Cloud с Ubuntu 18.04 и их SQL-сервисом?

Да, но это более сложная среда, чем DigitalOcean. Установка в DO занимает максимум 30 минут, и вам не придётся беспокоиться о ACL и политиках сети.

Посмотрите на /var/discourse/templates/web_only.yml (или аналогичный файл, это по памяти) в качестве примера использования внешней базы данных.

После запуска пустого сайта вы сможете восстановить резервную копию с помощью команды discourse restore.

Мы пытались собрать Discourse версии 2.3.5 в виртуальной машине на Ubuntu 18.04. Добавили версию: “v2.3.5” в файл app.yml, но процесс завершается с ошибкой:

> FAILED--------------------Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle install --deployment --retry 3 --jobs 4 --verbose --without test development' failed with return #<Process::Status: pid 353 exit 1>Location of failure: /pups/lib/pups/exec_command.rb:112:in `spawn'exec failed with the params {"cd"=>"$home", "hook"=>"bundle_exec", "cmd"=>["su discourse -c 'bundle install --deployment --retry 3 --jobs 4 --verbose --without test development'"]}a3cebbd8e5a24b8a2b248886f0fa195f401720a6dc7084ad78af6cee345de9a9** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one../discourse-doctor may help diagnose the problem.

Ошибка произошла при выполнении команды bundle install. Проверьте логи выше, чтобы найти первопричину. Утилита discourse-doctor может помочь в диагностике проблемы.

Стоит ли попробовать в DigitalOcean или использовать внешнюю базу данных?

Похоже, что установка контейнера Discourse версии 2.3.5 на экземпляр Google All-in-One 18.0.4 LTS завершилась с ошибкой здесь:

> [2020-05-01T18:54:20.903566 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle install --deployment --retry 3 --jobs 4 --verbose --without test development'/usr/local/lib/ruby/site_ruby/2.6.0/rubygems.rb:275:in `find_spec_for_exe': Не удалось найти 'bundler' (1.17.3), требуемый вашим файлом /var/www/discourse/Gemfile.lock. (Gem::GemNotFoundException)
Для обновления до последней версии, установленной в вашей системе, выполните `bundle update --bundler`.
Для установки отсутствующей версии выполните `gem install bundler:1.17.3`        from /usr/local/lib/ruby/site_ruby/2.6.0/rubygems.rb:294:in `activate_bin_path'        from /usr/local/bin/bundle:23:in `<main>'
I, [2020-05-01T18:54:21.234673 #1]  INFO -- : 
I, [2020-05-01T18:54:21.235321 #1]  INFO -- : Завершение асинхронных процессов
I, [2020-05-01T18:54:21.235582 #1]  INFO -- : Отправка сигнала INT для HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/10/bin/postmaster -D /etc/postgresql/10/main pid: 64
I, [2020-05-01T18:54:21.235838 #1]  INFO -- : Отправка сигнала TERM для exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 181
2020-05-01 18:54:21.236 UTC [64] LOG:  получен запрос на быстрое завершение работы
181:signal-handler (1588359261) Получен сигнал SIGTERM, планирование завершения работы...
2020-05-01 18:54:21.241 UTC [64] LOG:  отмена всех активных транзакций
2020-05-01 18:54:21.248 UTC [64] LOG:  рабочий процесс: запуск логической репликации (PID 73) завершился с кодом выхода 1
2020-05-01 18:54:21.248 UTC [68] LOG:  завершение работы
181:M 01 May 2020 18:54:21.268 # Пользователь запросил завершение работы...
181:M 01 May 2020 18:54:21.269 * Сохранение финального снимка RDB перед выходом.
181:M 01 May 2020 18:54:21.271 * База данных сохранена на диск
181:M 01 May 2020 18:54:21.271 # Redis готов к выходу, пока...
2020-05-01 18:54:21.288 UTC [64] LOG:  система баз данных завершена

Почему бы не собрать stable и не протестировать восстановление в неё?

Хорошо, мы попробуем и сообщим об ошибке.

Стоит ли использовать команду в командной строке или действие восстановления через интерфейс?

Должно подойти любое. Как вам удобнее.

Хорошо, нам удалось создать окружение версии 2.4.2. Однако резервная копия была сделана из развертывания в Amazon с настроенным S3. Восстановление в окружение, не являющееся Amazon, завершается ошибкой на этапе выполнения некоторых скриптов S3.

> Переподключение к базе данных...
> Перезагрузка настроек сайта...
> Отключение исходящей почты для нештатных пользователей...
> Отключение режима только для чтения...
> Очистка кэша категорий...
> Очистка кэша эмодзи...
> Очистка кэша темы
> Переназначение загруженных файлов...
> Восстановление загруженных файлов, это может занять некоторое время...
> Миграция загруженных файлов в S3 для 'default'...
> Загрузка файлов в S3...
>  - Список локальных файлов
>  => 3 файла
>  - Список файлов в S3
> . => 3 файла
>  - Синхронизация файлов с S3
> ...
> Обновление URL-адресов в базе данных...
> Удаление старых оптимизированных изображений...
> Пометка всех сообщений, содержащих лайтбоксы, для пересборки
> 182 сообщения помечены для пересборки
> ИСКЛЮЧЕНИЕ: 215 из 295 загруженных файлов не были мигрированы в S3. Миграция в S3 для базы данных 'default' не удалась.
> /var/www/discourse/lib/file_store/to_s3_migration.rb:131:in `raise_or_log'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:78:in `migration_successful?'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:351:in `migrate_to_s3'
> /var/www/discourse/lib/file_store/to_s3_migration.rb:65:in `migrate'
> /var/www/discourse/lib/file_store/s3_store.rb:203:in `copy_from'
> /var/www/discourse/lib/backup_restore/uploads_restorer.rb:48:in `restore_uploads'
> /var/www/discourse/lib/backup_restore/uploads_restorer.rb:30:in `restore'
> /var/www/discourse/lib/backup_restore/restorer.rb:59:in `run'
> script/discourse:143:in `restore'
> /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
> /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
> /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
> /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
> script/discourse:284:in `<top (required)>'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `load'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:63:in `kernel_load'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli/exec.rb:28:in `run'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:476:in `exec'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invok
> e_command'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:30:in `dispatch'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/lib/bundler/cli.rb:24:in `start'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:46:in `block in <top (required)>'
> /usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.4/exe/bundle:34:in `<top (required)>'
> /usr/local/bin/bundle:23:in `load'
> /usr/local/bin/bundle:23:in `<main>'
> Попытка отката...
> Откат...
> Очистка...
> Удаление функций из схемы discourse_functions...
> Удаление временной директории '/var/www/discourse/tmp/restores/default/2020-05-01-230400'...
> Возобновление работы sidekiq...
> Пометка восстановления как завершенного...
> Уведомление 'system' об окончании восстановления...
> Готово!
> [FAILED]
> Восстановление завершено.

Что делать дальше?

Сделайте резервную копию и восстановление только базы данных, а локальные ресурсы перенесите вручную.

На сайтах, с которыми у меня возникает эта проблема, ресурсы находятся в двух разных бакетах S3.