Перенос базы данных Postgres на центральный сервер БД: ошибка сборки

Привет,
Я в настоящее время мигрирую с классической двухконтейнерной настройки (разделённые контейнеры web_only и data) на настройку, где база данных размещена на центральном сервере баз данных (не внутри контейнера Docker).

Центральная база данных была создана из файла dump.sql, который входит в состав файла резервной копии. Файл docker compose web_only.yaml использует следующие настройки:

подключение к центральному серверу PostgreSQL

DISCOURSE_DB_SOCKET: ‘’
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: xxxx
DISCOURSE_DB_HOST: 10.10.10.xx
DISCOURSE_DB_NAME: discourse

Во время сборки web_only я получаю следующую ошибку:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 741 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db: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.

Хост базы данных доступен с использованием этих данных. Есть какие-либо идеи, что происходит? Та же сборка со стандартным контейнером базы данных завершается успешно.

Вы уверены, что удаленная база данных доступна с сервера? Похоже, что нет. Можете ли вы подключиться к порту базы данных с машины веб-сервера через telnet?

Привет, Джей,

Я изучил обсуждение по Falco по адресу Configure Discourse to use a separate PostgreSQL server. Сервер базы данных доступен с виртуальной машины:

root@docker2:/var/discourse# pg_isready -d discourse -h 10.10.10.18 -p 5432 -U discourse    
10.10.10.18:5432 - Connections are accepted

(подключения принимаются)

Имя базы данных, пользователь и пароль в файле web_only.yml также верны. Ошибка сборки следующая:

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process:
:Status: pid 829 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
bootstrap failed with exit code 1

Я не эксперт в Ruby, поэтому мне нужна помощь в отладке, начиная с этой ошибки.

Пока, Томми

В таком случае:

Какие у вас установлены плагины? Есть ли у вас плагин AI?

Какую версию PostgreSQL вы используете?

  • PostgreSQL 13.12
  • Плагин AI отсутствует
  • Плагины:
cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
          - git clone https://github.com/discourse/discourse-chat-integration
          - git clone https://github.com/discourse/wp-discourse
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-data-explorer
          - git clone https://github.com/paviliondev/discourse-events
          - git clone https://github.com/paviliondev/discourse-locations
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-chat
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-user-notes.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips
          - git clone https://github.com/nathan-nz/discourse-wikified-posts
          - git clone https://github.com/discourse/discourse-post-voting.git
          - git clone https://github.com/discourse/discourse-encrypt.git
          - git clone https://github.com/discourse/discourse-zoom.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-category-experts.git

Вы можете

?

Точное сообщение об ошибке в трассировке стека точно укажет нам, в чём проблема :smile:

Планируете ли вы отказаться от контейнера data?

код ошибки:

> FAILED
> --------------------
> Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' failed with return #<Process::Status: pid 816 exit 1>
> Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap failed with exit code 1

На новой системе данные должны поступать из центральной базы данных вместо базы данных Docker, если это возможно.

Интересно, вызовет ли установка этого значения пустым, а не unset, проблемы.

В любом случае, пожалуйста, опубликуйте полный вывод.

полный лог сборки после

./launcher rebuild web_only

web_only_build.zip (9.4 КБ)

yaml-файл

web_only.zip (2.4 КБ)

Что касается DISCOURSE_DB_SOCKET: «»: поскольку мы используем удалённое подключение, полагаю, что значение сокета не имеет значения в обоих случаях (данные в контейнере или удалённые данные).

Ошибка была выше в логе сборки:

…
docker_manager уже имеет последнюю совместимую версию
wp-discourse уже имеет последнюю совместимую версию

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
Имя плагина — 'discourse-topic-voting', но каталог плагина назван 'discourse-voting'
rake aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied for table users (ActiveRecord::StatementInvalid)

Так что хорошие новости! Подключение работает исправно, нужно лишь настроить права доступа к базе данных.

Хм, странно, пользователь базы данных Discourse на центральном сервере PostgreSQL имеет:

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

Нужны ли для этой роли какие-либо дополнительные права?

Это не затрагивает существующие таблицы.

На первый взгляд, возможно:

ALTER DATABASE "discourse" OWNER TO "discourse";

или:

ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT ALL ON TABLES TO "discourse";

Логи PostgreSQL также должны предоставить более подробную информацию о том, какие операции не удаются.

… хорошо, хорошо, похоже, у меня здесь ещё проблемы с правами доступа, смотрите /var/log/postgresql/postgresql-13-main.log:

2023-11-10 22:07:58.371 UTC [196127] postgres@postgres STATEMENT:  ALTER DEFAULT PRIVILEGES IN SCHEMA 'public' GRANT ALL ON TABLES TO 'discourse';
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse ERROR:  permission denied for table site_settings
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse STATEMENT:  SELECT name, data_type, value FROM site_settings
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse ERROR:  permission denied for table users
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse STATEMENT:  SELECT COUNT(*) FROM (SELECT 1 AS one FROM "users" LIMIT 20) subquery_for_count

Хорошо, как всегда, это была «проблема 8-го уровня» :smiling_face_with_tear:

У меня уже была база данных Discourse в PostgreSQL, но у пользователя/роли discourse не было всех необходимых привилегий на неё. Также я упустил некоторые существенные «поведенческие» различия между MariaDB и PostgreSQL…

Теперь я пересоздал всё: пользователя, базу данных, привилегии для пользователя/роли (включая ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO "discourse";, чтобы обеспечить соответствие для таблиц, создаваемых этим пользователем в будущем).

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