Ошибка подключения к 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, перезапустите сервер и пересоздайте сокет.

    Часто задаваемые вопросы