У приложения crm доступ к своей базе есть. На нём видно, как выглядит отказ на каждом этапе подключения.
Четыре попытки отличаются одним ключом psql. -h — адрес сервера, -p — порт (без него 5432), -d — база. -U — роль PostgreSQL, учётная запись внутри сервера. С пользователями Linux она не связана: ты работаешь как student, а входишь ролями crm и shop. Пароль psql ищет в ~/.pgpass, а переменная PGPASSWORD перекрывает файл.
Войди ролью crm четырьмя способами
Войди ролью crm: на порт 5433, в чужую базу shop, с неверным паролем и в свою базу crm.
Сначала предположи
Что ответит psql на порту 5433?
Теперь начни упражнение, выполни команду и сверь прогноз с выводом.
Подключение проходит три проверки по очереди, и у каждой свой отказ.
Первая — сеть. psql открывает TCP-соединение на адрес и порт. Если там никто не слушает, отвечает само ядро — Connection refused. Сервер попытку даже не видел. Что слушается, показывает ss -tln.
Вторая — правило. Соединение принято, и сервер ищет для него строку в файле правил pg_hba.conf. Строка называет, кому, в какую базу и откуда можно войти. Подходящей нет — no pg_hba.conf entry for host …, user …, database …: в отказе ровно то, что сервер сравнивал.
Третья — пароль. Строка нашлась, и её метод scram-sha-256 требует пароль. Неверный — password authentication failed for user ….
Каждый отказ psql печатает дважды: сначала он пробует соединение с шифрованием (SSL encryption), потом без него (no encryption). Причина в обеих строках одна.
В журнале приложения: FATAL: password authentication failed for user "shop". Что из этого следует?
-
Без строки сервер ответил бы
no pg_hba.conf entryи пароль не спрашивал бы. Пароль спрашивает метод найденной строки. -
Тогда psql написал бы
Connection refused. СтрокуFATALпишет сервер — значит, соединение он принял. -
Права на таблицы сервер проверяет после входа, а вход не состоялся: отказ пришёл на пароле.
Сообщение о пароле сервер пишет, только когда соединение принято и строка правила найдена. Значит, сеть и правило пройдены, а пароль в настройках приложения не совпал с паролем роли. Проверить можно так: psql -h 127.0.0.1 -U shop -d shop с паролем из ~/.pgpass.