From c906c97cb807fec3700c4c854567f9dbbd94a0b8 Mon Sep 17 00:00:00 2001 From: Max Ronzhin Date: Sun, 9 Aug 2026 01:07:41 +0300 Subject: [PATCH] =?UTF-8?q?release:=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8F?= =?UTF-8?q?=200.0.31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 8 +++++++- CHANGELOG.md | 37 +++++++++++++++++++++++++++++++++++++ VERSION | 2 +- deploy/docker-compose.yml | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 959146e..499af3f 100644 --- a/.env.example +++ b/.env.example @@ -104,6 +104,12 @@ UVICORN_WORKERS=2 DB_POOL_SIZE=10 DB_MAX_OVERFLOW=10 DB_POOL_TIMEOUT=10 +# Пул соединений с Redis НА КАЖДЫЙ воркер. Считается по УЧАСТНИКАМ, а не по +# запросам: WS-подключение комнаты держит собственную pub/sub-подписку всё +# время, пока человек в конференции. Дефолт redis-py (100) упирался в потолок +# примерно на сотом одновременном участнике на воркер. Сверху ограничивает +# maxclients самого Redis (по умолчанию 10000) — на все процессы разом. +REDIS_MAX_CONNECTIONS=500 # --- Email (рассылка саммари + .ics-приглашения) --- # `console` — дефолт для dev (письмо только логируется, ссылка подтверждения @@ -122,7 +128,7 @@ SMTP_TIMEOUT_S=30 # --- Версия инстанса (релиз v0.0.1) --- # install.sh копирует значение из корневого файла VERSION при каждой # установке/обновлении — руками менять не нужно. -VIDCONF_VERSION=0.0.30 +VIDCONF_VERSION=0.0.31 # --- Профили compose. Дефолт ниже (`media,monitoring`) — только для ручного # `docker compose up` БЕЗ install.sh: медиа (LiveKit+coturn) + мониторинг, diff --git a/CHANGELOG.md b/CHANGELOG.md index f79748d..14110ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,43 @@ Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/), проект придерживается [семантического версионирования](https://semver.org/lang/ru/). +## [0.0.31] — 2026-08-09 + +Разбор провала входа на нагрузочном тесте 07.08.2026: комната держала +соединения с БД и Redis на каждого участника. + +### Исправлено +- **Вход в систему переставал работать, когда в конференции набиралось + около сорока человек.** WS-подключение комнаты (чат и очередь рук) + держало занятым одно соединение с БД всё время, пока участник сидел + в конференции: SELECT'ы хендшейка открывали транзакцию, а закрыть её + было некому. Пул — 20 соединений на воркер (40 на инстанс), поэтому + сороковой вошедший выгребал его досуха, и все остальные запросы — + резолв конференции, гостевой вход, логин, обновление токена — начинали + отвечать 500. Теперь соединение возвращается в пул сразу после + хендшейка; на локальном стенде 120 участников на одном воркере не + занимают ни одного соединения в простое (было: 20 из 20 при 20 + участниках, дальше вход не работал вовсе). +- **Пользователя выкидывало из системы, когда серверу было плохо.** + Фоновое обновление access-токена считало неудачей любой отрицательный + ответ и на каждую такую неудачу сбрасывало сессию с переходом на + страницу входа. Ответ 5xx (и обрыв сети) теперь означает «сервер + временно недоступен»: сессия сохраняется, пользователь остаётся + в системе и получает обычную ошибку запроса. Разлогинивание осталось + только там, где backend прямо сказал, что сессия недействительна. + Восстановление сессии при старте приложения повторяет попытку трижды, + прежде чем показать страницу входа. + +### Технические детали +- Размер пула соединений с Redis задан явно (`REDIS_MAX_CONNECTIONS`, + по умолчанию 500): на нём висят долгоживущие pub/sub-подписки комнаты — + по одной на участника, — а дефолт redis-py 8 (100) упирался в потолок + примерно на сотом участнике на воркер. Второй потолок того же рода, + что и пул БД; найден при проверке правки выше на 120 участниках. +- Размеры пулов БД (`DB_POOL_SIZE`/`DB_MAX_OVERFLOW`) не менялись + осознанно: соединение больше не удерживается впустую, поэтому + расширение пула лечило бы симптом и лишь отодвинуло порог. + ## [0.0.30] — 2026-08-04 Согласие на обработку персональных данных при регистрации + отключаемый модуль. diff --git a/VERSION b/VERSION index f092e2b..700703b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.30 +0.0.31 \ No newline at end of file diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index d95ea63..8c58bf9 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -89,7 +89,7 @@ services: MEDIA_ROOT: ${MEDIA_ROOT:-/app/media} # Версия инстанса (релиз v0.0.1) — install.sh копирует значение # из файла VERSION (корень репозитория) в .env; отдаётся в GET /api/health. - VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.30} + VIDCONF_VERSION: ${VIDCONF_VERSION:-0.0.31} # Число процессов uvicorn (см. backend/Dockerfile). Дефолт 2 рассчитан # на 4-ядерный сервер, где ядра делятся с LiveKit. Поднимая значение, # проверьте бюджет соединений с БД: каждый воркер держит свой пул