Базовое использование PgDoorman
Сквозной разбор: ключи командной строки, минимальный конфиг, admin-консоль и эксплуатационные команды (PAUSE, RESUME, RECONNECT, RELOAD). Эта страница — вторая по порядку чтения после Обзора и Установки.
Параметры командной строки
$ pg_doorman --help
PgDoorman: Nextgen PostgreSQL Pooler (based on PgCat)
Usage: pg_doorman [OPTIONS] [CONFIG_FILE] [COMMAND]
Commands:
generate Generate configuration for pg_doorman by connecting to PostgreSQL and auto-detecting databases and users
help Print this message or the help of the given subcommand(s)
Arguments:
[CONFIG_FILE] [env: CONFIG_FILE=] [default: pg_doorman.toml]
Options:
-l, --log-level <LOG_LEVEL> [env: LOG_LEVEL=] [default: INFO]
-F, --log-format <LOG_FORMAT> [env: LOG_FORMAT=] [default: text] [possible values: text, structured, debug]
-n, --no-color force colors off in the log output
-d, --daemon run as daemon [env: DAEMON=]
-h, --help Print help
-V, --version Print version
Доступные параметры
| Параметр | Описание |
|---|---|
-d, --daemon | Запуск в фоне. Без этого параметра процесс работает на переднем плане. В daemon-режиме обязательны daemon_pid_file и syslog_prog_name. После ухода в фон сообщения в stderr больше не пишутся. |
-l, --log-level | Уровень логирования: INFO, DEBUG или WARN. |
-F, --log-format | Формат логов. Возможные значения: text, structured, debug. |
-n, --no-color | Принудительно отключить цвета в логах. Цвета также автоматически выключаются, если stderr не терминал (под systemd — это pipe в journald) и если переменная окружения NO_COLOR установлена в любое непустое значение. |
-V, --version | Показать информацию о версии. |
-h, --help | Показать справку. |
Установка и настройка
Структура файла конфигурации
PgDoorman поддерживает форматы YAML и TOML. Для новых установок рекомендуется YAML. Конфигурация разбита на несколько секций:
general: # Глобальные настройки сервиса PgDoorman
pools:
<name>: # Настройки конкретного пула базы данных
users:
- ... # Настройки пользователя для этого пула
Некоторые параметры обязательно должны быть указаны в файле конфигурации, чтобы PgDoorman запустился, даже если у них есть значения по умолчанию. Например, для доступа к admin-консоли нужно указать admin username и password.
Минимальный пример конфигурации
Минимальный пример конфигурации для старта:
YAML (рекомендуется)
general:
host: "0.0.0.0" # Слушать на всех интерфейсах
port: 6432 # Порт для клиентских соединений
admin_username: "admin"
admin_password: "admin" # Поменяйте это в промышленной эксплуатации!
pools:
exampledb:
server_host: "127.0.0.1" # Адрес сервера PostgreSQL
server_port: 5432 # Порт сервера PostgreSQL
pool_mode: "transaction" # Режим пулинга
users:
- pool_size: 40
username: "doorman"
password: "SCRAM-SHA-256$4096:6nD+Ppi9rgaNyP7...MBiTld7xJipwG/X4="
TOML
[general]
host = "0.0.0.0"
port = 6432
admin_username = "admin"
admin_password = "admin"
[pools.exampledb]
server_host = "127.0.0.1"
server_port = 5432
pool_mode = "transaction"
[pools.exampledb.users.0]
pool_size = 40
username = "doorman"
password = "SCRAM-SHA-256$4096:6nD+Ppi9rgaNyP7...MBiTld7xJipwG/X4="
Полный список параметров конфигурации можно получить командой pg_doorman generate --reference --output ref.yaml — она генерирует аннотированный конфиг со всеми параметрами и значениями по умолчанию.
Автоматическая генерация конфигурации
Команда generate создаёт файл конфигурации, подключаясь к серверу PostgreSQL и определяя базы данных и пользователей. По умолчанию сгенерированный конфиг содержит inline-комментарии, объясняющие каждый параметр.
# Посмотреть все доступные опции
pg_doorman generate --help
# Сгенерировать YAML-конфиг (рекомендуется)
pg_doorman generate --output pg_doorman.yaml
# Сгенерировать TOML-конфиг (для обратной совместимости)
pg_doorman generate --output pg_doorman.toml
# Сгенерировать reference-конфиг со всеми настройками (без подключения к PG)
pg_doorman generate --reference --output pg_doorman.yaml
# Сгенерировать reference-конфиг с русскими комментариями для быстрого старта
pg_doorman generate --reference --ru --output pg_doorman.yaml
# Сгенерировать конфиг без комментариев (plain serialization)
pg_doorman generate --no-comments --output pg_doorman.yaml
Команда generate поддерживает несколько опций:
| Опция | Описание |
|---|---|
--host | Хост PostgreSQL для подключения (если не указано, используется localhost) |
--port, -p | Порт PostgreSQL для подключения (по умолчанию: 5432) |
--user, -u | Пользователь PostgreSQL для подключения (нужны привилегии superuser, чтобы читать pg_shadow) |
--password | Пароль PostgreSQL для подключения |
--database, -d | База данных PostgreSQL для подключения (если не указано, используется имя пользователя) |
--ssl | Подключение к серверу PostgreSQL по SSL/TLS |
--pool-size | Размер пула в сгенерированной конфигурации (по умолчанию: 40) |
--session-pool-mode, -s | Сессионный режим пулинга в сгенерированной конфигурации |
--output, -o | Файл для сгенерированной конфигурации (если не указан, используется stdout) |
--server-host | Переопределить server_host в конфиге (если не указано, используется значение --host) |
--no-comments | Отключить inline-комментарии в сгенерированной конфигурации (по умолчанию они включены) |
--reference | Сгенерировать полный reference-конфиг с примерами значений, без подключения к PG |
--russian-comments, --ru | Сгенерировать комментарии на русском для быстрого старта |
--format, -f | Формат вывода: yaml (по умолчанию) или toml. Если задан --output, формат определяется по расширению файла. Этот флаг переопределяет автоопределение |
Команда подключается к PostgreSQL, обнаруживает базы данных и пользователей, затем создаёт документированный файл конфигурации.
Команда generate также учитывает стандартные переменные окружения PostgreSQL: PGHOST, PGPORT, PGUSER, PGPASSWORD и PGDATABASE.
PgDoorman по умолчанию использует passthrough authentication: криптографическое доказательство клиента (MD5-хеш или SCRAM ClientKey) автоматически переиспользуется для аутентификации в backend-сервере PostgreSQL. Plaintext-пароли в конфиге не нужны — достаточно записать в password хеш из pg_shadow / pg_authid.
Указывайте server_username и server_password только тогда, когда backend-пользователь отличается от username пула (например, маппинг username или JWT-аутентификация):
users:
- username: "app_user" # имя для клиента
password: "md5..." # хеш для аутентификации клиента
server_username: "pg_app_user" # другой backend-пользователь PostgreSQL
server_password: "real_password" # plaintext-пароль для этого пользователя
Подробнее см. описания полей server_username и server_password в сгенерированном reference-конфиге.
Чтение информации о пользователях из PostgreSQL требует привилегий superuser, чтобы получить доступ к таблице pg_shadow.
Контроль доступа клиентов (pg_hba)
PgDoorman может применять правила доступа клиентов в стиле PostgreSQL pg_hba.conf через параметр general.pg_hba.
Правила можно встроить прямо в конфиг или сослаться на путь к файлу. Полные примеры — в reference-разделе.
Trust-режим: когда правило использует trust, PgDoorman принимает соединения без запроса пароля у клиента — зеркально поведению PostgreSQL. Учитываются TLS-зависимые типы правил: hostssl требует TLS, hostnossl его запрещает.
Запуск PgDoorman
После создания файла конфигурации запустите PgDoorman из командной строки:
$ pg_doorman pg_doorman.toml
Если файл конфигурации не указан, PgDoorman будет искать pg_doorman.toml в текущей директории.
Подключение к PostgreSQL через PgDoorman
После запуска PgDoorman подключайтесь к нему вместо прямого подключения к PostgreSQL:
$ psql -h localhost -p 6432 -U doorman exampledb
Строку подключения вашего приложения нужно изменить так, чтобы она указывала на PgDoorman, а не напрямую на PostgreSQL:
postgresql://doorman:password@localhost:6432/exampledb
Приложение разговаривает по PostgreSQL wire-протоколу; уровень пулинга для него прозрачен.
Администрирование
Admin-консоль
PgDoorman предоставляет административный интерфейс через специальную базу данных pgdoorman (или pgbouncer для обратной совместимости):
$ psql -h localhost -p 6432 -U admin pgdoorman
После подключения можно посмотреть доступные команды:
pgdoorman=> SHOW HELP;
NOTICE: Console usage
DETAIL:
SHOW HELP|CONFIG|DATABASES|POOLS|POOLS_EXTENDED|POOLS_MEMORY|POOL_COORDINATOR|POOL_SCALING
SHOW CLIENTS|SERVERS|USERS|CONNECTIONS|STATS|PREPARED_STATEMENTS|AUTH_QUERY
SHOW LISTS|SOCKETS|LOG_LEVEL|VERSION
SET log_level = '<filter>'
RELOAD
SHUTDOWN
UPGRADE
PAUSE [db]
RESUME [db]
RECONNECT [db]
Admin-консоль на данный момент поддерживает только simple query protocol.
Некоторые драйверы баз данных используют extended query protocol для всех команд, что делает их непригодными для работы с admin-консолью. В таких случаях используйте клиент psql для администрирования.
Войти в admin-консоль может только пользователь, указанный в admin_username файла конфигурации.
Если это разрешено правилами general.pg_hba, в admin-консоль можно входить методом trust (без запроса пароля), например:
# Разрешить только локальному admin доступ к admin-БД без пароля
host pgdoorman admin 127.0.0.1/32 trust
Используйте trust с предельной осторожностью. Всегда ограничивайте по адресу и, по возможности, требуйте TLS через hostssl. В промышленной эксплуатации предпочитайте методы с паролями, если только не понимаете последствия полностью.
Мониторинг PgDoorman
Admin-консоль предоставляет несколько команд для мониторинга текущего состояния PgDoorman:
SHOW STATS— посмотреть статистику производительности.SHOW CLIENTS— список текущих клиентских соединений.SHOW SERVERS— список текущих серверных соединений.SHOW POOLS— состояние пулов соединений.SHOW DATABASES— список настроенных баз данных.SHOW USERS— список настроенных пользователей.
Эти команды подробно описаны в разделе Команды admin-консоли ниже.
Перечитывание конфигурации
Если вы изменили pg_doorman.toml, изменения можно применить без перезапуска сервиса:
pgdoorman=# RELOAD;
При перечитывании конфигурации:
- PgDoorman читает обновлённый файл конфигурации.
- Обнаруживаются изменения параметров подключения к базам.
- Существующие серверные соединения закрываются при следующем возврате в пул (в соответствии с режимом пулинга).
- Новые серверные соединения сразу используют обновлённые параметры.
Это позволяет вносить изменения в конфигурацию с минимальным влиянием на приложения.
Команды admin-консоли
Admin-консоль предоставляет набор команд для мониторинга и управления PgDoorman. Команды используют SQL-подобный синтаксис и могут выполняться из любого PostgreSQL-клиента, подключённого к admin-консоли.
SHOW-команды
SHOW-команды отображают информацию о работе PgDoorman. Каждая команда даёт свой срез данных о производительности и текущем состоянии пулера.
SHOW STATS
SHOW STATS показывает развёрнутую статистику работы PgDoorman:
pgdoorman=> SHOW STATS;
Статистика приводится для каждой пары (database, user):
| Метрика | Описание |
|---|---|
database | Имя базы данных |
user | Имя пользователя |
total_xact_count | Всего SQL-транзакций с момента запуска |
total_query_count | Всего SQL-команд с момента запуска |
total_received | Всего байт получено от клиентов |
total_sent | Всего байт отправлено клиентам |
total_xact_time | Всего микросекунд в транзакциях (включая idle in transaction) |
total_query_time | Всего микросекунд на выполнение запросов |
total_wait_time | Всего микросекунд клиенты ждали серверного соединения |
total_errors | Всего ошибок с момента запуска |
avg_xact_count | Среднее число транзакций в секунду за последние 15 секунд |
avg_query_count | Среднее число запросов в секунду за последние 15 секунд |
avg_recv | Среднее число байт в секунду, получаемых от клиентов |
avg_sent | Среднее число байт в секунду, отправляемых клиентам |
avg_errors | Среднее число ошибок в секунду за последние 15 секунд |
avg_xact_time | Средняя длительность транзакции в микросекундах |
avg_query_time | Средняя длительность запроса в микросекундах |
avg_wait_time | Среднее время ожидания сервера в микросекундах |
Особое внимание обращайте на метрику avg_wait_time. Если её значение стабильно высокое, это может означать, что размер пула слишком мал для вашей нагрузки.
SHOW SERVERS
SHOW SERVERS показывает детальную информацию обо всех серверных соединениях:
pgdoorman=> SHOW SERVERS;
| Колонка | Описание |
|---|---|
server_id | Уникальный идентификатор серверного соединения |
server_process_id | PID backend-процесса PostgreSQL (если доступен) |
database_name | Имя базы данных, к которой подключено соединение |
user | Username, под которым PgDoorman подключается к серверу PostgreSQL |
application_name | Значение параметра application_name, выставленное на серверном соединении |
state | Текущее состояние соединения: active, idle или used |
wait | Состояние ожидания соединения: idle, read или write |
transaction_count | Сколько транзакций обработало это соединение |
query_count | Сколько запросов обработало это соединение |
bytes_sent | Всего байт отправлено серверу PostgreSQL |
bytes_received | Всего байт получено от сервера PostgreSQL |
age_seconds | Время жизни текущего серверного соединения в секундах |
prepare_cache_hit | Число попаданий в кэш prepared statements |
prepare_cache_miss | Число промахов кэша prepared statements |
prepare_cache_size | Число уникальных prepared statements в кэше |
- active: соединение прямо сейчас выполняет запрос.
- idle: соединение свободно для использования.
- used: соединение выделено клиенту, но прямо сейчас не выполняет запрос.
SHOW CLIENTS
SHOW CLIENTS показывает информацию обо всех клиентских соединениях к PgDoorman:
pgdoorman=> SHOW CLIENTS;
| Колонка | Описание |
|---|---|
client_id | Уникальный идентификатор клиентского соединения |
database | Имя базы данных (пула), к которой подключён клиент |
user | Username, с которым клиент подключился |
application_name | Имя приложения, заявленное клиентом |
addr | IP-адрес и порт клиента (IP:port) |
tls | Использует ли соединение TLS-шифрование (true или false) |
state | Текущее состояние клиентского соединения: active, idle или waiting |
wait | Состояние ожидания клиентского соединения: idle, read или write |
transaction_count | Сколько транзакций обработано для этого клиента |
query_count | Сколько запросов обработано для этого клиента |
error_count | Сколько ошибок было у этого клиента |
age_seconds | Время жизни клиентского соединения в секундах |
Колонка age_seconds помогает находить долгоживущие соединения, которые могут зря держать ресурсы. Подумайте о настройке таймаутов на idle-соединения в приложении.
SHOW POOLS
SHOW POOLS показывает информацию о пулах соединений. Для каждой пары (database, user) создаётся отдельная запись пула:
pgdoorman=> SHOW POOLS;
| Колонка | Описание |
|---|---|
database | Имя базы данных |
user | Username, ассоциированный с пулом |
pool_mode | Используемый режим пулинга: session или transaction |
cl_idle | Число idle-клиентов (вне транзакции) |
cl_active | Число активных клиентских соединений (привязаны к серверу или idle) |
cl_waiting | Число клиентских соединений, ожидающих серверного соединения |
cl_cancel_req | Число cancel-запросов от клиентов |
sv_active | Число серверных соединений, привязанных к клиентам |
sv_idle | Число idle-серверных соединений, доступных для немедленного использования |
sv_used | Число серверных соединений, недавно использованных, но ещё не ставших idle |
sv_login | Число серверных соединений, которые сейчас в процессе логина |
pool_size | Настроенный максимальный размер пула для этой пары (database, user) |
maxwait | Максимальное время ожидания в секундах для самого старого клиента в очереди |
maxwait_us | Микросекундная часть максимального времени ожидания |
avg_xact_time | Средняя длительность транзакции в микросекундах |
paused | На паузе ли пул: 1 (paused) или 0 (active) |
Если значение maxwait начинает расти, серверный пул может не справляться с обработкой запросов. Это может быть вызвано перегруженным сервером PostgreSQL или недостаточным pool_size.
SHOW USERS
SHOW USERS показывает информацию обо всех настроенных пользователях:
pgdoorman=> SHOW USERS;
| Колонка | Описание |
|---|---|
name | Username, как настроен в PgDoorman |
pool_mode | Режим пулинга, назначенный пользователю: session или transaction |
SHOW DATABASES
SHOW DATABASES показывает информацию обо всех настроенных пулах баз данных:
pgdoorman=> SHOW DATABASES;
| Колонка | Описание |
|---|---|
name | Имя настроенного пула |
host | Hostname сервера PostgreSQL |
port | Номер порта сервера PostgreSQL |
database | Реальное имя базы на бэкенде (может отличаться от имени пула, если задан server_database) |
force_user | Пользователь, форсированный для этого пула (если настроено) |
pool_size | Максимальное число серверных соединений для этого пула |
min_pool_size | Минимальное число серверных соединений, которое поддерживается |
reserve_pool | Максимальное число дополнительных reserve-соединений |
pool_mode | Режим пулинга по умолчанию для этого пула |
max_connections | Максимально разрешённое число серверных соединений (из max_db_connections) |
current_connections | Текущее число серверных соединений для этого пула |
Следите за соотношением current_connections и pool_size, чтобы убедиться, что пул адекватно размерен. Если current_connections часто доходит до pool_size, увеличьте размер пула.
SHOW SOCKETS
SHOW SOCKETS показывает количество сокетов в разных состояниях для TCP/TCP6/Unix (только Linux):
pgdoorman=> SHOW SOCKETS;
Показывает агрегированные счётчики состояний сокетов (ESTABLISHED, SYN_SENT и т.д.), полученные из /proc/net/tcp, /proc/net/tcp6 и /proc/net/unix.
SHOW VERSION
SHOW VERSION показывает информацию о версии PgDoorman:
pgdoorman=> SHOW VERSION;
Полезно, чтобы проверить, какая версия запущена, особенно после обновлений.
Управляющие команды
PgDoorman предоставляет управляющие команды, позволяющие управлять работой сервиса прямо из admin-консоли.
SHUTDOWN
Команда SHUTDOWN корректно завершает процесс PgDoorman:
pgdoorman=> SHUTDOWN;
При выполнении:
- PgDoorman перестаёт принимать новые клиентские соединения.
- Существующим транзакциям даётся время завершиться (в пределах настроенного таймаута).
- Все соединения закрываются.
- Процесс завершается.
Команда SHUTDOWN останавливает сервис PgDoorman, отключая всех клиентов. В промышленной эксплуатации используйте её с осторожностью.
SET log_level
Изменить уровень логирования на лету, не перезапуская пулер:
-- Глобальный уровень
pgdoorman=> SET log_level = 'debug';
-- На модуль (синтаксис RUST_LOG)
pgdoorman=> SET log_level = 'warn,pg_doorman::pool::pool_coordinator=debug';
-- Посмотреть текущий уровень
pgdoorman=> SHOW LOG_LEVEL;
-- Сбросить на стартовое значение
pgdoorman=> SET log_level = 'default';
Изменения временные — теряются при перезапуске. Допустимые уровни: error, warn, info, debug, trace, off.
RELOAD
Команда RELOAD обновляет конфигурацию PgDoorman без перезапуска сервиса:
pgdoorman=> RELOAD;
Эта команда:
- Перечитывает файл конфигурации.
- Обновляет все изменяемые настройки.
- Применяет изменения параметров соединений для новых соединений.
- Сохраняет существующие соединения, пока они не вернутся в пул.
RELOAD применяет большинство параметров конфигурации без разрыва существующих соединений — то, что нужно в промышленной эксплуатации, где простой недопустим.
PAUSE
Команда PAUSE [db] блокирует получение новых backend-соединений для указанной базы (или всех баз, если аргумент не задан). Активные транзакции продолжают работать — блокируются только запросы на новые соединения.
-- Поставить на паузу все пулы
pgdoorman=> PAUSE;
-- Поставить на паузу только пулы конкретной базы
pgdoorman=> PAUSE mydb;
Клиенты, которые запросят новое backend-соединение во время паузы, будут ждать RESUME или истечения query_wait_timeout — что наступит раньше. Если истечёт таймаут, клиент получит ошибку timeout.
Используйте SHOW POOLS для проверки состояния паузы — колонка paused покажет 1 для приостановленных пулов.
PAUSE полезен во время операций обслуживания, когда нужно не пускать новые запросы на бэкенд:
- Failover базы: PAUSE → переключить бэкенд → RECONNECT → RESUME.
- Полная ротация соединений: PAUSE → RECONNECT → RESUME гарантирует, что все соединения будут пересозданы.
- Обслуживание бэкенда: PAUSE на время изменений схемы, затем RESUME.
RESUME
Команда RESUME [db] снимает PAUSE и немедленно разблокирует всех ожидающих клиентов:
-- Снять паузу со всех пулов
pgdoorman=> RESUME;
-- Снять паузу только с пулов конкретной базы
pgdoorman=> RESUME mydb;
Клиенты, которые ждали из-за PAUSE, немедленно продолжат получать backend-соединения.
RECONNECT
Команда RECONNECT [db] форсирует пересоздание всех backend-соединений:
-- Reconnect для всех пулов
pgdoorman=> RECONNECT;
-- Reconnect только для пулов конкретной базы
pgdoorman=> RECONNECT mydb;
При выполнении:
- Внутренний epoch-счётчик пула увеличивается.
- Все idle-соединения сразу закрываются.
- Активные соединения (которые сейчас обслуживают транзакцию) продолжают работать, но утилизируются при возврате в пул — они не будут переиспользованы.
То есть RECONNECT не прерывает активные транзакции. Новые соединения создаются по запросу с текущим epoch, поэтому они будут приняты recycle().
Постепенная ротация (минимум воздействия): Один RECONNECT — idle-соединения сбрасываются сразу, активные — по завершении текущей транзакции. Новые соединения создаются по мере необходимости.
Полная ротация (гарантированно все новые соединения): PAUSE → RECONNECT → RESUME — сначала пауза не даёт стартовать новым транзакциям, потом RECONNECT помечает всё на утилизацию. После RESUME все последующие запросы получают свежие соединения.
После RECONNECT пулы с настроенным min_pool_size будут автоматически дозаполнены до минимума на следующем retain-цикле. У новых соединений будет текущий epoch.
Граничные случаи и поведение
В таблице ниже описано поведение PAUSE, RESUME и RECONNECT в граничных случаях:
| Сценарий | Поведение |
|---|---|
| PAUSE для уже приостановленного пула | No-op (идемпотентно). Ошибка не возвращается. |
| RESUME для не приостановленного пула | No-op (идемпотентно). Ошибка не возвращается. |
| RECONNECT для приостановленного пула | Работает: idle-соединения дренируются, epoch инкрементируется. После RESUME новые соединения создаются с новым epoch. |
| PAUSE/RESUME/RECONNECT для несуществующей базы | Возвращает ошибку: No pool for database "xxx". Без аргумента-базы команда применяется ко всем пулам (ошибки нет, даже если пулов нет). |
query_wait_timeout во время PAUSE | Клиенты, ожидающие соединение, ожидаемо получают ошибку timeout. Пул остаётся на паузе. |
| RELOAD во время PAUSE | RELOAD пересоздаёт пулы из конфигурации, поэтому состояние паузы теряется. Это ожидаемое поведение — новая конфигурация означает новые пулы. |
| GC приостановленных динамических пулов | Приостановленные динамические пулы защищены от garbage collection даже при 0 соединений. |
| Replenish во время PAUSE | Пулы с min_pool_size не дозаполняются, пока на паузе — новые соединения не создаются. Дозаполнение возобновляется после RESUME. |
| Время жизни соединений во время PAUSE | Retain-задача продолжает закрывать просроченные соединения (idle timeout, server lifetime). Соединения по-прежнему стареют. |
| Несколько вызовов RECONNECT | Каждый вызов увеличивает epoch ещё. Только соединения, созданные после последнего RECONNECT, считаются валидными. |
Обработка сигналов
PgDoorman реагирует на стандартные Unix-сигналы для управления и контроля. Сигналы посылаются через kill (например, kill -HUP <pid>).
| Сигнал | Эффект |
|---|---|
| SIGHUP | Перечитывание конфигурации — эквивалент admin-команды RELOAD. |
| SIGUSR2 | Горячая замена процесса. Валидирует новый бинарь и конфиг флагом -t, запускает новый процесс, передаёт ему слушающий сокет и переносит сессии, где это возможно. Рекомендуется для обновлений. См. Горячая замена процесса с переносом сессий. |
| SIGINT | Foreground + TTY (Ctrl+C): только плавное завершение (без замены процесса). Режим демона / без TTY: горячая замена процесса для совместимости со старыми установками. |
| SIGTERM | Немедленное завершение. Активные соединения обрываются. |