Ошибка обновления. База данных остановлена. (установка multisite)

Я вошел в систему. Не обновлялся 11 месяцев. Начал с попытки обновить Docker Manager. Он вроде бы никогда не завершался. На следующий день админ-страница практически перестала работать. Я попытался выполнить ./launcher rebuild app. Получаю:

2025-10-30 20:04:52.144 UTC [1892] discourse@c_discourse ERROR:  must be owner of extension vector
2025-10-30 20:04:52.144 UTC [1892] discourse@c_discourse STATEMENT:  ALTER EXTENSION vector UPDATE TO ‘0.7.0’;

Но база данных остановлена, поэтому найденные мной исправления не работают.

2025-10-31 00:27:40.021 UTC [662] FATAL:  database files are incompatible with server
2025-10-31 00:27:40.021 UTC [662] DETAIL:  The data directory was initialized by PostgreSQL version 15, which is not compatible with this version 13.16 (Debian 13.16-1.pgdg120+1).

Но

root@main-app:/var/lib/postgresql# pg_config --version
PostgreSQL 16.4 (Debian 16.4-1.pgdg120+1)

РЕДАКТИРОВАНИЕ: Похоже, база данных всё ещё в формате версии 13?

root@main-app:/var/lib/postgresql# ls
13  take-database-backup

Если вы еще не видели тему PostgreSQL 15 update - Announcements, начните с неё. В ней обсуждается ряд проблем и рекомендаций.

Спасибо. Слишком много, чтобы действительно всё понять, но ничего не кажется моей проблемой. :frowning: База данных, похоже, работает во время процесса перестройки, что странно. По крайней мере, судя по тому, что я могу разглядеть в бегущем тексте.

После 11 месяцев это почти наверняка не сработает.

Вам определённо нужно выполнить обновление до PostgreSQL 15, и это часть проблемы. Возможно, стоит сначала переключиться на PostgreSQL 13, чтобы система снова заработала, а уже затем выполнять обновление.

Это стандартная установка?

Нет, если мультисайт всё ещё считается неподдерживаемым.

Проблема, похоже, в том, что при установке не было привязано имя пользователя/пароль к отдельным базам данных. Это, кажется, изменилось. Именно здесь кроется проблема. Я пытался немного поэкспериментировать, добавив пользователя, а затем пользователя с пустым паролем, но это не помогло.

Моя конфигурация по сравнению с новым образцом конфигурации:


secondsite:
adapter: postgresql
database: b_discourse

pool: 25
timeout: 5000
db_id: 2
host_names:

mlp:
adapter: postgresql
database: discourse_mlp
username: discourse_mlp
password: applejack
host: dbhost
pool: 5
timeout: 5000

host_names:

Значит ли это, что база данных фактически запускается в процессе установки?

2025-10-31 15:14:30.984 UTC [45] LOG:  запуск PostgreSQL 15.14 (Debian 15.14-1.pgdg12+1) на x86_64-pc-linux-gnu, скомпилировано с помощью gcc (Debian 12.2.0
-14+deb12u1) 12.2.0, 64-бит
2025-10-31 15:14:30.984 UTC [45] LOG:  прослушивание IPv4-адреса «0.0.0.0», порт 5432
2025-10-31 15:14:30.984 UTC [45] LOG:  прослушивание IPv6-адреса «::», порт 5432
2025-10-31 15:14:31.055 UTC [45] LOG:  прослушивание Unix-сокета «/var/run/postgresql/.s.PGSQL.5432»
2025-10-31 15:14:31.135 UTC [56] LOG:  система баз данных была остановлена в 2025-10-31 02:08:49 UTC
2025-10-31 15:14:31.199 UTC [45] LOG:  система баз данных готова принимать подключения
I, [2025-10-31T15:14:35.760150 #1]  INFO – :
I, [2025-10-31T15:14:35.760557 #1]  INFO – : > /usr/local/bin/create_db
2025-10-31 15:14:35.912 UTC [63] postgres@postgres ERROR:  база данных «discourse» уже существует
2025-10-31 15:14:35.912 UTC [63] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «discourse» уже существует
2025-10-31 15:14:36.060 UTC [66] postgres@discourse ERROR:  роль «discourse» уже существует
2025-10-31 15:14:36.060 UTC [66] postgres@discourse STATEMENT:  create user discourse;
ERROR:  роль «discourse» уже существует
NOTICE:  расширение «hstore» уже существует, пропускаем
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
NOTICE:  расширение «vector» уже существует, пропускаем
NOTICE:  версия «0.8.1» расширения «vector» уже установлена
NOTICE:  расширение «hstore» уже существует, пропускаем
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
NOTICE:  расширение «vector» уже существует, пропускаем
NOTICE:  версия «0.8.1» расширения «vector» уже установлена
I, [2025-10-31T15:14:37.265035 #1]  INFO – : GRANT
ALTER SCHEMA
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
UPDATE 0

I, [2025-10-31T15:14:37.265325 #1]  INFO – : > echo postgres installed!
I, [2025-10-31T15:14:37.270967 #1]  INFO – : postgres установлен!

I, [2025-10-31T15:14:37.271578 #1]  INFO – : > sudo -u postgres createdb b_discourse || exit 0
2025-10-31 15:14:37.380 UTC [104] postgres@postgres ERROR:  база данных «b_discourse» уже существует
2025-10-31 15:14:37.380 UTC [104] postgres@postgres STATEMENT:  CREATE DATABASE b_discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «b_discourse» уже существует
I, [2025-10-31T15:14:37.385149 #1]  INFO – :
I, [2025-10-31T15:14:37.385968 #1]  INFO – : > sudo -u postgres psql b_discourse
I, [2025-10-31T15:14:37.390476 #1]  INFO – : grant all privileges on database b_discourse to discourse;

I, [2025-10-31T15:14:37.515870 #1]  INFO – : > sudo -u postgres createdb c_discourse || exit 0
2025-10-31 15:14:37.625 UTC [111] postgres@postgres ERROR:  база данных «c_discourse» уже существует
2025-10-31 15:14:37.625 UTC [111] postgres@postgres STATEMENT:  CREATE DATABASE c_discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «c_discourse» уже существует
I, [2025-10-31T15:14:37.629387 #1]  INFO – :
I, [2025-10-31T15:14:37.630145 #1]  INFO – : > sudo -u postgres psql c_discourse
I, [2025-10-31T15:14:37.634672 #1]  INFO – : grant all privileges on database c_discourse to discourse;

I, [2025-10-31T15:14:37.758171 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “alter schema public owner to discourse;”’
I, [2025-10-31T15:14:37.876557 #1]  INFO – : ALTER SCHEMA

I, [2025-10-31T15:14:37.877104 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists hstore;”’
NOTICE:  расширение «hstore» уже существует, пропускаем
I, [2025-10-31T15:14:37.997465 #1]  INFO – : CREATE EXTENSION

I, [2025-10-31T15:14:37.998029 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists pg_trgm;”’
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
I, [2025-10-31T15:14:38.117879 #1]  INFO – : CREATE EXTENSION

2025-10-31 15:14:30.984 UTC [45] LOG:  запуск PostgreSQL 15.14 (Debian 15.14-1.pgdg12+1) на x86_64-pc-linux-gnu, скомпилировано с помощью gcc (Debian 12.2.0
-14+deb12u1) 12.2.0, 64-бит
2025-10-31 15:14:30.984 UTC [45] LOG:  прослушивание IPv4-адреса «0.0.0.0», порт 5432
2025-10-31 15:14:30.984 UTC [45] LOG:  прослушивание IPv6-адреса «::», порт 5432
2025-10-31 15:14:31.055 UTC [45] LOG:  прослушивание Unix-сокета «/var/run/postgresql/.s.PGSQL.5432»
2025-10-31 15:14:31.135 UTC [56] LOG:  система баз данных была остановлена в 2025-10-31 02:08:49 UTC
2025-10-31 15:14:31.199 UTC [45] LOG:  система баз данных готова принимать подключения
I, [2025-10-31T15:14:35.760150 #1]  INFO – :
I, [2025-10-31T15:14:35.760557 #1]  INFO – : > /usr/local/bin/create_db
2025-10-31 15:14:35.912 UTC [63] postgres@postgres ERROR:  база данных «discourse» уже существует
2025-10-31 15:14:35.912 UTC [63] postgres@postgres STATEMENT:  CREATE DATABASE discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «discourse» уже существует
2025-10-31 15:14:36.060 UTC [66] postgres@discourse ERROR:  роль «discourse» уже существует
2025-10-31 15:14:36.060 UTC [66] postgres@discourse STATEMENT:  create user discourse;
ERROR:  роль «discourse» уже существует
NOTICE:  расширение «hstore» уже существует, пропускаем
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
NOTICE:  расширение «vector» уже существует, пропускаем
NOTICE:  версия «0.8.1» расширения «vector» уже установлена
NOTICE:  расширение «hstore» уже существует, пропускаем
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
NOTICE:  расширение «vector» уже существует, пропускаем
NOTICE:  версия «0.8.1» расширения «vector» уже установлена
I, [2025-10-31T15:14:37.265035 #1]  INFO – : GRANT
ALTER SCHEMA
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
ALTER EXTENSION
UPDATE 0

I, [2025-10-31T15:14:37.265325 #1]  INFO – : > echo postgres installed!
I, [2025-10-31T15:14:37.270967 #1]  INFO – : postgres установлен!

I, [2025-10-31T15:14:37.271578 #1]  INFO – : > sudo -u postgres createdb b_discourse || exit 0
2025-10-31 15:14:37.380 UTC [104] postgres@postgres ERROR:  база данных «b_discourse» уже существует
2025-10-31 15:14:37.380 UTC [104] postgres@postgres STATEMENT:  CREATE DATABASE b_discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «b_discourse» уже существует
I, [2025-10-31T15:14:37.385149 #1]  INFO – :
I, [2025-10-31T15:14:37.385968 #1]  INFO – : > sudo -u postgres psql b_discourse
I, [2025-10-31T15:14:37.390476 #1]  INFO – : grant all privileges on database b_discourse to discourse;

I, [2025-10-31T15:14:37.515870 #1]  INFO – : > sudo -u postgres createdb c_discourse || exit 0
2025-10-31 15:14:37.625 UTC [111] postgres@postgres ERROR:  база данных «c_discourse» уже существует
2025-10-31 15:14:37.625 UTC [111] postgres@postgres STATEMENT:  CREATE DATABASE c_discourse;
createdb: ошибка: создание базы данных не удалось: ERROR:  база данных «c_discourse» уже существует
I, [2025-10-31T15:14:37.629387 #1]  INFO – :
I, [2025-10-31T15:14:37.630145 #1]  INFO – : > sudo -u postgres psql c_discourse
I, [2025-10-31T15:14:37.634672 #1]  INFO – : grant all privileges on database c_discourse to discourse;

I, [2025-10-31T15:14:37.758171 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “alter schema public owner to discourse;”’
I, [2025-10-31T15:14:37.876557 #1]  INFO – : ALTER SCHEMA

I, [2025-10-31T15:14:37.877104 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists hstore;”’
NOTICE:  расширение «hstore» уже существует, пропускаем
I, [2025-10-31T15:14:37.997465 #1]  INFO – : CREATE EXTENSION

I, [2025-10-31T15:14:37.998029 #1]  INFO – : > /bin/bash -c ‘sudo -u postgres psql b_discourse <<< “create extension if not exists pg_trgm;”’
NOTICE:  расширение «pg_trgm» уже существует, пропускаем
I, [2025-10-31T15:14:38.117879 #1]  INFO – : CREATE EXTENSION


Расширение Pgvector либо устарело, либо не настроено в одной из ваших баз данных. Я сталкивался с этой проблемой на нескольких установках несколько месяцев назад. Её очень просто решить: достаточно просто обновить расширение.

Войдите в контейнер БД, выполните psql от имени пользователя discourse (или вашего владельца БД), затем выберите каждую базу данных и выполните:

ALTER EXTENSION vector UPDATE;

P.S.: Похоже, что ваша конфигурация немного отличается; приведённая команда сработает только в том случае, если у вас отдельный контейнер данных.

Похоже, что владелец расширения для базы данных c_discourse — не пользователь discourse. Вам нужно проверить, кто является владельцем, например:

discourse_development=# select extname, extowner, usename, extversion from pg_extension JOIN pg_user on pg_extension.extowner = pg_user.usesysid;
 extname  | extowner | usename  | extversion 
----------+----------+----------+------------
 vector   |    16385 | michael  | 0.8.0
 unaccent |       10 | postgres | 1.1
 pg_trgm  |       10 | postgres | 1.6
 hstore   |       10 | postgres | 1.8
 plpgsql  |       10 | postgres | 1.0

и выполнить команду обновления расширения от имени этого пользователя или суперпользователя базы данных.

Любая помощь с запуском базы данных для этого? Это действительно главная проблема.

РЕДАКТИРОВАНИЕ: Я нахожу только файлы postgres версии /13. Так что я как бы в подвешенном состоянии. Похоже, что программа базы данных обновила, но файлы базы данных — нет. Я провел несколько поисков, но ничего, с чем я был бы уверен, кроме как попробовать скопировать файлы и поиграть с ними.

2025-10-31 00:27:40.021 UTC [662] FATAL: файлы базы данных несовместимы с сервером
2025-10-31 00:27:40.021 UTC [662] DETAIL: Каталог данных был инициализирован PostgreSQL версии 15, который не совместим с этой версией 13.16 (Debian 13.16-1.pgdg120+1).

Вы должны иметь возможность отредактировать файл app.yml, использовать шаблон PostgreSQL 13 и выполнить пересборку, как описано в теме Обновление PostgreSQL 15.

Затем вы можете выполнить пересборку. После этого запустить контейнер. Затем войти в контейнер. И наконец, выполнить операции с pgvector.

Что ж, это удалило 15-ю версию и установило 13-ю, но, странно, ошибка та же. Процесс прервался гораздо ближе к началу. :frowning:

2025-11-01 15:30:26.522 UTC [2547] FATAL: файлы базы данных несовместимы с сервером
2025-11-01 15:30:26.522 UTC [2547] DETAIL: Каталог данных был инициализирован в PostgreSQL версии 15, что несовместимо с этой вер
сией 13.22 (Debian 13.22-1.pgdg12+1).

Вот где происходит сбой:
Failed to migrate secondsite
#<StandardError:"An error has occurred, this and all later migrations canceled:\n\nERROR: must be owner of extension vector\n">
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/pg/alias_method.rb:109:in `exec'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/rack-mini-profiler-4.0.1/lib/patches/db/pg/alias_method.rb:109:in `async_exec'

Я попробовал шаблон 13-й версии. Проблема в том, что база данных уже была изменена 15-й версией, но миграция двух дополнительных мульти-сайтов каким-то образом была выполнена от имени пользователя, который, похоже, не распознаётся установщиком. Как я уже говорил выше, при их первоначальном добавлении не требовалось указывать пару «пользователь/пароль», поэтому я точно не знаю, как они были добавлены в базу данных.

Есть ли какое-то значение, которое я могу добавить в опции пользователя/пароля, чтобы удовлетворить эти требования? Помните, что я их не добавлял, так что под каким именем их поместил первоначальный скрипт, если не postgres, который, судя по выводу, является пользователем по умолчанию?

Возможно ли просто закомментировать эти два добавленных сайта, чтобы запустить базу данных, а затем, возможно, использовать любой метод импорта, который используется сейчас?

Это в основном личный сайт, и его потеря будет неприятной, но не катастрофической. Я «в полной уверенности» (stew_pidly) думал, что мои обычные резервные копии это учитывают. :frowning:

Если вы посмотрите на тему pg 15, там указано, как переименовать директорию резервной копии, в которой всё ещё находятся файлы pg 13.

Это длинная ветка, поэтому позвольте мне убедиться, что я смотрю на правильное место.

  1. Используйте шаблон 13.
  2. mv /shared/postgres_data в что-то вроде /shared/postgres_data.bak
  3. mv /shared/postgres_data_old в /shared/postgres_data

И это запустит базу данных со старой версией?

root@main-app:/shared/postgres_data_old# cat PG_VERSION
13
root@main-app:/shared/postgres_data# cat PG_VERSION
15

Затем займёмся

База данных всегда была моей слабой стороной. :frowning: Похоже, здесь всё устроено иначе, чем я думал: я полагал, что всё это находится в /var/lib/postgresql в одном из тех странных, непонятно пронумерованных каталогов.

Я очень ценю всю помощь. Есть несколько форумов, где именно я качаю головой, глядя на некоторых пользователей. :wink:

Если вы собираете версию Discourse с включёнными плагинами, сборка завершится ошибкой из-за отсутствия расширения pgvector, независимо от версии PostgreSQL. Если у вас более старая версия PostgreSQL, проблем возникнет ещё больше, чем изначально.

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

Я рекомендую развернуть новый экземпляр Discourse в другом месте и восстановить из резервной копии. Это единственный надёжный способ выйти из сложившейся ситуации.

Вы можете сделать это вручную, но это потребует гораздо больше усилий и не гарантирует успешного результата.

Неужели вчера вечером была выкатана новая версия? Мне казалось, я видел какие-то git pull. В любом случае, использование шаблона 13 и перенос данных сработали. Ну, в некотором роде. :wink:

База данных, похоже, мигрировала нормально. Я не могу найти ошибку «grant» среди страниц и страниц вывода. Это не значит, что её там нет. Возможно, мне придётся запустить discourse_doctor, чтобы получить сохранённый вывод, в котором я смогу искать ошибки. База данных запущена и работает. Теперь у меня ошибка страницы вместо ошибки «bad gateway» в браузере. Для полноты картины я приведу здесь последний фрагмент вывода, но если я не найду ту же ошибку grant, что и раньше, я открою новую тему.

Спасибо всем, кто помогал до сих пор. Как минимум, теперь у меня есть доступ к базе данных. Большое спасибо всем, кто помог мне продвинуться так далеко.

ОЧЕНЬ ЦЕНЮ!


== 20240611170904 UpgradePgvector070: migrating ===============================

I, [2025-11-02T15:17:02.281908 #1] INFO -- : Terminating async processes
I, [2025-11-02T15:17:02.282204 #1] INFO -- : Sending INT to HOME=/var/lib/postgresql USER=postgres exec chpst -u postgres:postgres:ssl-cert -U p
ostgres:postgres:ssl-cert /usr/lib/postgresql/13/bin/postmaster -D /etc/postgresql/13/main pid: 2547
I, [2025-11-02T15:17:02.282450 #1] INFO -- : Sending TERM to exec chpst -u redis -U redis /usr/bin/redis-server /etc/redis/redis.conf pid: 2644
2025-11-02 15:17:02.289 UTC [2547] LOG: received fast shutdown request
2644:signal-handler (1762096622) Received SIGTERM scheduling shutdown...
2644:M 02 Nov 2025 15:17:02.299 # User requested shutdown...
2644:M 02 Nov 2025 15:17:02.299 * Saving the final RDB snapshot before exiting.
2025-11-02 15:17:02.384 UTC [2547] LOG: aborting any active transactions
2025-11-02 15:17:02.391 UTC [2547] LOG: background worker "logical replication launcher" (PID 2562) exited with exit code 1
2025-11-02 15:17:02.452 UTC [2557] LOG: shutting down
2644:M 02 Nov 2025 15:17:02.549 * DB saved on disk
2644:M 02 Nov 2025 15:17:02.549 # Redis is now ready to exit, bye bye...
2025-11-02 15:17:06.304 UTC [2547] LOG: database system is shut down

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate failed with return #<Process::Status: pid 4308
exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.3.0/lib/pups/exec_command.rb:131:in `spawn'
exec failed with the params "cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.

РЕДАКТИРОВАНИЕ: Нашёл это в логах. Пока я не запущу doctor и не поищу ошибки, ничего делать не буду.
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse LOG: provided user name (postgres) and authenticated user name (discourse) do not match
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse FATAL: Peer authentication failed for user "postgres"
2025-11-02 16:10:09.680 UTC [6244] postgres@c_discourse DETAIL: Connection matched pg_hba.conf line 89: "local all postgres
peer"

Чтобы завершить эту тему, я запустил doctor и обнаружил ошибку ALTER. Так как база данных была запущена, я выполнил команду ALTER для баз данных, участвующих в мультисайте, повторно запустил сборку, и теперь они мигрированы. Доступ пользователя к базе данных сохраняется, но я открою отдельную тему по этому вопросу.

Ещё раз спасибо всем за помощь в достижении этого этапа.

Поскольку я перемещал их от имени root, мне пришлось выполнить chown, а затем chmod для файлов. Я не задокументировал эти шаги, но вывод ошибки подсказал их.

Ссылка на текущую проблему.