🏗 Системная архитектура¶
Модульная архитектура платформы 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 тест