Portfolio

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- и платёжных интеграций
  • Сохранение языковых циклов, синтеза речи и персонализации во время смены платформы

Проект показывает не только продуктовую разработку, но и постепенную модернизацию архитектуры, где незавершённые части явно отделены от уже работающих возможностей.