Базовое использование PgDoorman
PgDoorman -- пулер соединений PostgreSQL, основанный на PgCat. В этом руководстве описаны конфигурация, эксплуатация и администрирование.
Параметры командной строки
PgDoorman поддерживает несколько параметров командной строки для настройки поведения при запуске:
$ 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 disable colors in the log output [env: NO_COLOR=]
-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 | Отключить цвета в выводе логов. |
-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" # Поменяйте это в production!
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
PgDoorman прозрачно обработает пулинг соединений, поэтому приложению не нужно знать, что оно подключается через пулер.
Администрирование
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. В production предпочитайте методы с паролями, если только не понимаете последствия полностью.
Мониторинг 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, отключая всех клиентов. В production используйте её с осторожностью.
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 применяет большинство параметров конфигурации без разрыва существующих соединений — то, что нужно в production, где простой недопустим.
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 | Binary upgrade и graceful shutdown. Валидирует новый бинарник флагом -t, запускает новый процесс, затем завершается. Рекомендуется для обновлений. См. Binary upgrade. |
| SIGINT | Foreground + TTY (Ctrl+C): только graceful shutdown (без binary upgrade). Daemon / без TTY: binary upgrade и graceful shutdown (legacy-поведение). |
| SIGTERM | Немедленное завершение. Активные соединения обрываются. |