Хорошая идея, спасибо, Эд! Я обновил свой пост. ![]()
После этого изменения я наблюдаю общее снижение потребления памяти примерно на 4%. Отличная работа.
Спасибо, Лили. Я только что выполнил обновление, и всё, кажется, прошло успешно ![]()
Ничего необычного в том, что переписанные таблицы и индексы становятся значительно компактнее.
Э-э, это просто шум от работы Postgres (зависит от того, смотрите вы на данные до или после vacuum, перестройки таблиц и т. д.)
С тех пор я не заметил ничего недостающего, так что, насколько я могу судить, всё в порядке.
Я запускаю 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
Мои вопросы:
-
Каков правильный способ пересоздания или обновления контейнера Discourse, чтобы в нем действительно содержались бинарные файлы PostgreSQL 18?
-
Есть ли какой-то конкретный шаблон или тег образа, который следует использовать в
app.yml? -
Как только PostgreSQL 18 станет доступен, какова поддерживаемая процедура его запуска с использованием существующего каталога
/shared/postgres_data?
Я не удалял и не переинициализировал каталог данных PostgreSQL 18. Я предпочел бы восстановить обновленный кластер, а не восстанавливать старые данные PostgreSQL 15.
судя по инструкциям в первом сообщении, это, похоже, был ненужный шаг, если я что-то упустил?
просто пересборка стандартной установки должна была загрузить последний образ и запустить миграцию.
если вы не отключаете использование последнего образа каким-то образом, новые бинарники наверняка гарантированы? очень странно …
вы уверены, что не зафиксировали версию образа?
Не специально? Я использую обычный 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#
Чтобы сэкономить ваше время и избежать лишних хлопот, я бы рекомендовал использовать вашу последнюю резервную копию для создания нового сервера — это значительно сократит объём работы.
Хорошо, полагаю, ты прав! Иногда не стоит возиться с починкой. Спасибо.
Если вы не можете получить доступ к панели администратора, потому что ваш 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. Извините. Я не могу понять, решили ли вы свою проблему. Если я правильно понимаю, самое простое решение — вернуться к шаблону по умолчанию без указания версии и собрать всё заново.
Вы дважды пересобрали контейнер данных (в вашем случае, вероятно, это app), как того требует инструкция?
(Кстати, в сообщении об обновлении указано, что нужно пересобрать app, но, по-моему, имелось в виду «контейнер базы данных, который может называться app или data», или же это касается обоих?)
И немного обратной связи: некоторое время назад я пытался перейти с версии 13 на 15, но это несколько раз не удавалось, и я остался на шаблоне .13. Теперь, когда появилась версия .18, я снова попробовал, и всё прошло без проблем (хотя перед этим мне пришлось очистить каталоги _new и _older). Теперь я снова могу использовать шаблон данных по умолчанию без указания версии. Отличная работа над тем, чтобы сделать обновление таким надёжным!
Только что заметил в журнале ошибок, что до обновления 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, хотя их шаблоны всё ещё числятся в списке. Возможно, я что-то упустил, но я думал, что старые версии совместимы.