psql: error: connection to server at "10.0.0.5", port 5432 failed: FATAL: no pg_hba.conf entry for host "10.0.0.7", user "app", database "appdb", no encryption
#Два разных случая
Сообщения бывают двух типов. could not connect to server: Connection refused — сервер недоступен: служба не запущена, не слушает нужный адрес, порт закрыт файрволом. FATAL: no pg_hba.conf entry for host ... — сервер доступен, но правила аутентификации в pg_hba.conf не содержат записи для вашего клиента (адрес, пользователь, база, SSL). Диагностика начинается с определения типа ошибки.
#Причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет строки в pg_hba.confАдрес клиента не разрешён. | no pg_hba.conf entry. | Добавьте строку. |
| Сервер слушает только localhostПо умолчанию. | Connection refused извне. | Измените listen_addresses. |
| Служба не запущенаСбой. | Порт не слушается. | Запустите, смотрите журнал. |
| Закрыт портФайрвол. | nc не подключается. | Откройте для нужных адресов. |
| Неверный метод или парольscram vs md5. | password authentication failed. | Сбросьте пароль, проверьте метод. |
| Требуется SSLhostssl. | no encryption. | Подключайтесь с sslmode=require. |
#Порядок
- Проверьте, запущен ли PostgreSQLСообщение именно
no pg_hba.conf entryуже означает, что сервер PostgreSQL принял попытку соединения, но не нашёл разрешающего правила для адреса, пользователя и базы. Поэтому вначале запишите из ошибки IP клиента, имя роли, название базы и наличиеSSL encryption/no encryption. Если соединение вообще «refused» или «timed out», только тогда на сервере Linux откройте терминал и проверьтеsudo systemctl status postgresql --no-pager; конкретный экземпляр может иметь другое имя службы. Строкаactive (running)означает запуск службы, но не подтверждает настройки доступа. - Проверьте, на каких адресах и порту он слушаетНа сервере Linux в терминале выполните
sudo -u postgres psql -c "SHOW listen_addresses;" -c "SHOW port;"(только если локальный вход под postgres разрешён). Если выводlocalhost, удалённые подключения недоступны; в других установках значение может задаваться отдельно. Для уже полученной ошибкиno pg_hba.conf entryобычно не требуется менятьlisten_addresses, ведь соединение дошло до сервера. Адрес/порт уточните у администратора базы; для параметраlisten_addressesнеобходим перезапуск, а не только перечитывание конфигурации. - Проверьте доступность порта с клиентаНа компьютере приложения откройте терминал и проверьте достижимость фактического сервера:
nc -zv 10.0.0.5 5432(Linux/macOS; замените адрес и порт). Затем попробуйтеpsqlс отдельными параметрами host/dbname/user. Если ошибка повторяется с текстомno pg_hba.conf entry, переходите к правилам доступа. ЕслиConnection refused/timed out, сначала разбирайтесь с сетью, портом и брандмауэром, а не с паролем. - Найдите файл pg_hba.confНа сервере с правами администрирования БД выполните в
psql:SHOW hba_file;и скопируйте полученный абсолютный путь — он надёжнее предполагаемого/etc/postgresql/16/main/pg_hba.conf. Сделайте резервную копию файла (например,sudo cp /путь/pg_hba.conf /путь/pg_hba.conf.bakс реальным путём) и откройте его черезsudo nanoили другой штатный редактор. На управляемом хостинге запросите изменение у администратора. - Добавьте строку для вашего клиентаДобавьте отдельное правило только для требуемой базы, роли и IP клиента, например
host appdb app 10.0.0.7/32 scram-sha-256для одного IPv4-адреса. Перед сохранением заменитеappdb,appи адрес своими данными; не вводите/32для динамической подсети, пока не согласуете диапазон. Учитывайте порядок: PostgreSQL использует ПЕРВОЕ подходящее правило, последующие не проверяются. Для соединений, где обязателен TLS, выбираютhostsslпосле настройки серверного TLS;trustи0.0.0.0/0не используйте. - Перезагрузите конфигурациюСохраните файл (
Ctrl+O, Enter,Ctrl+Xв nano). Выполнитеsudo -u postgres psql -c "SELECT pg_reload_conf();"; ответtозначает, что запрос на перечитывание принят, а не что все правила верны. ВpsqlвыполнитеSELECT line_number,error FROM pg_hba_file_rules WHERE error IS NOT NULL;: результат без строк означает, что представленные правила разобраны без диагностированных ошибок. На Windows новые соединения могут учитывать правкиpg_hba.confсразу; полный перезапуск PostgreSQL для изменения только этого файла не нужен. - Проверьте пользователя и пароль, шифрование пароляПовторите
psqlс клиентского компьютера и прочитайте новое сообщение.password authentication failedозначает, что правило теперь подходит, но учётные данные неверны; не ослабляйте метод наtrust. Проверьте точное имя пользователя, пароль и совпадение способа аутентификации с настройками сервера. После успешного входа выполнитеSELECT current_user, current_database();, чтобы исключить подключение не к той базе. - Откройте порт в файрволеТолько если подключение не достигает PostgreSQL вовсе и проверка порта неуспешна, проверьте брандмауэр. На сервере с UFW администратор может разрешить входящий TCP 5432 только с установленного IP приложения:
sudo ufw allow from 10.0.0.7 to any port 5432 proto tcp(IP заменить). Проверьте также сетевые группы облака и маршрутизацию; никакие изменения брандмауэра не исправят неверное правилоpg_hba.conf, если сервер уже отвечает этим сообщением. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Расположение файлов
В Debian/Ubuntu файлы лежат в /etc/postgresql/16/main/ (версия может отличаться), в RHEL — /var/lib/pgsql/16/data/. Точный путь покажет SHOW hba_file;. Журнал: /var/log/postgresql/postgresql-16-main.log. На Linux и большинстве Unix-систем pg_hba.conf перечитывается после pg_reload_conf() без обрыва подключений; в Windows изменения этого файла учитываются для новых соединений сразу. Изменение listen_addresses требует перезапуска экземпляра PostgreSQL.