База данных нашего экземпляра Discourse не является локальным контейнером — вместо этого мы используем центральный кластер баз данных. Недавно центральный PostgreSQL был обновлён до версии 18.3. Я заметил, что теперь резервное копирование Discourse завершается ошибкой:
[2026-05-19 03:37:37] [STARTED]
[2026-05-19 03:37:37] 'system' has started the backup!
[2026-05-19 03:37:37] Marking backup as running...
[2026-05-19 03:37:37] Making sure '/var/www/discourse/tmp/backups/default/2026-05-19-033737' exists...
[2026-05-19 03:37:37] Making sure '/var/www/discourse/public/backups/default' exists...
[2026-05-19 03:37:37] Updating metadata...
[2026-05-19 03:37:37] Dumping the public schema of the database...
[2026-05-19 03:37:37] pg_dump: error: aborting because of server version mismatch
[2026-05-19 03:37:37] pg_dump: detail: server version: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); pg_dump version: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] EXCEPTION: pg_dump failed
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'
Похоже, что это несовпадение версий клиента и сервера PostgreSQL.
Резервное копирование выполняется из контейнера Discourse, где версия pg_dump — 15.15, в то время как внешний сервер PostgreSQL имеет версию 18.3:
server version: 18.3; pg_dump version: 15.15
Будьте осторожны с внесением изменений в контейнер Discourse, если это не рекомендовано командой Discourse. Моя первая реакция — поддерживать кластер внешней базы данных в соответствии с версией PostgreSQL, которую Discourse в настоящее время ожидает или поддерживает.
Хорошо, понял. В данном случае у меня не было выбора, так как нам потребовалось 18 единиц для другого проекта, использующего тот же кластер баз данных. Хм, похоже, нам понадобится отдельный сервер базы данных с 15 единицами, выделенными исключительно для Discourse.
Возможно, выполнить обновление клиента без замены?
Учитывая, что вы, судя по всему, уже доказали совместимость с PG 18, используя его в качестве производственной базы данных, это выглядит как низкорисковое решение.
Ранее я провёл быстрый тест с внешним PostgreSQL 18 и тестовой установкой Discourse, проблем не выявил. Но, честно говоря, это был лишь «быстрый и грязный» тест, а не «глубокая» проверка. В любом случае, система работает уже две недели, так что я предполагаю, что всё в порядке. Пока единственная проблема — это встроенная в Discourse система резервного копирования. С другой стороны, сам сервер базы данных (работающий в LXC) также резервируется отдельно.
Раньше политика заключалась в обновлении через одну версию. Однако PostgreSQL 17 был выпущен уже 1,5 года назад, а официальный образ Docker всё ещё использует версию 15, поэтому я не уверен, что это правило всё ещё действует.
Вы можете добавить код в ваш app.yml, чтобы обновить PostgreSQL до соответствующей версии. Я уже делал это раньше, но не могу найти свои заметки. Самый простой способ — зайти в контейнер, выполнить команды apt для установки нужных клиентов PostgreSQL, а затем попробовать сделать резервную копию. Как только это заработает, добавьте эти команды в раздел exec в вашем app.yml, чтобы они выполнялись после следующей пересборки.
Если вам нужен кто-то, кто проведёт вас через этот процесс, вы можете написать мне по электронной почте или опубликовать сообщение в канале Marketplace.
Отлично! Я бы, вероятно, попытался установить именно клиентские компоненты pg18, чтобы избежать автоматического перехода на версию 19. Также вам стоит добавить эти команды в ваш app.yml, если вы не хотите выполнять их вручную при каждом обновлении.