Перейти к содержимому
Система
Архитектура

Компоненты, данные и границы системы

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

Интерактивная схема

Загружаем интерактивную схему…

Схему можно приближать и отдалять кнопками и жестом; на узком экране доступен список узлов с переходом к выбранному компоненту. Пунктирные связи показывают опциональные каналы. Схема описывает предлагаемую систему и не является сетевой топологией уже созданного контура.

Слои и ответственность

Клиенты

iOS, Android, веб-админка и портал документации.

React Native + ExpoNext.jsпортал документации

API и домен

Вход, права, валидация, лимиты, аудит. Доменные модули: пользователи, каталог, календарь, деньги, зарядка, сервисные модули.

Node.js / NestJSREST + OpenAPIRBACидемпотентность

Данные

PostgreSQL как источник истины для календаря и денег. Резервное копирование и восстановление проверяются отдельно.

PostgreSQLPrismaмиграцииаудит

Оборудование

Адаптер к выбранной CSMS. Поддержка команд и профиля OCPP подтверждается по модели станции, а не предполагается универсальной.

CSMSOCPPStart / StopMeterSample

Внешние сервисы

Платежи, касса, SMS, карты/геокодер и push. Каждый контур имеет договор, тестовый кабинет, лимиты и SLA.

СБП / картыонлайн-кассаSMSкартыpush

Поперечные требования

Наблюдаемость, correlation ID, безопасность, приватность, резервное восстановление и разбор инцидентов.

логиметрикитрассировкаPII-минимизация

Поток данных верхнего уровня

От пользователя до данных и внешних систем

Поток упрощён: он показывает ответственность, а не конкретные сетевые вызовы.

На узком экране прокручивается по горизонтали
Отрисовываем схему…
Деньги и календарь не должны опираться на кэш как на источник истины.

Технологический стек

Что уже используется в портале и что предлагается для будущего продукта. Точные версии библиотек зафиксированы в package.json и lock-файле; в интерфейсе они не дублируются.

Портал документации (этот сайт)

Фактический стек. Версии зафиксированы в package.json и lock-файле.

Next.js (App Router, Turbopack)React + TypeScriptTailwind CSS (дизайн-токены)Lucide React — иконки@xyflow/react — интерактивная схема архитектурыMermaid — диаграммы последовательностейСостояние витрины: React Context + useReducer + localStorageVitest + React Testing Library — unit и компонентные тестыPlaywright — сквозные проверкиESLint + tsc — линт и типы

Мобильное приложение водителя

Предложение. Выбор карты и платёжного SDK зависит от D06 и D07.

React Native + ExpoTypeScriptExpo Router — навигацияexpo-secure-store — токены, AsyncStorage — кэшexpo-notifications — push (FCM / APNs)Карта: react-native-maps или MapLibreПлатежи: защищённый сценарий провайдера (SDK или веб)Сборки: EAS Build, TestFlight, Google Play Console

Backend

Предложение по умолчанию. Меняется после согласования с командой заказчика.

Node.js + NestJSREST + OpenAPIPostgreSQL + Prisma (миграции)Redis — кэш, лимиты, очередиОчереди заданий (чеки, повторы webhook)Аутентификация: access/refresh токены, OTP по SMSИдемпотентность финансовых и командных операцийСтруктурные логи и трассировка

Интеграции

Состав и порядок зависят от решений D06, D07 и D08.

CSMS / OCPP — Start, Stop, показания, событияЭквайринг и СБП — REST и webhook провайдераОнлайн-касса и ОФД — фискализацияSMS-провайдер — вход по кодуКарты и геокодирование — провайдерPush: FCM и APNs

Админка и инфраструктура

Веб-админка: Next.js или React + Vite, роли и журнал действийUbuntu LTS, Nginx (reverse proxy), PM2TLS (Let’s Encrypt), бэкапы PostgreSQLМониторинг, логи, алертыCI/CD: GitHub Actions или контур заказчика

Архитектурные принципы

Один источник истины для денег и календаря
Кэш не подтверждает свободный слот и не зачисляет баланс.
Идемпотентность на границах
Платёжные события и команды оборудования имеют ключи и стабильные внешние ID.
Исторический снимок
Сессия сохраняет версию тарифа; изменение тарифа не переписывает историю.
Неизменяемый аудит
Ручные действия и корректировки фиксируются отдельными записями.
Адаптеры внешних систем
CSMS, платежи, касса и SMS не проникают в доменную логику.
Неопределённость — явное состояние
Тайм-аут команды не равен успеху; требуется проверка.