Обновление PostgreSQL 18 для self-hosters

Хорошая идея, спасибо, Эд! Я обновил свой пост. :slight_smile:

2 лайка

После этого изменения я наблюдаю общее снижение потребления памяти примерно на 4%. Отличная работа.

2 лайка

Спасибо, Лили. Я только что выполнил обновление, и всё, кажется, прошло успешно :+1:

1 лайк

Ничего необычного в том, что переписанные таблицы и индексы становятся значительно компактнее.

1 лайк

Э-э, это просто шум от работы Postgres (зависит от того, смотрите вы на данные до или после vacuum, перестройки таблиц и т. д.)

С тех пор я не заметил ничего недостающего, так что, насколько я могу судить, всё в порядке.

1 лайк

Я запускаю Discourse в отдельном Docker-контейнере на /var/discourse.

Я попытался обновить встроенную базу данных PostgreSQL с версии 15 до версии 18. Обновление, казалось, завершилось, и активный каталог данных теперь сообщает:

/shared/postgres_data/PG_VERSION
18

Однако пересозданный контейнер Discourse по-прежнему содержит только бинарные файлы PostgreSQL 15:

/usr/lib/postgresql/15/bin/postgres
postgres (PostgreSQL) 15.18

Служба PostgreSQL настроена на запуск:

/usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main

тогда как фактический каталог данных Discourse смонтирован в:

/shared/postgres_data

В результате PostgreSQL завершается с ошибкой:

FATAL: database files are incompatible with server

DETAIL: The data directory was initialized by PostgreSQL version 18,
which is not compatible with this version 15.18
(Debian 15.18-1.pgdg12+1).

Я понимаю, что в последних Docker-образах Discourse должны содержаться бинарные файлы PostgreSQL 18. Я изменил app.yml, чтобы использовать шаблон PostgreSQL 18, и пересоздал приложение, но в результирующем контейнере по-прежнему находятся бинарные файлы PostgreSQL 15, а скрипт службы по-прежнему указывает на /etc/postgresql/15/main.

Соответствующая часть моей текущей конфигурации службы:

HOME=/var/lib/postgresql USER=postgres exec thpoff \
chpst -u postgres:postgres:ssl-cert -U postgres:postgres:ssl-cert \
/usr/lib/postgresql/15/bin/postmaster -D /etc/postgresql/15/main

Мои вопросы:

  1. Каков правильный способ пересоздания или обновления контейнера Discourse, чтобы в нем действительно содержались бинарные файлы PostgreSQL 18?

  2. Есть ли какой-то конкретный шаблон или тег образа, который следует использовать в app.yml?

  3. Как только PostgreSQL 18 станет доступен, какова поддерживаемая процедура его запуска с использованием существующего каталога /shared/postgres_data?

Я не удалял и не переинициализировал каталог данных PostgreSQL 18. Я предпочел бы восстановить обновленный кластер, а не восстанавливать старые данные PostgreSQL 15.

1 лайк

судя по инструкциям в первом сообщении, это, похоже, был ненужный шаг, если я что-то упустил?

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

если вы не отключаете использование последнего образа каким-то образом, новые бинарники наверняка гарантированы? очень странно …

вы уверены, что не зафиксировали версию образа?

3 лайка

Не специально? Я использую обычный git-репозиторий и ветку, и в моём app.yml нет ничего, что указывало бы на то, что я закрепил какой-либо образ. Я просто сменил шаблон на postgres 18, чтобы проверить, поможет ли это; да, это был ненужный шаг, который не помог, так что я могу вернуть всё как было.

Есть ли у вас предложения, как получить новые бинарные файлы? Их действительно нет, сколько бы раз я ни пересобирал:

root@hostname-app:/usr/lib/postgresql# ls -la

total 12

drwxr-xr-x 1 root root 4096 May 21 00:47 .

drwxr-xr-x 1 root root 4096 May 21 00:48 ..

drwxr-xr-x 1 root root 4096 May 21 00:47 15

root@hostname-app:/usr/lib/postgresql#
1 лайк

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

1 лайк

Хорошо, полагаю, ты прав! Иногда не стоит возиться с починкой. Спасибо.

2 лайка

Если вы не можете получить доступ к панели администратора, потому что ваш Discourse «сошёл с ума», как можно получить доступ к БД через root@, чтобы загрузить её на новый инстанс? (возможно, есть отдельное руководство)

Или какая команда в командной строке выполняет те же действия, что и через панель администратора?

Хорошо, и что более важно, мне нужно пересобрать приложение, чтобы устранить ошибку сертификата, которая, похоже, возникла только что (никакие изменения не предшествовали этому очевидному сбою) — появляется ошибка «порт 443 недоступен» (мастер выводит: «Проверка DNS не удалась») — не знаю, изменили ли что-то CF или DO, но опять же с моей стороны ничего не менялось — ну, я не могу пересобрать из-за, возможно, этих двух ошибок, включая ту, что ниже, в отличие от прошлого раза, когда была ошибка «недостаточно места». Есть ли идеи, как обойти эту ошибку ниже?

Кстати, я получал точно такую же ошибку и до, и после увеличения размера основного диска (с учётом требований postgres 15 > 18).

FAILED

--------------------

Pups::ExecError: if [ -f /root/install_postgres ]; then

  /root/install_postgres && rm -f /root/install_postgres

elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then

  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1

fi

failed with return #<Process::Status: pid 17 exit 1>

Location of failure: /usr/local/lib/ruby/gems/3.4.0/gems/pups-1.4.0/lib/pups/exec_command.rb:138:in 'Pups::ExecCommand#spawn'

exec failed with the params {"tag" => "db", "cmd" => "if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}

А, понял. Я нашёл то, что, как мне кажется, нужно, — пост от @Lilly, сделанный довольно давно в этой теме.

cd /var/discourse
./launcher enter web_only
discourse backup
exit

Из этого я делаю вывод, что я могу создать рабочую резервную копию БД, которую смогу загрузить в новую инстанцию Discourse и обойти все проблемы.

Даст ли эта команда полную резервную копию, то есть посты + загрузки/изображения?

Я бы рекомендовал сделать только резервную копию базы данных, а всё остальное перенести с помощью rsync. Перенос сайта Discourse на другой VPS с помощью rsync. Вы также можете перенести SSL-сертификаты с помощью rsync, чтобы запустить новый сайт до изменения DNS-записей.

Вот как я это делаю: Changing Digital Ocean droplets with doctl (resize, floating ip, rename, etc) - Howto - Literate Computing Dashboard

P.S. Извините. Я не могу понять, решили ли вы свою проблему. Если я правильно понимаю, самое простое решение — вернуться к шаблону по умолчанию без указания версии и собрать всё заново.

2 лайка

Вы дважды пересобрали контейнер данных (в вашем случае, вероятно, это app), как того требует инструкция?

(Кстати, в сообщении об обновлении указано, что нужно пересобрать app, но, по-моему, имелось в виду «контейнер базы данных, который может называться app или data», или же это касается обоих?)

И немного обратной связи: некоторое время назад я пытался перейти с версии 13 на 15, но это несколько раз не удавалось, и я остался на шаблоне .13. Теперь, когда появилась версия .18, я снова попробовал, и всё прошло без проблем (хотя перед этим мне пришлось очистить каталоги _new и _older). Теперь я снова могу использовать шаблон данных по умолчанию без указания версии. Отличная работа над тем, чтобы сделать обновление таким надёжным!

1 лайк

Только что заметил в журнале ошибок, что до обновления PG у меня были некоторые ошибки, связанные с SQL:

Job exception: PG::UndefinedFunction: ERROR: function array_remove(bigint[], integer) does not exist LINE 1: ...ATE "access_control_lists" SET allowed_user_ids = array_remo...

Что странно, похоже, эта функция из PG9, а я использовал версию 15. Неужели это проблема с правами доступа или поисковым путём? Похоже, после обновления БД она больше не возникает, но, возможно, это вопрос тайминга пакетной обработки… Я вижу, что эта функция используется в довольно большом количестве мест, включая скрипты миграций.

Возможно, это означает, что некоторые функции не работают в старых версиях PostgreSQL, хотя их шаблоны всё ещё числятся в списке. Возможно, я что-то упустил, но я думал, что старые версии совместимы.

1 лайк