ВНИМАНИЕ! Если ваша база данных очень велика, вам потребуется много дополнительного дискового пространства (объем, равный двойному размеру базы данных), и при этом обновлении следует проявлять особую осторожность!
Мы только что внедрили изменения для обновления нашего Docker-образа до PostgreSQL 15. Любые администраторы сайтов, собирающие Discourse из командной строки, будут обновлены до PostgreSQL 15 с предыдущей версии PostgreSQL 13. Обратите внимание: если вы воздержались от обновления, когда выходило обновление PostgreSQL 13 еще в 2020 году, вы можете пропустить это обновление и сразу перейти к PostgreSQL 15.
Если вы ранее откладывали обновление, измените шаблон PostgreSQL в файле app.yml с templates/postgres.12.template.yml на templates/postgres.template.yml.
Как и при любом обновлении, настоятельно рекомендуется создать резервную копию перед выполнением любых действий.
Обновление
Официальное руководство по установке (один контейнер)
При следующей пересборке в конце вы увидите следующее сообщение:
-------------------------------------------------------------------------------------
ОБНОВЛЕНИЕ POSTGRES ЗАВЕРШЕНО
Старая база данных версии 13 сохранена в /shared/postgres_data_old
Чтобы завершить обновление, выполните пересборку еще раз, используя:
./launcher rebuild app
-------------------------------------------------------------------------------------
Это означает, что обновление прошло успешно! Вам нужно только выполнить новую пересборку, чтобы вернуть сайт в рабочее состояние.
Установка с выделенным контейнером данных
Если вы используете конфигурацию с выделенным контейнером данных на основе образца, предоставленного в нашем репозитории 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
Ручное обновление / среды с ограниченным пространством
ВЫ ДОЛЖНЫ СОЗДАТЬ РЕЗЕРВНУЮ КОПИЮ POSTGRES_DATA ПЕРЕД ПОПЫТКОЙ ЭТОГО
Если вы работаете в среде с ограниченным дисковым пространством и у вас нет возможности увеличить его, вы можете попробовать следующее:
./launcher stop app #(или оба: web_only и data, если это ваш случай)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
--entrypoint=/bin/bash \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade"
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
chown -R postgres:postgres /shared/postgres_data #(или local_discourse/data)
./launcher rebuild app #(или сначала data, а затем web_only, если это ваш случай)
По моим тестам, эта процедура требует менее 1x текущего размера вашей базы данных свободного места.
Если вы используете нестандартную локаль, вы можете попробовать заменить первую команду docker на эту:
# замените 'en_US.UTF-8' на вашу локаль
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_US.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
Откладывание обновления
Если вам нужно отложить обновление при следующей пересборке, вы можете изменить шаблон PostgreSQL в файле app.yml, заменив "templates/postgres.template.yml" на "templates/postgres.13.template.yml".
Это не рекомендуется, так как некоторые администраторы сайтов могут забыть вернуть изменения обратно.
Дополнительные задачи после обновления
Оптимизация статистики PostgreSQL
После обновления новый PostgreSQL не будет иметь статистики таблиц. Вы можете сгенерировать её, используя:
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
Очистка старых данных
Для стандартной установки вы можете удалить старые данные в формате PG13 следующей командой:
cd /var/discourse
./launcher cleanup
Если у вас есть отдельный контейнер данных, вам нужно удалить резервную копию следующим образом:
rm -fr /var/discourse/shared/data/postgres_data_old/
Часто задаваемые вопросы (FAQ)
Исходный кластер был остановлен некорректно
Если вы получили ошибку обновления с вышеуказанным сообщением, вы можете попробовать более простой подход, чтобы вернуть систему в лучшее состояние.
Перезапустите старый контейнер с помощью ./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
Это означает, что файлы от последнего обновления все еще остаются. Переместите их в другое место перед продолжением.
Предложения скриптов после завершения обновления — нужно ли что-то делать?
После завершения обновления вы увидите вывод сообщения pg_upgrade:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
Вы можете безопасно игнорировать это сообщение.
Я пропустил обновление PostgreSQL 13, что делать теперь?
Вы можете следовать стандартным инструкциям в начале этого руководства, и они обновят вашу версию до 15 без проблем.
Если вы следуете инструкциям для сред с ограниченным пространством, адаптируйте номера версий соответствующим образом.
Перестроение индексов может значительно сэкономить дисковое пространство. После обновления выполните шаги из нашего руководства по обновлению PostgreSQL 13.