РЕДАКТИРОВАНИЕ/Tl;dr: В ActiveRecord::Base.connection_pool.db_config.configuration_hash имя пользователя находится в ключе user, а не username, но Discourse ищет его в username.
…
У меня есть мультисайтовая установка, использующая хостинг PostgreSQL от Digital Ocean. Всё работает нормально, но при попытке создания резервной копии возникает ошибка:
[2024-08-05 16:13:31] pg_dump: ошибка: не удалось подключиться к серверу "private-forum-cluster-postgresql-prod-do-user-1230.j.db.ondigitalocean.com" (10.11.1.6), порт 25060: FATAL: сбой аутентификации по паролю для пользователя "discourse"
Но пользователь — не discourse. В других местах используется правильный пользователь, включая ActiveRecord::Base.connection_pool.db_config.configuration_hash и BackupRestore.database_configuration (когда я запускаю эти команды в RAILS_DB=sitename rails c). Переменная окружения PG_USER не установлена (насколько я могу видеть).
Похоже, что проблема в этом:
Я отредактировал файл внутри контейнера (чтобы брать данные из DISCOURSE_DB_USER, что на тот момент казалось хорошей идеей), и резервное копирование теперь работает. Не знаю, следует ли извлекать информацию о подключении из multisite.yml, но игнорирование DB_USER кажется неправильным.
Или, может быть, мне просто нужно сделать имя пользователя discourse, как, полагаю, делают все остальные?
РЕДАКТИРОВАНИЕ: Стоп. Нет.
config['username'] должно быть config['user']
config = ActiveRecord::Base.connection_pool.db_config.configuration_hash
возвращает следующее!
=> {:adapter=>"postgresql",
:database=>"theDatabase",
:pool=>25,
:port=>25060,
:timeout=>5000,
:host=>"private-forum-cluster-postgresql-prod-do-user-123-0.j.db.ondigitalocean.com",
:user=>"theCurrentUsername",
:password=>"supersecret",
:host_names=>["forum.example.com"],
:db_key=>"mydb",
:prepared_statements=>false}
Поэтому
config["username"] || username || ENV["USER"] || "postgres",
должно быть
config["user"] || username || ENV["USER"] || "postgres",