Запись #1: Философия
Почему я вообще в это ввязался?
Всем привет, я Михаил. Последние полгода я живу проектом Clear Speech ("Чистая Речь"). Казалось бы, зачем еще одна обучалка? Но проблема глубже. Традиционная логопедия застряла где-то в 90-х: детские центры, неловкость для взрослых и полное отсутствие цифр.
[cite_start]"Мы строим Гибридную платформу, где рутина отдана алгоритмам, а эмпатия и экспертиза — людям." [cite: 42]
[cite_start]Я делаю ставку на взрослую аудиторию (20–45 лет) — менеджеров, спикеров, тех, кому важна карьера[cite: 32]. Им нужен не "добрый доктор Айболит", а инструмент: конфиденциальный, быстрый и технологичный. [cite_start]Мы назвали это Adult-Oriented UX[cite: 31]. Никаких цветочков, только метрики прогресса.
Запись #2: Архитектура
Монолит, Сателлиты и Jitsi
Долго спорили с коллегами по поводу архитектуры. Микросервисы сейчас в моде, но для нашего этапа это оверхед. [cite_start]Решили остановиться на гибридной схеме: модульный монолит на Python (FastAPI) в центре, а видео и AI вынесли в отдельные сервисы-сателлиты[cite: 9, 10].
Python 3.11
FastAPI
PostgreSQL 16
Redis 7
Docker
Jitsi Meet
Самое интересное решение — видеосвязь. [cite_start]Мы отказались от Zoom SDK в пользу Self-hosted Jitsi Meet[cite: 12]. [cite_start]Причина проста: Privacy First[cite: 29]. Мы не хотим, чтобы видеопотоки уходили третьим лицам. [cite_start]Бэкенд генерирует JWT-токены с правами модератора для учителей, и всё это крутится внутри нашего Docker-контура[cite: 13, 23].
Кстати, всё это сейчас работает на сервере, с которого вы это читаете. [cite_start]Nginx раздает статику React'а и проксирует запросы на Uvicorn[cite: 23].
Запись #3: Деньги и Логика
Кошмар с расписанием и "правило 24 часов"
Написать видеочат — это полдела. Настоящая боль началась, когда мы взялись за биллинг. [cite_start]У нас модель маркетплейса: клиент платит платформе, мы холдируем средства и выплачиваем логопедам дважды в месяц (1-го и 15-го числа)[cite: 7, 16].
Самый сложный кусок логики — бронирование слотов. Когда ученик выбирает время, создается урок со статусом reserved. Если он не оплатит его, бронь висит мертвым грузом.
Пришлось писать отдельный Cron-воркер, который чистит базу:
# Упрощенная логика из ARCHITECTURE.txt
if lesson.status == 'reserved' and time_to_lesson < 24h:
cancel_reservation(lesson.id)
[cite_start]notify_users() # [cite: 6, 17]
Также реализовали "кошельки" внутри системы. У каждого логопеда есть pending_balance (холд) и основной баланс. [cite_start]Комиссию платформы (30%) вычитаем сразу при проводке урока[cite: 3, 15].
Запись #4: Планы
AI и Взгляд в будущее
Сейчас мы на этапе MVP. [cite_start]Видео работает, платежи ходят через ЮKassa [cite: 1][cite_start], админка на React [cite: 21] позволяет управлять пользователями.
[cite_start]Но моя главная цель — AI Worker[cite: 13]. Я хочу сделать тренажеры для домашки, где нейросеть (Whisper + LLM) будет слушать ученика и давать мгновенный фидбек. [cite_start]А в идеале — AR-зеркало, которое накладывает маску на лицо и показывает, как правильно ставить язык[cite: 41].
Работы непочатый край. [cite_start]Если сервер иногда подтормаживает — это Celery переваривает очередную партию аудио[cite: 14].