Архитектура

Обзор системы, модель данных, мультивалютная схема и модель аутентификации.

Обзор системы

Браузерный интерфейс --> Веб-приложение Next.js ----------------> Postgres (RLS)
Программные клиенты  --> API Gateway (REST) --> SQL Lambda ----------^
MCP-клиенты          --> API Gateway (HTTP) --> MCP Lambda ----------^
Сервис аутентификации (OTP + OAuth) ---------------------------------^
Воркер (загрузка валютных курсов) -----------------------------------^

Шесть компонентов, одна база данных:

  1. web — приложение на Next.js с пользовательскими дашбордами и API-маршрутами
  2. auth — вход по одноразовому коду из email и начальное подключение агентов на auth-домене
  3. sql-api — AWS Lambda за API Gateway для программных клиентов
  4. mcp — отдельные AWS Lambda и HTTP API в API Gateway для размещенной точки MCP
  5. worker — ежедневная загрузка курсов ECB, CBR и NBS
  6. Postgres — единый источник истины с политиками RLS

Модель данных

  • ledger_entries — одна строка на каждое движение по счёту: доход, расход или перевод
  • budget_lines — ячейки бюджета в модели только с добавлением записей; при конфликте действует правило «последняя запись побеждает»
  • budget_comments — заметки к ячейкам бюджета в модели только с добавлением записей
  • workspace_settings — отчётная валюта и настройки рабочего пространства
  • account_metadata — метаданные по счетам, например классификация ликвидности
  • exchange_rates — ежедневные валютные курсы для конвертации во время запроса
  • workspaces / workspace_members — изоляция арендаторов в многопользовательской схеме
  • accounts — представление, построенное на основе ledger_entries

Мультивалютность

Все суммы хранятся в исходной валюте. Пересчёт в отчётную валюту выполняется во время чтения через SQL-соединения с exchange_rates. Предварительной конвертации с потерей точности нет.

Аутентификация

Через переменную окружения AUTH_MODE доступны два режима:

  • none — без аутентификации, одно локальное рабочее пространство
  • cognito — беспарольный вход по одноразовому коду из email через AWS Cognito с открытой регистрацией

Для программных клиентов публичной точкой входа служит GET /v1/. Подключение агента использует одноразовый код из email на auth-домене, возвращает долгоживущий ApiKey, а затем выполняет SQL через отдельный API для программных клиентов за API Gateway.

MCP-клиенты подключаются отдельно к https://mcp.expense-budget-tracker.com/mcp. Этот путь обслуживают выделенные HTTP API в API Gateway и MCP Lambda, а интерактивная авторизация проходит через OAuth в браузере на auth-домене.

Каждый пользователь получает изолированное рабочее пространство. Политики RLS проверяют членство при каждом запросе, включая SQL-запросы от программных клиентов.