Кейс // Платформа подготовки к экзаменам

cp-binom
EdTech Platform

Java 21Spring Boot 3.5PostgreSQL 16FlywayRustFSReact 18ViteTailwind 4Playwright
Открыть платформу
01 // Резюме
Задача

Растущая школа
без своего софта

Образовательный центр с 200+ учениками работал через мессенджеры, таблицы и почту — процессы были разрознены между преподавателями, учениками и родителями. Учебные материалы жили в чатах, результаты тестов вели вручную, расписание постоянно менялось. Школе была нужна единая точка правды — но ни одна готовая система не покрывала специфику работы репетиторского центра.

Решение

Своя EdTech-платформа
с нуля под клиента

Платформа, собранная целиком с нуля. Бэкенд: Java 21 и Spring Boot 3.5, аутентификация на JWT, PostgreSQL 16 под управлением Flyway, S3-совместимый RustFS для файлов, jsoup чистит любой пользовательский HTML. Фронтенд: React 18 на Vite и Tailwind 4, редактор TipTap, FullCalendar и drag-and-drop для расписания. Всё работает на одной VPS за nginx — Docker Compose, TLS от certbot, рейт-лимиты, заголовки безопасности, Prometheus для мониторинга и ночные бэкапы базы.

02 // Ключевые результаты
37k

Строк кода

Java-бэкенд, React-фронтенд

27

Таблиц в базе

20 миграций Flyway

20

REST-контроллеров

Авторизация, курсы, тесты, чат

Апр 2026

В проде

Коммерческий заказ, каждый день

03 // Технические особенности

Аутентификация написана с нуля

JWT с ротацией refresh-токенов, подтверждение почты и ссылки для установки пароля, три роли — ученик, преподаватель, админ — проверяются во всех 20 REST-контроллерах. Без стороннего провайдера входа.

Своё объектное хранилище

S3-совместимый RustFS держит учебные материалы, картинки тестов, вложения из чатов, медиа новостей и PDF образовательных программ в четырёх отдельных бакетах. В октябре 2026 он сменил MinIO без единой правки в коде бэкенда. Файлы не покидают сервер заказчика, и за хранение никто не платит.

Два пути к индексируемому HTML

После каждой сборки Playwright обходит все публичные маршруты и складывает статические снимки, которые nginx отдаёт первыми — всем подряд, так что контент виден до запуска JavaScript. Поисковым ботам вдобавок отдаются страницы, отрисованные прямо из базы: разделение по User-Agent на уровне nginx.

04 // Демонстрация проекта
LIVE // CP-BINOM.RU
PRJ-001

Боевая версия в проде

Платформа работает на cp-binom.ru с апреля 2026 года, ей каждый день пользуются ученики и преподаватели центра. Сам портал за логином, публичная часть открыта всем.

Об этом проекте

Вопросы
об архитектуре?

Расскажу про решения, которые за этим стоят: почему своё хранилище, почему два пути рендеринга одного и того же контента и что бы я сделал иначе.