Привет,
Я в настоящее время мигрирую с классической двухконтейнерной настройки (разделённые контейнеры web_only и data) на настройку, где база данных размещена на центральном сервере баз данных (не внутри контейнера Docker).
Центральная база данных была создана из файла dump.sql, который входит в состав файла резервной копии. Файл docker compose web_only.yaml использует следующие настройки:
Во время сборки 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?
Что касается 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)
Так что хорошие новости! Подключение работает исправно, нужно лишь настроить права доступа к базе данных.
… хорошо, хорошо, похоже, у меня здесь ещё проблемы с правами доступа, смотрите /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-го уровня»
У меня уже была база данных Discourse в PostgreSQL, но у пользователя/роли discourse не было всех необходимых привилегий на неё. Также я упустил некоторые существенные «поведенческие» различия между MariaDB и PostgreSQL…
Теперь я пересоздал всё: пользователя, базу данных, привилегии для пользователя/роли (включая ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO "discourse";, чтобы обеспечить соответствие для таблиц, создаваемых этим пользователем в будущем).
Сборка завершилась, и экземпляр работает корректно с удалённым сервером PostgreSQL, поэтому он готов к импорту резервной копии из более старой версии.