Диагностика
Симптомы, на которые вы скорее всего наступите в первую неделю работы PgDoorman, и куда смотреть, когда наступили.
Ошибки аутентификации при подключении к PostgreSQL
Симптом: PgDoorman принимает клиентское соединение, но первый же запрос возвращает password authentication failed от PostgreSQL.
Когда username пула совпадает с ролью на backend
PgDoorman по умолчанию использует passthrough authentication — криптографическое доказательство клиента (MD5-хеш или SCRAM ClientKey) повторно используется для аутентификации к PostgreSQL. Поле password в конфиге должно содержать именно тот хеш, что хранится в pg_authid / pg_shadow:
SELECT usename, passwd FROM pg_shadow WHERE usename = 'your_user';
Для SCRAM оба процесса должны видеть одни и те же salt и iteration count — даже один отличающийся символ в сохранённом verifier ломает passthrough.
Когда username пула отличается от роли на backend
Когда username, под которым клиент подключается к pg_doorman, не совпадает с реальной ролью PostgreSQL, passthrough работать не может: у pg_doorman нет пароля для backend-роли. Укажите явные credentials:
users:
- username: "app_user" # имя для клиента
password: "md5..." # хеш для аутентификации client → pg_doorman
server_username: "pg_app_user" # реальная роль в PostgreSQL
server_password: "plaintext_pwd" # plaintext-пароль для этой роли
pool_size: 40
Это же путь для JWT-аутентификации, где клиент не присылает пароль.
pg_doorman generate --host … интроспектирует PostgreSQL и собирает конфиг с уже подставленными хешами. Быстрее, чем копировать руками из pg_shadow.
Файл конфигурации не найден
Симптом: PgDoorman при запуске завершается с configuration file not found.
По умолчанию бинарник ищет pg_doorman.toml в текущем рабочем каталоге. Либо назовите файл так и cd в его каталог, либо передайте путь явно:
pg_doorman /etc/pg_doorman/pg_doorman.yaml
Проверка перед запуском:
pg_doorman -t /etc/pg_doorman/pg_doorman.yaml
Клиенты получают 58006 (pooler is shut down now)
Пул выключается, либо горячая замена процесса была запущена в режиме демона. Посмотрите серверные логи рядом с временем ошибки:
Got SIGUSR2, starting binary upgrade …— идёт горячая замена процесса. В foreground-режиме свободные TCP-клиенты без TLS должны мигрировать прозрачно; TLS-клиенты мигрируют только со сборкойtls-migration.58006получают клиенты, оставшиеся в транзакции послеshutdown_timeout. В режиме демона миграции через файловые дескрипторы нет, и каждый клиент получает58006при закрытии соединения. См. Горячая замена процесса с переносом сессий → Диагностика.- Нет строки
SIGUSR2в логе — кто-то прислалSIGTERMилиSIGINT, и пулер выключился без замены. Проверьте systemd-юнит, конкретный pid и operator runbook.
Если 58006 пришёл во время плановой замены — для этой подмножества клиентов это ожидаемое поведение. Настройте connection pool приложения на retry при transient-ошибках.
Размер пула слишком мал
Симптом: запросы ходят заметно дольше end-to-end, чем при прямом обращении к PostgreSQL.
Смотрите SHOW POOLS и SHOW POOLS_EXTENDED:
cl_waiting — сколько клиентов сейчас в очереди за серверным соединением
maxwait — самое долгое ожидание любого клиента, секунд
sv_idle — свободные серверные соединения в пуле
sv_active — серверные соединения, выданные клиентам
Если cl_waiting > 0 стабильно и sv_idle == 0, пул мал для нагрузки. Либо поднимайте pool_size для этого пользователя, либо разбирайтесь, почему sv_active не падает — длинные транзакции, idle-in-transaction сессии, медленный downstream-вызов, который держит серверное соединение.
Если у вас включён max_db_connections, смотрите ещё SHOW POOL_COORDINATOR на evictions (доноры под давлением отдают соединения) и exhaustions (лимит достигнут даже после вытеснений). См. Координатор пулов.
Куда подавать остальное
Если вашей проблемы здесь нет — откройте issue на GitHub: версия pg_doorman, релевантный конфиг (с замазанными паролями), драйвер клиента и его версия, и совпадающие по времени строки логов из pg_doorman и PostgreSQL.