Перейти к содержанию

🏗 Системная архитектура

Модульная архитектура платформы Red Petroleum EV

FastAPI + React PWA + OCPP WebSocket + Supabase PostgreSQL + Redis

Общая архитектура

flowchart TB subgraph Clients["Клиенты"] PWA["📱 PWA (React)"] Guest["🌐 Guest Web"] Admin["💻 Admin Dashboard"] Corp["🏢 Corporate Panel"] end subgraph Backend["Backend (FastAPI)"] API["REST API\n/api/v1/"] WS["WebSocket\nServer"] OCPP16["OCPP 1.6J\nHandler"] OCPP20["OCPP 2.0.1\nHandler"] Sched["Schedulers\n(6 штук)"] end subgraph Data["Хранилище"] PG["PostgreSQL 16\n(Supabase)"] Redis["Redis 7\nCache + PubSub"] S3["Supabase Storage\nQR, аватары"] end subgraph External["Внешние сервисы"] Namba["Namba One\n(Платежи)"] SMS["Nikita SMS\n(OTP)"] GIS["2GIS API\n(Карты)"] end subgraph Stations["Зарядные станции"] ST["198 ЭЗС\n396 коннекторов"] end PWA -->|HTTPS| API Guest -->|HTTPS| API Admin -->|HTTPS| API Corp -->|HTTPS| API PWA -->|WSS| WS API --> PG API --> Redis API --> S3 API --> Namba API --> SMS WS --> Redis ST -->|"WSS :9210\nOCPP 1.6J"| OCPP16 ST -->|"WSS :9211\nOCPP 2.0.1"| OCPP20 OCPP16 --> PG OCPP16 --> Redis OCPP20 --> PG OCPP20 --> Redis Sched --> PG Sched --> Redis

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

Backend

Компонент Технология Версия Назначение
Язык Python 3.11+ Async (asyncio)
Framework FastAPI 0.104+ REST API + WebSocket
ORM SQLAlchemy 2.0+ Async mode
OCPP ocpp lib 1.0+ 1.6J + 2.0.1
Миграции Alembic latest Auto-migrations
Валидация Pydantic 2.0+ Схемы запросов
Задачи Celery 5.3+ Background jobs
Кэш Redis 7.0+ PubSub + Cache

Frontend

Компонент Технология Версия Назначение
Язык TypeScript 5.0+ Strict mode
Framework React 18.2+ Functional components
Build Vite 6.0+ HMR, fast builds
CSS TailwindCSS 3.4+ Utility-first
State Zustand 4.0+ Minimal state
API TanStack Query 5.0+ Server state + cache
Карты 2GIS API latest Кыргызстан

Инфраструктура

Компонент Технология Назначение
Database Supabase (PostgreSQL 16) Основная БД + Auth + RLS
Cache Redis 7 WebSocket PubSub, кэш сессий
Storage Supabase Storage QR-коды, аватары, PDF чеки
Server Nginx SSL termination + reverse proxy
OS Ubuntu 22.04 LTS Production server

5 ключевых потоков данных

1. Аутентификация (SMS OTP)

sequenceDiagram participant C as Клиент (PWA) participant A as API (FastAPI) participant S as SMS (Nikita) participant D as Database C->>A: POST /auth/otp/request {phone} A->>S: Отправить SMS код A->>D: Сохранить OTP (TTL 5 мин) S-->>C: SMS "Ваш код: 123456" C->>A: POST /auth/otp/verify {phone, code} A->>D: Проверить OTP A-->>C: JWT tokens (access + refresh)

2. Процесс зарядки

sequenceDiagram participant C as Клиент participant A as API participant R as Redis participant O as OCPP Server participant S as Станция C->>A: POST /charging/start {station_id, limit} A->>A: Резервирование средств A->>O: RemoteStartTransaction O->>S: RemoteStartTransaction.req S-->>O: RemoteStartTransaction.conf S->>O: StartTransaction O->>R: Publish session update R-->>C: WebSocket: session started loop Каждые 15 сек S->>O: MeterValues O->>R: Publish meter data R-->>C: WebSocket: progress update end C->>A: POST /charging/stop A->>O: RemoteStopTransaction O->>S: RemoteStopTransaction.req S-->>O: StopTransaction A-->>C: Чек + списание

3. Пополнение баланса (Namba One)

sequenceDiagram participant C as Клиент participant A as API participant N as Namba One participant D as Database C->>A: POST /balance/topup-namba {amount} A->>N: Создать payment link (HMAC-SHA512) N-->>A: Payment URL + QR A-->>C: QR-код для оплаты C->>N: Оплата через приложение Namba N->>A: Webhook (PAYMENT_ORDER) A->>D: balance += amount A-->>C: Push: баланс пополнен

4. OCPP Heartbeat / StatusNotification

sequenceDiagram participant S as Станция participant O as OCPP Server participant D as Database participant R as Redis loop Каждые 30 сек S->>O: Heartbeat O-->>S: Heartbeat.conf {currentTime} end S->>O: StatusNotification {Available} O->>D: UPDATE stations SET status O->>R: Publish status change

5. Гостевая зарядка

sequenceDiagram participant G as Гость (браузер) participant A as API participant N as Namba One participant O as OCPP participant S as Станция G->>G: Сканирует QR на станции G->>A: GET /guest/station/{id} A-->>G: Информация о станции G->>A: POST /guest/charge {phone, amount} A->>N: Создать payment link N-->>G: QR для оплаты G->>N: Оплата N->>A: Webhook: оплачено A->>O: RemoteStartTransaction O->>S: Start S-->>G: Зарядка в браузере (polling)

Модульная структура

ocpp-rp/backend/
├── app/
│   ├── main.py                    # FastAPI entry + OCPP WS
│   ├── api/v1/                    # REST API модули
│   │   ├── auth/                  # SMS OTP аутентификация
│   │   ├── charging/              # Start/Stop/Status зарядки
│   │   ├── balance/               # Баланс + Namba One
│   │   ├── guest/                 # Гостевая зарядка
│   │   ├── partner/               # Кабинет партнёра
│   │   ├── admin/                 # Админ-панель (22 эндпоинта)
│   │   ├── station/               # Управление станциями
│   │   ├── history/               # История зарядок
│   │   ├── favorites/             # Избранные станции
│   │   └── notifications/         # Push-уведомления (VAPID)
│   ├── services/                  # Бизнес-логика (11 сервисов)
│   ├── models/                    # SQLAlchemy модели
│   └── ocpp/                      # OCPP 1.6J + 2.0.1 хендлеры
├── migrations/                    # Alembic миграции
└── tests/                         # 81 тест