Ошибка подключения к PostgreSQL: /tmp/.s.PGSQL.5432 не найден
При запуске приложения вы можете столкнуться с ошибкой: Unable to connect to database: failed to connect to user=postgres database=postgres: /tmp/.s.PGSQL.5432 (/tmp): dial error: dial unix /tmp/.s.PGSQL.5432: connect: no such file or directory. Это типичная проблема, связанная с отсутствием Unix-сокета PostgreSQL. Рассмотрим причины и способы её устранения.
Почему возникает ошибка отсутствия сокета PostgreSQL?
Ошибка no such file or directory для файла /tmp/.s.PGSQL.5432 указывает на то, что сервер PostgreSQL не запущен или сокет не создан. Это часто происходит, когда:
- PostgreSQL не установлен или не запущен на хосте;
- Приложение пытается подключиться по Unix-сокету, но сервер использует TCP/IP;
- Файл сокета находится в другом каталоге (например,
/var/run/postgresql/); - Недостаточно прав доступа к каталогу
/tmpили самому сокету.
Как проверить, запущен ли PostgreSQL?
Для начала убедитесь, что сервер PostgreSQL активен. Используйте команды:
sudo systemctl status postgresql(на Linux с systemd);pg_isready- проверяет готовность сервера к подключению;ps aux | grep postgres- ищет процессы PostgreSQL.
Если сервер не запущен, выполните sudo systemctl start postgresql или sudo service postgresql start.
Как найти правильный путь к сокету PostgreSQL?
Сокет PostgreSQL может находиться не только в /tmp, но и в других директориях. Проверьте расположение с помощью:
find / -name '.s.PGSQL.5432' 2>/dev/null- поиск файла сокета;ls -la /tmp/.s.PGSQL.5432- проверка наличия в/tmp;- Просмотр конфигурационного файла
postgresql.conf- параметрunix_socket_directoriesуказывает путь.
По умолчанию в Debian/Ubuntu сокет находится в /var/run/postgresql/, а в CentOS/RHEL - в /tmp.
Как изменить настройки подключения в приложении?
Если сокет находится в другом месте, укажите полный путь в строке подключения. Пример для Golang с библиотекой lib/pq:
connStr := host=/var/run/postgresql dbname=postgres user=postgres sslmode=disableТакже можно принудительно использовать TCP-подключение, указав host=localhost и порт 5432. Убедитесь, что в postgresql.conf включена опция listen_addresses = 'localhost'.
Решение для Docker-контейнеров
Если приложение запущено в Docker, а PostgreSQL - на хосте, сокет из контейнера недоступен. Используйте TCP-подключение с хостом host.docker.internal (на Windows/Mac) или IP-адресом хоста. Для Linux добавьте флаг --network host к контейнеру, чтобы разделить сеть с хостом.
Пример строки подключения для Docker:
host=host.docker.internal port=5432 dbname=postgres user=postgres password=yourpassword sslmode=disableПроверка прав доступа к сокету
Убедитесь, что пользователь, под которым запущено приложение, имеет права на чтение/запись сокета. Выполните ls -la /tmp/.s.PGSQL.5432 и проверьте владельца. Если прав недостаточно, измените их через chmod или настройте postgresql.conf (параметр unix_socket_permissions).
Дополнительные советы по отладке
- Проверьте логи PostgreSQL:
sudo tail -f /var/log/postgresql/postgresql-*.log; - Используйте
psql -h /tmp -U postgresдля тестового подключения через сокет; - Если ошибка возникла после обновления PostgreSQL, перезапустите сервер и пересоздайте сокет.