заметка · 28.10.2026

Семейный AI-чат: как устроен и почему без TOTP

Open WebUI, DeepSeek и локальный Qwen, HTTPS, пять учёток, вход по паролю и кнопка выхода.

Задача была простой: чтобы семья могла открыть чат с телефона, без VPN, но посторонний не мог зарегистрироваться. В итоге остался один сервис — Open WebUI, а LibreChat и Big-AGI уехали в архив.

Что работает

Чат живёт на отдельном поддомене и закрыт авторизацией. Регистрация выключена, пять учёток созданы вручную. Модели: DeepSeek Flash по умолчанию, DeepSeek Pro для сложных задач и несколько локальных Qwen на RTX 5090. Веб-поиск идёт через собственный SearXNG.

Сертификат — Let’s Encrypt, но не ECDSA, а RSA с цепочкой до ISRG Root X1. ECDSA-цепочка с новым Root YE не понравилась macOS и Яндекс Браузеру: сайт выглядел «не защищённым», хотя curl проверял его нормально. После перевыпуска на RSA браузеры успокоились.

Микрофон и выход

Микрофон в Open WebUI не работал по одной причине: чат открывали по HTTP-адресу с IP. Браузеры дают доступ к микрофону только на HTTPS или localhost. После переезда на домен с валидным сертификатом разрешение спрашивается нормально, а запись возвращает аудиопоток.

С выходом было хуже: стандартная кнопка Open WebUI спрятана в меню профиля, и её легко не найти. Добавил плавающую кнопку «Выйти» и страницу /logout, которая очищает локальную сессию и возвращает на форму входа. Это не «настоящий» server-side logout без Redis, но в браузере сессия завершается корректно.

Почему без TOTP

MFA включался, но по просьбе владельца чата его убрали: вход только логин и пароль. Компенсация — закрытая регистрация, длинные уникальные пароли и ограничение сессии 24 часами. Если понадобится вернуть TOTP, это одна настройка в Open WebUI.