Language Loops
Обзор
Language Loops — приложение для языковой практики короткими повторяющимися циклами. Вместо длинного урока пользователь работает с одной фразой за раз, возвращается к ней в разных контекстах и постепенно закрепляет лексику и произношение.
Проект развивается как веб-платформа с отдельными сервисами для пользовательского интерфейса, API и AI-функций. Текущая архитектурная работа сосредоточена на переходе от прежнего Firebase-стека к PostgreSQL, Keycloak и контейнеризированным сервисам.
Возможности продукта
В продукте предусмотрены:
- Режим Explore для практики готовых языковых циклов
- Режим Hunt для персональных подборок
- Работа с одной фразой за раз
- AI-генерация и анализ учебного контента через Gemini
- Произношение фраз с помощью синтеза речи
- Отслеживание прогресса, серий занятий и достижений
- Поддержка английского, испанского, итальянского, французского, немецкого, португальского, армянского и русского языков
- Блог о языковой практике через Mailoo
Часть персональных функций зависит от регистрации. В текущей версии веб-интерфейса подключение Keycloak и получение учебных данных из нового API ещё находятся в работе, поэтому гостевой сценарий и статические адаптеры используются отдельно от целевой архитектуры.
Архитектура
Целевая архитектура Language Loops включает:
- Веб-приложение на Next.js
- HTTP API на Hono
- Отдельный AI-сервис для работы с Gemini
- PostgreSQL как основную базу данных
- Keycloak для аутентификации
- Общие пакеты с типами, константами и конфигурацией
- Mailoo как headless CMS для блога
- Платёжный сервис для нескольких провайдеров
Предыдущая реализация использовала Firebase Authentication, Firestore, Google Cloud Functions и Pub/Sub. В репозитории этот контур отмечен как устаревший. Новый API пока предоставляет базовый каркас и health endpoint, поэтому миграция данных и продуктовых сценариев выполняется поэтапно, а не выдаётся за завершённую.
Инфраструктура и SRE
В проекте настроены:
- GitLab CI для проверок, тестов, аудита зависимостей и сборки
- Сборка контейнеров через Kaniko
- Отдельные Docker-образы для веб-приложения, API и AI-сервиса
- SonarQube-проверки качества кода
- Renovate для обновления зависимостей
- Локальное окружение с PostgreSQL и Keycloak через Testcontainers
- GitOps-конфигурация целевого production-окружения
- Серверное хранение ключей Mailoo, Gemini и платёжных провайдеров
Redis намеренно не добавлен в новый стек до появления задачи, которой действительно нужна очередь. Это сохраняет архитектуру проще на этапе миграции и не создаёт инфраструктурную зависимость заранее.
Инженерные задачи
Главная инженерная задача Language Loops — заменить работающие, но тесно связанные с Firebase и GCP компоненты на переносимую сервисную архитектуру без одновременной остановки развития продукта.
В эту работу входят:
- Переход с Firebase Authentication на Keycloak
- Перенос данных из Firestore в PostgreSQL
- Замена набора Cloud Functions контейнеризированными API- и AI-сервисами
- Разделение актуальной и устаревшей документации
- Подключение нового API к пользовательским сценариям вместо временных адаптеров
- Безопасное хранение ключей AI- и платёжных интеграций
- Сохранение языковых циклов, синтеза речи и персонализации во время смены платформы
Проект показывает не только продуктовую разработку, но и постепенную модернизацию архитектуры, где незавершённые части явно отделены от уже работающих возможностей.