Обновление с 3.0.0.beta16 до 3.1.0.beta2

Я попытался сделать резервную копию, но она не удалась.

Я также попытался выполнить обновление.

Сначала на экране обновления все элементы были отключены. Я перезагрузил систему, после чего смог выбрать обновление docker_manager. Однако оно завершилось ошибкой:

rake aborted!
NoMethodError: undefined method `path' for nil:NilClass

Тогда я решил подключиться к серверу по SSH и попытался выполнить пересборку. Вот что я получил:

root@Discourse-1:/var/discourse# ./launcher rebuild app
x86_64 arch detected.
WARNING: containers/app.yml file is world-readable. You can secure this file by running: chmod o-rwx containers/app.yml
Ensuring launcher is up to date
Fetching origin
Launcher is up-to-date
............
Downloading MaxMindDB...
Compressing Javascript and Generating Source Maps

I, [2023-03-10T03:08:58.958320 #1]  INFO -- : Terminating async processes
I, [2023-03-10T03:08:58.958649 #1]  INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 42
I, [2023-03-10T03:08:58.958745 #1]  INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 103
103:signal-handler (1678417738) Received SIGTERM scheduling shutdown...
2023-03-10 03:08:58.959 UTC [42] LOG:  received fast shutdown request
2023-03-10 03:08:58.966 UTC [42] LOG:  aborting any active transactions
2023-03-10 03:08:58.969 UTC [42] LOG:  background worker "logical replication launcher" (PID 51) exited with exit code 1
2023-03-10 03:08:58.971 UTC [46] LOG:  shutting down
103:M 10 Mar 2023 03:08:59.047 # User requested shutdown...
103:M 10 Mar 2023 03:08:59.047 * Saving the final RDB snapshot before exiting.
2023-03-10 03:08:59.060 UTC [42] LOG:  database system is shut down
103:M 10 Mar 2023 03:08:59.073 * DB saved on disk
103:M 10 Mar 2023 03:08:59.073 # Redis is now ready to exit, bye bye...


FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake themes:update assets:precompile' failed with return #<Process::Status: pid 1004 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"assets_precompile", "cmd"=>["su discourse -c 'bundle exec rake themes:update assets:precompile'"]}
bootstrap failed with exit code 1
** 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.
e956a73644feb880e4b524bcbd4fa3c626fcfcc4edb3752f72e523194f663b4e
root@Discourse-1:/var/discourse# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
root@Discourse-1:/var/discourse# 

Есть ли у вас плагины в app.yml?
Когда у меня случается что-то подобное, это обычно связано с неработающим плагином, который нужно закомментировать перед повторной сборкой.

Сколько у вас памяти? Попробуйте перезагрузить компьютер и выполнить сборку заново.

Что говорит команда free?

Лично я, если резервное копирование не удалось, не стал бы пытаться выполнить обновление. Резервное копирование, включая наличие загруженной копии, для меня является обязательным условием. Возможно, это не самый полезный комментарий в данный момент, но я считаю, что его нужно сказать.

В вашем другом посте вы привели немного больше информации об ошибке rake aborted:

Это не проблема. Похоже, что отсутствует ключ для загрузки MaxMind DB. Проблема выше.

Если проблема заключается в невозможности запуска, то нас беспокоит не только использование оперативной памяти и файла подкачки, но и конфигурация ядра. Если в логах появляется следующее сообщение:

# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

то стоит выполнить указанные рекомендации. См. также:

Моя установка Discourse очень стандартная. После перезагрузки я получил чистую резервную копию. В итоге я решил выполнить установку с нуля. Установка не удалась с теми же ошибками, которые я указал выше. Я уже четыре года использую Discourse в контейнере LXD с 6 ГБ памяти без каких-либо проблем. Использование памяти стабильно составляет 1,9 ГБ. Во время обновления потребление памяти достигает пика в 5,1 ГБ. Размер моего резервного копирования базы данных составляет всего 30 ГБ, поэтому моя установка по сравнению с другими является небольшой. Моя конфигурация работает на Ubuntu 22.04. Стоит ли мне перейти на другой дистрибутив?

У меня, возможно, 40 пользователей и 150 постов. Система использует 1,8 ГБ памяти, а я выделил ей 6 ГБ. Сколько памяти требуется для успешного выполнения перестроения? Раньше этого всегда было достаточно.

Я не использую никаких плагинов.

Можете ли вы поделиться своим файлом app.yml? Боюсь, у вас недействительный API-ключ для MaxMind.

Вот мой app.yml.

## это шаблон автономного контейнера Docker Discourse «всё в одном»
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## при необходимости проверьте этот файл на сайте http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал тот же порт, что и другой веб-сервер, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум в 25% от общего объёма памяти.
  ## будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, либо вы можете переопределить
  db_shared_buffers: "4096MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на соединение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и количества ядер CPU.
  ## будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить
  UNICORN_WORKERS: 8

  ## TODO: Доменное имя, на которое будет отвечать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с обычным IP-адресом.
  DISCOURSE_HOSTNAME: discussion.scottibyte.com

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список адресов электронной почты через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'aaaaaa@gmail.com'

  ## TODO: SMTP-сервер, используемый для проверки новых аккаунтов и отправки уведомлений
  ## АДРЕС SMTP, имя пользователя и пароль обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  DISCOURSE_SMTP_ADDRESS: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: redacted
  DISCOURSE_SMTP_PASSWORD: redacted
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (опционально, по умолчанию true)
  DISCOURSE_SMTP_DOMAIN: discussion.scottibyte.com
  DISCOURSE_NOTIFICATION_EMAIL: noreply@scottibyte.com

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Адрес CDN (http или https) для этого экземпляра Discourse (настроен на загрузку)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Ключ лицензии MaxMind для определения местоположения по IP-адресу
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  DISCOURSE_MAXMIND_LICENSE_KEY: aaaaaaaa

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для выполнения после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты в поле 'От' для первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации закомментируйте строку обратно. Выполнять нужно только один раз.
  # - exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Когда я сделал новую сборку, я попробовал новый ключ MaxMind, но получил ту же ошибку.

Удалите или закомментируйте строку с DISCOURSE_MAXMIND_LICENSE_KEY и выполните сборку заново.

И если это поможет. Всё работает нормально сейчас. Сбои возникают именно при обновлениях.

Закомментировал ключ Maxmind в YAML. Пересборка в процессе. Кстати, уведомления по электронной почте всегда работали безупречно. В последнее время не работает письмо со ссылкой на скачивание резервной копии. Я просто захожу в папку и скачиваю резервную копию через SFTP, это работает, и журнал резервного копирования завершается успешно. Так что, как вы думаете, в чём проблема с ключом Maxmind?

@Falco, похоже, что ключ Maxmind был виновником.


Как видите, пересборка прошла успешно, и форум находится на последней версии. Создание новой резервной копии через GUI сработало, как и уведомление о резервном копировании, и даже ссылка на загрузку резервной копии. Всё работает отлично.
Спасибо, вы настоящий мастер! Отличные комментарии и замечательная помощь, сэр.

Однако, даже с новым ключом Maxmind мне не повезло. Есть какие-либо советы по этому поводу?

Получается, что невалидный ключ сломает сборку, а пустой (null) — нет?

В идеале ни то, ни другое не должно происходить. Нам просто нужно подтверждение того, что именно сломано, с подробными шагами для воспроизведения проблемы, чтобы мы могли создать отчет об ошибке и назначить инженера для её исправления.

Я просто закомментировал ключ, и пересборка прошла успешно. При наличии действительного (и даже нового) ключа сборка завершается с ошибкой, что видно из предоставленных мной логов.