#Что означает ошибка
psql: error: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
«Connection refused» — порт 5432 никто не слушает по тому адресу, к которому вы подключаетесь. Причины: служба PostgreSQL остановлена, она слушает только localhost (параметр listen_addresses), используется другой порт, либо файрвол закрывает соединение. Отказ в доступе по паролю — это уже другая ошибка (no pg_hba.conf entry, password authentication failed), поэтому её не путайте.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Служба не запущенаPostgreSQL остановлен. | systemctl status postgresql — inactive. | Запустите. |
| Другой порт или адресСервер слушает другой порт/интерфейс. | ss -tlnp не показывает 5432. | Проверьте port и listen_addresses. |
| Закрыт брандмауэромПорт блокируется. | Локально работает, снаружи нет. | Откройте порт. |
| Правила pg_hba.confНет разрешения для клиента. | В логе no pg_hba.conf entry. | Добавьте правило. |
#Пошаговое решение
- Проверьте службуНа компьютере клиента откройте терминал (Windows: «Пуск» → «PowerShell»; Linux: «Терминал») и запишите адрес сервера и порт из настроек приложения. Если используете
psql, выполните тест с реальными значениями:psql -h 127.0.0.1 -p 5432 -U username -d dbnameна самом сервере или укажите настоящий адрес сервера на клиенте. Заглушкиusernameиdbnameзамените.Connection refusedозначает, что TCP-соединение отвергнуто; это не ошибка пароля или правилpg_hba.conf. Приpassword authentication failedперейдите к диагностике учётной записи. - Проверьте портНа СЕРВЕРЕ Linux администратор через SSH выполняет
systemctl status postgresql --no-pagerи, для Debian/Ubuntu с несколькими кластерами,pg_lsclusters(если утилита установлена). Проверьте точное имя и состояние нужного экземпляра: агрегированная службаpostgresqlможет быть active без рабочего кластера. Если нужный экземпляр остановлен, изучите журналjournalctl -u ИМЯ_СЛУЖБЫ -n 80 --no-pager; запуск согласуйте с ответственным за базу. На Windows откройте Win+R →services.mscи найдите службу PostgreSQL по версии. - Посмотрите журналНа том же сервере выполните
sudo ss -ltnp(Linux) или в PowerShellGet-NetTCPConnection -State Listen(Windows) и найдите реальный TCP-порт PostgreSQL. Строка127.0.0.1:5432означает, что сервис слушает только IPv4 на локальном компьютере;0.0.0.0:5432— на всех IPv4-интерфейсах; порт может отличаться от 5432. Если строки нет, проверьте журнал PostgreSQL, успешность запуска кластера и наличие другого занятого порта. Не открывайте брандмауэр, пока сервис не начал слушать. - Найдите конфигурациюЕсли сервер работает локально, администратор входит в
psql(на Linux с разрешённой локальной проверкой:sudo -u postgres psql) и выполняетSHOW config_file; SHOW hba_file; SHOW port; SHOW listen_addresses;. Выберите именно фактически загружаемыйpostgresql.conf; сначала запишите его прежнее содержимое. Для удалённого доступа назначьтеlisten_addressesна конкретный внутренний IP сервера или иное согласованное значение, а не бездумно'*'; настройте подходящее правилоpg_hba.confдля ограниченного IP клиента, пользователя и базы с безопасным методом аутентификации. Если подключение нужно только локально, эти изменения пропустите. - Настройте listen_addressesПосле изменения
listen_addressesPostgreSQL требует перезапуска конкретного экземпляра, который прервёт активные соединения: согласуйте окно обслуживания, сохраните резервную копию конфигурации и используйте службу нужного кластера. Для изменений толькоpg_hba.confобычно достаточно перечитать конфигурацию черезSELECT pg_reload_conf();из привилегированного сеанса. Снова выполнитеss -ltnpи проверьте, что слушается нужный IP/порт. При ошибке запуска верните прежнюю конфигурацию и посмотрите последние строки журнала. - Настройте pg_hba.confНа клиенте проверьте доступ к выбранному серверу и порту: Windows PowerShell —
Test-NetConnection -ComputerName ИМЯ -Port 5432, Linux/macOS —nc -vz ИМЯ 5432при наличииnc.TcpTestSucceeded: Falseилиrefusedтребует проверки маршрута, VPN и сетевых правил, только после проверки слушателя. Администратор может разрешить порт строго с IP приложения во внутреннем брандмауэре; не публикуйте порт PostgreSQL во всём интернете. Успешный TCP-тест означает только доступ к порту. - ПерезапуститеЕсли соединение идёт из Docker, проверьте файл Compose и настройки сети: имя
localhostвнутри контейнера обозначает сам этот контейнер, а не хост/другой сервис. При общей сети Compose используйте имя сервиса базы и её внутренний порт, проверьтеdocker compose psи журналы PostgreSQLdocker compose logs --tail=80 ИМЯ_СЕРВИСА. Не добавляйтеports: '5432:5432'ради соединения двух сервисов в одной сети: это делает порт доступным на узле без необходимости. - Откройте портВ конце повторите штатное подключение из приложения. В
psqlпосле успешного входа выполнитеSELECT current_database(), current_user;и убедитесь, что это нужная база и роль. Если теперь появляетсяno pg_hba.conf entryилиpassword authentication failed, первоначальная проблема доступности порта решена, но требуется отдельное исправление правила доступа или пароля. Сохраните точный текст новой ошибки и откатите лишние изменения сетевых настроек. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
Для удалённых подключений используйте закрытую сеть/VPN и ограниченные правила доступа. Если база доступна только на сервере, безопаснее оставить listen_addresses = localhost и подключаться через согласованный SSH-туннель. В Docker публикация порта 5432:5432 обычно не нужна контейнерам в одной внутренней сети.