Persistent-соединения (CONN_MAX_AGE=60) осиротевали в короткоживущих
потоках asgiref ThreadSensitiveContext: Django закрывает старые соединения
только из потока-владельца, поток умирает после запроса, соединение
остаётся idle навсегда. На prod это дало 85 idle custocrm_app за 4,5 ч и
исчерпание max_connections=100 (500 на /api/v1/auth/login/, 2026-07-17).
Фикс: CONN_MAX_AGE=0 + нативный psycopg pool на процесс (Django 5
OPTIONS["pool"]): на выходе из запроса соединение возвращается в пул
(putconn) независимо от судьбы потока, суммарное число ограничено
max_size. Defaults: min 1 / max 4 / timeout 10s; env-переопределение
CUS_DB_POOL_MIN/MAX/TIMEOUT, CUS_DB_POOL_MAX=0 отключает пул. Worst case
по всем сервисам (app 3w + platform 3w + admin 2w + worker, оба alias)
~72 < 100. В testing пул выключен (pytest-django + TEST MIRROR).
Интеграционная проверка: 60 запросов в короткоживущих потоках ->
ровно 4 серверных соединения. RLS не затронут: tenant-контекст ставится
через set_config(..., local=true) внутри транзакции.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>