Архитектура
Обзор системы, модель данных, мультивалютная схема и модель аутентификации.
Обзор системы
Браузерный интерфейс --> Веб-приложение Next.js --> Postgres (RLS)
| ^
v |
Сервис аутентификации -------------------+
^
|
Программные клиенты через API Gateway
^
|
Воркер (загрузка валютных курсов) -----------
Пять компонентов, одна база данных:
- web — приложение на Next.js с пользовательскими дашбордами и API-маршрутами
- auth — вход по одноразовому коду из email и начальное подключение агентов на auth-домене
- sql-api — AWS Lambda за API Gateway для программных клиентов
- worker — ежедневная загрузка курсов ECB, CBR и NBS
- 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.
Каждый пользователь получает изолированное рабочее пространство. Политики RLS проверяют членство при каждом запросе, включая SQL-запросы от программных клиентов.