ВНИМАНИЕ! Для обновления требуется много свободного места на диске (в 2 раза больше размера базы данных).
Мы только что внедрили изменения для обновления нашего Docker-образа до PostgreSQL 18. Любой администратор сайта, пересобирающий Discourse из командной строки, будет обновлён с предыдущей версии PostgreSQL 15 до PostgreSQL 18. Обратите внимание: если вы воздержались от обновления, когда в 2025 году вышла версия PostgreSQL 15, вы можете пропустить это обновление и сразу перейти на PostgreSQL 18.
Если вы ранее отложили обновление, измените шаблон PostgreSQL в файле app.yml с templates/postgres.13.template.yml на templates/postgres.template.yml.
Как и при любом обновлении, настоятельно рекомендуется сделать резервную копию перед началом любых действий.
Изменения локалей
Ранее мы наблюдали случаи повреждения индексов при обновлении glibc, например, во время обновления операционной системы. Начиная с PostgreSQL 17, появился новый встроенный поставщик локалей, который не зависит от glibc операционной системы и поэтому стабилен между версиями. В рамках этого обновления мы переходим на использование этого встроенного поставщика с локалью C.UTF-8. Эта локаль использует упорядочивание по кодовым точкам, и мы рекомендуем её по вышеуказанным причинам стабильности.
Чтобы выполнить изменение локали, нам необходимо сначала создать новый кластер БД с использованием встроенного поставщика локалей, а затем выгрузить и восстановить базу данных в этот кластер. По этой причине требования к дисковому пространству выше, чем при предыдущих обновлениях, где мы выполняли обновление на месте.
Обновление
Официальное руководство по установке (один контейнер)
При следующей пересборке вы увидите следующее сообщение в конце:
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО
Старая база данных 15 хранится в /shared/postgres_data_old
Чтобы завершить обновление, выполните пересборку ещё раз с помощью:
./launcher rebuild app
-------------------------------------------------------------------------------------
Это означает, что обновление прошло успешно! Вам просто нужно запустить новую пересборку, чтобы ваш сайт снова заработал.
Установка с использованием контейнера данных
n
Если вы используете настройку с выделенным контейнером данных на основе примера, предоставленного в нашем репозитории discourse_docker, убедитесь, что вы останавливаете PostgreSQL безопасным и чистым способом.
В наши дни фоновые задачи выполняют запросы, длящиеся несколько минут, поэтому остановка веб-контейнера поможет безопасно завершить работу контейнера данных.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
Перед запуском первой пересборки контейнера данных вы можете просматривать журнал PostgreSQL, чтобы убедиться, что он был корректно остановлен.
Выполнение команды tail -f shared/standalone/log/var-log/postgres/current должно показать следующий журнал, если остановка прошла корректно:
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
Откладывание обновления
Если вам нужно отложить обновление при следующей пересборке, вы можете заменить шаблон PostgreSQL в файле app.yml, изменив "templates/postgres.template.yml" на "templates/postgres.15.template.yml".
Это не рекомендуется, так как некоторые администраторы сайтов могут забыть отменить это изменение впоследствии.
Необязательные задачи после обновления
Оптимизация статистики PostgreSQL
После обновления в новой версии PostgreSQL не будет актуальной статистики таблиц. Вы можете сгенерировать её с помощью:
docker exec -u postgres app \
/usr/lib/postgresql/18/bin/vacuumdb -d discourse --analyze-in-stages
Очистка старых данных
Для стандартной установки вы можете удалить старые данные в формате PG15 с помощью следующей команды:
cd /var/discourse
./launcher cleanup
Если у вас есть отдельный контейнер данных, вам нужно будет удалить резервную копию следующим образом:
rm -fr /var/discourse/shared/data/postgres_data_old/
Часто задаваемые вопросы
Исходный кластер не был корректно остановлен
Если вы получите сообщение об ошибке обновления с указанным выше текстом, вы можете попробовать более простой подход, чтобы вернуть систему в работоспособное состояние.
Перезапустите старый контейнер командой ./launcher start app. Подождите несколько минут, пока он не запустится.
Теперь снова остановите его командой ./launcher stop app. После этого просмотрите журналы, чтобы убедиться, что остановка была корректной:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG: background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG: shutting down
2025-01-24 09:19:06.468 UTC [37] LOG: database system is shut down
Если в журналах не указано, что база данных остановлена, вы можете снова запустить старый контейнер, войти в него командой ./launcher enter app, выполнить следующие команды и снова просмотреть журналы после завершения.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
Если журналы выглядят как указано выше, теперь вы можете попытаться выполнить обновление снова с помощью ./launcher rebuild app.
Значения lc_collate для базы данных “postgres” не совпадают
Эта ошибка возникает, если вы используете нестандартные локали для вашей базы данных. Сообщалось, что для успешного выполнения необходимо задать 3 переменные. Убедитесь, что в разделе env: вашего файла app.yml присутствуют следующие 3 строки:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
Замените en_US.UTF-8 на вашу локаль.
При каждой пересборке выполняется обновление снова (цикл обновлений)
Когда это происходит, в журналах обновления будет содержаться следующее:
mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty
Это означает, что остались файлы от предыдущего обновления. Переместите их в другое место, прежде чем продолжить.
Я пропустил обновление PostgreSQL 15, что делать теперь?
Вы можете следовать стандартным инструкциям в начале этого руководства, и они обновят вашу версию до 18 без проблем.