
Имя сервера PostgreSQL – ключевой параметр для подключения к базе данных, но его значение не всегда очевидно. В большинстве случаев оно совпадает с именем хоста, на котором развернут экземпляр, однако в распределенных системах или при использовании контейнеров ситуация усложняется. Например, при работе с Docker имя сервера может быть задано через —name при запуске контейнера или через сетевые алиасы. Если сервер локальный, вместо имени часто используют localhost или 127.0.0.1, но это не универсальное правило.
Первый шаг – проверить конфигурационные файлы PostgreSQL. В postgresql.conf (обычно находится в каталоге /etc/postgresql/[версия]/main/ или /var/lib/postgresql/data/) параметр listen_addresses указывает, на каких адресах сервер принимает соединения. Если там прописано * или конкретный IP, это и будет адресом для подключения. В файле pg_hba.conf можно уточнить разрешенные методы аутентификации и сети, что поможет сузить круг возможных имен.
Если доступ к файлам конфигурации ограничен, используйте SQL-запрос. Выполните в psql или любом клиенте команду:
SELECT inet_server_addr() AS server_ip, current_setting('listen_addresses') AS listen_addresses;
Функция inet_server_addr() вернет IP-адрес сервера, к которому вы подключены, а current_setting() покажет параметры из postgresql.conf. Для получения имени хоста вместо IP используйте:
SELECT host FROM pg_stat_activity WHERE pid = pg_backend_pid();
В облачных решениях (AWS RDS, Google Cloud SQL) имя сервера задается при создании инстанса и отображается в панели управления. Например, в AWS RDS оно выглядит как [имя-инстанса].[идентификатор].us-east-1.rds.amazonaws.com. При работе с Kubernetes имя сервера формируется из имени сервиса и пространства имен: [имя-сервиса].[namespace].svc.cluster.local. В таких случаях проверяйте документацию провайдера или манифесты развертывания.
Если сервер недоступен напрямую, а подключение идет через промежуточный прокси (например, PgBouncer), имя сервера будет соответствовать адресу прокси-сервера. Параметры подключения к прокси указываются в его конфигурационном файле (pgbouncer.ini), где в секции [databases] прописаны алиасы и реальные адреса бэкендов. В этом случае имя сервера для клиента – это адрес PgBouncer, а не самого PostgreSQL.
Проверка имени сервера через SQL-запрос в psql

Подключитесь к кластеру PostgreSQL через клиент psql, выполнив команду psql -U имя_пользователя -h адрес_хоста -p порт. Если соединение установлено, имя сервера можно получить несколькими способами, но наиболее точный – через системные представления.
Выполните запрос SELECT inet_server_addr(), inet_server_port();. Функция inet_server_addr() вернёт IP-адрес сервера, к которому подключён клиент, а inet_server_port() – порт. Эти данные полезны, если сервер имеет несколько сетевых интерфейсов или используется балансировка нагрузки.
Для получения имени хоста используйте SELECT current_setting('listen_addresses');. Параметр listen_addresses в postgresql.conf определяет, на каких адресах сервер принимает соединения. Если значение – * или пустая строка, сервер слушает все интерфейсы.
Запрос SELECT name, setting FROM pg_settings WHERE name IN ('listen_addresses', 'port'); выведет текущие настройки сервера. Это полезно для диагностики, если имя хоста не совпадает с ожидаемым из-за конфигурации или прокси.
Если сервер настроен с использованием доменных имён, выполните SELECT host FROM pg_stat_activity WHERE pid = pg_backend_pid();. Этот запрос вернёт имя хоста или IP-адрес, с которого установлено текущее соединение, что может отличаться от имени сервера в конфигурации.
Для проверки имени кластера используйте SELECT current_database(), current_user;. Хотя это не напрямую связано с именем сервера, комбинация базы данных и пользователя поможет уточнить, к какому экземпляру PostgreSQL вы подключены, особенно в средах с несколькими кластерами.
В случае использования контейнеров или облачных решений имя сервера может динамически назначаться. Запрос SHOW config_file; покажет путь к файлу конфигурации, где можно проверить параметры listen_addresses и port вручную.
Если требуется имя сервера в формате, совместимом с инструментами мониторинга, выполните SELECT version();. Строка версии PostgreSQL часто содержит имя хоста или идентификатор сборки, что может косвенно указать на конкретный сервер в инфраструктуре.
Поиск имени хоста в конфигурационном файле postgresql.conf
Файл postgresql.conf – основной конфигурационный файл PostgreSQL, где задаются параметры подключения, включая имя хоста. По умолчанию он расположен в каталоге данных кластера (например, /etc/postgresql/[версия]/main/ или /var/lib/postgresql/[версия]/main/). Для поиска имени сервера проверьте параметры listen_addresses и port.
Чтобы быстро найти нужные строки, используйте команду:
grep -E 'listen_addresses|port' /путь/к/postgresql.conf
Если listen_addresses содержит * или 0.0.0.0, сервер принимает соединения на всех доступных интерфейсах. Значение localhost или 127.0.0.1 ограничивает подключения локальной машиной.
В некоторых дистрибутивах Linux путь к postgresql.conf можно узнать через:
psql -U postgres -c "SHOW config_file;"sudo -u postgres psql -c "SHOW data_directory;"– затем ищите файл в этом каталоге.
Если файл редактируется вручную, обратите внимание на синтаксис: параметры задаются в формате параметр = значение. Комментарии начинаются с #. Пример корректной настройки:
listen_addresses = '*'port = 5432
После изменения postgresql.conf требуется перезапуск сервера:
sudo systemctl restart postgresql(для systemd)sudo service postgresql restart(для SysVinit)
В Docker-контейнерах путь к файлу может отличаться. Обычно он находится в /var/lib/postgresql/data/postgresql.conf. Для проверки выполните:
docker exec -it [имя_контейнера] cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses
Если listen_addresses не задан, PostgreSQL использует значение по умолчанию – localhost. Это означает, что удаленные подключения будут отклонены. Для разрешения внешних соединений укажите IP-адрес сервера или *.
При проблемах с подключением проверьте также файл pg_hba.conf, где настраиваются правила аутентификации. Он часто находится в том же каталоге, что и postgresql.conf. Без корректных записей в pg_hba.conf даже правильно настроенный listen_addresses не позволит подключиться.
Использование команды hostname для локального сервера
Команда hostname в Linux и Unix-подобных системах возвращает имя хоста текущей машины, что критически важно для идентификации локального сервера PostgreSQL. Выполните её без аргументов в терминале: hostname. Результат – короткое имя сервера, например, postgres-db-01, которое PostgreSQL может использовать в конфигурационных файлах, таких как postgresql.conf или pg_hba.conf.
Для получения полного доменного имени (FQDN) добавьте флаг -f: hostname -f. Это особенно актуально, если сервер работает в сетевой инфраструктуре с DNS-записями. PostgreSQL может требовать FQDN для корректной работы репликации или подключений через libpq, где параметр host в строке подключения должен совпадать с именем сервера.
Если hostname -f возвращает пустое значение или ошибку, проверьте файл /etc/hosts. В нём должна присутствовать строка вида: 127.0.0.1 postgres-db-01.localdomain postgres-db-01. Отсутствие этой записи часто приводит к сбоям при инициализации кластера PostgreSQL через initdb, так как утилита использует имя хоста для генерации идентификаторов.
В системах с systemd имя хоста можно изменить командой hostnamectl set-hostname <новое_имя>. После изменения перезапустите PostgreSQL: sudo systemctl restart postgresql. Это необходимо, чтобы сервис обновил внутренние переменные окружения, включая $HOSTNAME, которые влияют на логирование и идентификацию процессов.
В Docker-контейнерах команда hostname возвращает идентификатор контейнера, например, a1b2c3d4e5f6. Чтобы PostgreSQL использовал осмысленное имя, передайте его через переменную окружения POSTGRES_HOST_AUTH_METHOD или явно укажите в docker-compose.yml параметр hostname. Без этого репликация или подключения через pgAdmin могут завершаться ошибками аутентификации.
Определение имени сервера через переменные окружения
Переменные окружения – один из самых быстрых способов получить имя сервера PostgreSQL без обращения к конфигурационным файлам или запуска SQL-запросов. В большинстве систем имя хоста хранится в переменной PGHOST, которая автоматически используется клиентскими утилитами, такими как psql, при подключении. Если переменная не задана, PostgreSQL по умолчанию пытается подключиться к localhost или сокету Unix-домена. Проверить текущее значение можно командой:
echo $PGHOST
В корпоративных средах или Docker-контейнерах имя сервера часто задаётся через .env-файлы или оркестраторы (например, Kubernetes). В таких случаях переменная PGHOST может ссылаться на DNS-имя сервиса, например, postgres-service.default.svc.cluster.local, или IP-адрес внутренней сети. Для проверки всех переменных окружения, связанных с PostgreSQL, используйте:
env | grep PG
Если переменная PGHOST не установлена, но сервер запущен локально, имя можно определить через сокет. В Linux путь к сокету по умолчанию – /var/run/postgresql/.s.PGSQL.5432, где 5432 – стандартный порт. В Windows PostgreSQL использует именованные каналы, и имя сервера будет localhost или 127.0.0.1. Для принудительного указания переменной в текущей сессии выполните:
export PGHOST=имя_сервера
В CI/CD-конвейерах или скриптах автоматизации переменные окружения часто переопределяются динамически. Например, в GitHub Actions имя сервера может задаваться через секреты (${{ secrets.PG_HOST }}), а в Docker Compose – в разделе environment сервиса. При отладке подключений проверяйте не только PGHOST, но и связанные переменные: PGPORT (порт), PGUSER (пользователь), PGDATABASE (база данных). Их приоритет выше параметров, указанных в командной строке.
Анализ подключения с помощью утилиты pg_isready
В случае ошибок анализируйте коды: 2 указывает на сетевые проблемы (брандмауэр, неправильный хост/порт), 1 – на отказ сервера (например, переполнение диска или сбой процесса). Логи PostgreSQL (pg_log) помогут уточнить причину. Для отладки используйте -v – утилита выведет детали попытки подключения, включая версию протокола и время ожидания.
Просмотр текущих подключений через системную таблицу pg_stat_activity
pg_stat_activity – системное представление, отображающее активные сессии PostgreSQL. Запрос SELECT * FROM pg_stat_activity; возвращает данные о каждом подключении: PID процесса, имя пользователя, IP-адрес клиента, текущую базу данных, состояние сессии (active, idle, idle in transaction), время начала транзакции и выполняемый SQL-запрос. Для фильтрации по конкретной базе используйте условие WHERE datname = 'имя_базы'. Особое внимание уделяйте столбцам state и query – они помогают выявить зависшие транзакции или долго выполняющиеся запросы.
Для анализа проблемных подключений применяйте агрегацию: SELECT state, COUNT(*) FROM pg_stat_activity GROUP BY state; покажет распределение сессий по состояниям. Сессии в состоянии idle in transaction часто становятся причиной блокировок – их можно принудительно завершить командой SELECT pg_terminate_backend(pid);, где pid берётся из столбца pid представления. При мониторинге учитывайте, что pg_stat_activity обновляется не мгновенно: задержка может достигать нескольких секунд, особенно при высокой нагрузке.
Для автоматизации контроля создайте представление с критическими метриками: CREATE VIEW active_connections AS SELECT pid, usename, client_addr, state, query_start, now() - query_start AS duration FROM pg_stat_activity WHERE state != 'idle';. Это позволит быстро идентифицировать подключения, выполняющиеся дольше заданного порога (например, WHERE now() - query_start > interval '5 minutes'). В production-средах рекомендуется логировать такие случаи или интегрировать данные с системами мониторинга (Prometheus, Zabbix) через расширение pg_stat_statements.
Получение имени сервера из файла pg_hba.conf
Файл pg_hba.conf содержит правила аутентификации клиентов PostgreSQL и может косвенно указывать на имя сервера. Путь к файлу по умолчанию: /etc/postgresql/[версия]/main/pg_hba.conf или /var/lib/pgsql/data/pg_hba.conf в зависимости от ОС и способа установки. Откройте файл с правами суперпользователя: sudo nano /etc/postgresql/16/main/pg_hba.conf. Имя сервера часто фигурирует в строках с параметром host или hostssl, где после IP-адреса или подсети указывается имя базы данных и пользователя.
Пример записи: host all all 192.168.1.0/24 md5 не содержит имени сервера, но если строка выглядит как host replication replicator 192.168.1.10/32 trust, имя сервера может быть задано в конфигурации репликации. Для проверки выполните команду psql -c "SHOW hba_file;", чтобы подтвердить путь к файлу. Если имя сервера не указано явно, ищите его в соседних конфигурационных файлах, например, postgresql.conf, где параметр listen_addresses может содержать IP или имя хоста.
В случаях, когда pg_hba.conf ссылается на DNS-имена (например, host all all .example.com md5), имя сервера можно извлечь из обратного DNS-запроса для IP-адреса, указанного в конфигурации. Используйте dig -x [IP] или nslookup [IP] для получения доменного имени. Если сервер настроен на прослушивание только локальных подключений (listen_addresses = 'localhost'), имя сервера, скорее всего, совпадает с именем хоста системы – проверьте его командой hostname.
Для автоматизированного парсинга файла используйте grep с регулярными выражениями: grep -Eo 'host[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]]+[[:space:]]+[^[:space:]]+' pg_hba.conf. Это выведет все строки с правилами хостов, где третье поле может содержать имя сервера или подсеть. Если файл не дает однозначного ответа, обратитесь к логам PostgreSQL (/var/log/postgresql/postgresql-16-main.log), где при старте сервера часто фиксируется его имя в строках вида listening on IPv4 address "[IP]", port 5432.
Использование инструментов мониторинга для идентификации сервера
- Настройте
postgres_exporterс флагом--collector.settingsдля сбораserver_versionиserver_version_num. Пример конфигурации вprometheus.yml:scrape_configs: - job_name: 'postgres' static_configs: - targets: ['localhost:9187']
- В
Datadogсоздайте дашборд с виджетом «Query Value», используя запросavg:postgresql.server.name{*}для отображения имени сервера в реальном времени. - Для
Zabbixдобавьте элемент данных с ключомpgsql.server.name[{$PG.HOST},{$PG.PORT}]и макросом{$PG.HOST}, равным IP или домену сервера. - В
pgAdminпроверьте свойства соединения: имя сервера указано в поле «Name» на вкладке «Connection» при редактировании сервера.
Приоритет отдавайте инструментам, уже интегрированным в инфраструктуру – это сократит время на развёртывание и снизит риск ошибок конфигурации.
