Анализ архитектуры: 2026-02-21 | Статус: ✅ Production
Stage+ - это микросервисная система для торговли аукционными автомобилями из Азии (Япония, Корея, Китай). Система включает мобильное приложение для клиентов, веб-панель для менеджеров, и интегрируется с внешними системами (Bitrix24 CRM, аукционы AJES).
- 7 микросервисов на FastAPI
- 2 клиентских приложения (Flutter mobile, React web)
- 6 внешних интеграций (Bitrix24, AJES, Firebase, MinIO, Redis, PostgreSQL)
- API Gateway (Nginx) как единая точка входа
- Микросервисная архитектура с разделением по доменам
graph TB
subgraph "Клиентские приложения"
MA[📱 Flutter Mobile App<br/>iOS/Android]
WP[🖥️ Web Panel<br/>React Admin]
end
subgraph "API Gateway"
NGINX[🚪 Nginx API Gateway<br/>mapp.stage-plus.ru:443]
end
subgraph "Микросервисы Stage+"
CORE[🚗 Core API :8000<br/>Cars, Orders, Files]
IAM[👤 IAM Service :8010<br/>Auth, Users]
CHAT[💬 Chat Service :8020<br/>Messages, WebSocket]
CALC[📊 Calculator :8096<br/>Price Calculation]
SPECS[📋 Car Specs :8094<br/>Technical Data]
AUCTION[🏢 Auction Data :8098<br/>AJES Parser]
OTP[📨 OTP Bot :8095<br/>SMS via Telegram]
end
subgraph "Хранилища данных"
PG[(🗄️ PostgreSQL<br/>db3.zubat.ru)]
REDIS[(🔄 Redis<br/>Cache & PubSub)]
MINIO[(📦 MinIO<br/>S3-compatible)]
end
subgraph "Внешние интеграции"
BITRIX[🏢 Bitrix24 CRM<br/>stage-plus.bitrix24.ru]
AJES[🏷️ AJES Auction<br/>auc.stage-plus.ru]
FCM[📲 Firebase<br/>Push Notifications]
CBR[📈 CBR API<br/>Exchange Rates]
end
%% Client connections
MA --> NGINX
WP --> NGINX
%% API Gateway routing
NGINX --> |/iam/*| IAM
NGINX --> |/api/v1/*| CORE
NGINX --> |/chat/*| CHAT
NGINX --> |/calculator/*| CALC
NGINX --> |/car-specs/*| SPECS
NGINX --> |/files/*| MINIO
%% Microservice dependencies
CORE --> PG
CORE --> REDIS
CORE --> MINIO
IAM --> PG
IAM --> OTP
CHAT --> PG
CHAT --> REDIS
CHAT --> MINIO
CHAT --> FCM
CALC --> SPECS
CALC --> CBR
SPECS --> PG
AUCTION --> PG
AUCTION --> AJES
OTP --> |Telegram API| FCM
%% External integrations
CORE --> BITRIX
AUCTION --> AJES
style MA fill:#e1f5fe
style WP fill:#e8f5e8
style NGINX fill:#fff3e0
style PG fill:#f3e5f5
style REDIS fill:#ffebee
style MINIO fill:#e0f2f1
erDiagram
%% IAM Service
User {
uuid id PK
string phone UK
string role "client|manager|admin"
string first_name
string last_name
uuid avatar_file_id
int bitrix_contact_id
boolean is_online
timestamp last_seen
}
DeviceToken {
uuid id PK
uuid user_id FK
string platform "ios|android|web"
string token
boolean is_active
}
%% Core API
Car {
uuid id PK
string ajes_lot_id UK
string make
string model
int year
string country "japan|korea|china"
int engine_volume
string status "available|sold|reserved"
int start_price
int sold_price
jsonb photos
jsonb raw_data
}
Order {
uuid id PK
uuid user_id FK
int bitrix_deal_id UK
uuid car_id FK
string status
jsonb bitrix_data
string contact_phone
}
OrderStatusHistory {
uuid id PK
uuid order_id FK
string status
string comment
timestamp created_at
}
File {
uuid id PK
uuid uploaded_by FK
string original_name
string mime_type
int size_bytes
string object_key
int width
int height
}
%% Chat Service
Chat {
uuid id PK
string type "private|group"
string name
uuid last_message_id
timestamp last_message_at
}
ChatMember {
uuid id PK
uuid chat_id FK
uuid user_id FK
string role "member|admin"
int unread_count
uuid last_read_message_id
}
Message {
uuid id PK
uuid chat_id FK
uuid sender_id FK
string type "text|image|document|car_link"
text content
uuid reply_to_id FK
uuid car_id FK
boolean is_edited
boolean is_deleted
}
%% Car Specs Service
CarSpec {
int id PK
string make
string model
string generation
int year_from
int year_to
int engine_volume
string fuel_type
int horsepower
string engine_code
}
%% Auction Data Service
AuctionLot {
int id PK
string source "sferacar|tokidoki"
string source_id
string auction_name
date auction_date
string make
string model
string chassis
int year
int price_jpy
int price_rub
string grade
}
%% Relationships
User ||--o{ DeviceToken : has
User ||--o{ Order : places
Car ||--o{ Order : "ordered in"
Order ||--o{ OrderStatusHistory : "status changes"
Chat ||--o{ ChatMember : "has members"
Chat ||--o{ Message : contains
Message }o--|| Message : "replies to"
Car ||--o{ Message : "linked in"
User ||--o{ ChatMember : "participates in"
User ||--o{ Message : sends
flowchart TD
%% User Registration & Auth
START([Клиент открыл приложение]) --> AUTH{Аутентифицирован?}
AUTH -->|Нет| PHONE[Ввод телефона]
PHONE --> SMS[Отправка SMS кода<br/>OTP Bot → Telegram]
SMS --> VERIFY[Проверка кода<br/>IAM Service]
VERIFY --> TOKEN[Создание JWT токена]
AUTH -->|Да| CATALOG[Просмотр каталога<br/>Core API]
TOKEN --> CATALOG
%% Car Discovery
CATALOG --> SEARCH[Поиск автомобилей<br/>Фильтры, марки, модели]
SEARCH --> CAR_DETAIL[Просмотр автомобиля<br/>Фото, характеристики]
CAR_DETAIL --> CALC[Расчёт стоимости<br/>Calculator Service]
%% Order Process
CAR_DETAIL --> INTERESTED{Заинтересован?}
INTERESTED -->|Да| CHAT_START[Начать чат<br/>Chat Service]
CHAT_START --> MANAGER[Назначение менеджера<br/>Web Panel]
%% Communication
MANAGER --> DISCUSSION[Обсуждение деталей<br/>WebSocket чат]
DISCUSSION --> ORDER_CREATE[Создание заказа<br/>Bitrix24 Webhook]
%% Order Tracking
ORDER_CREATE --> BITRIX_STAGES[Этапы в Bitrix24<br/>12 стадий процесса]
BITRIX_STAGES --> STATUS_UPDATE[Обновление статуса<br/>Webhook → Core API]
STATUS_UPDATE --> PUSH[Push уведомления<br/>Firebase FCM]
%% Data Collection
subgraph "Фоновые процессы"
AUCTION_PARSE[Парсинг аукционов<br/>AJES Parser]
SPECS_UPDATE[Обновление характеристик<br/>Car Specs Service]
RATES_UPDATE[Курсы валют<br/>Calculator Service]
end
AUCTION_PARSE --> CATALOG
SPECS_UPDATE --> CALC
RATES_UPDATE --> CALC
style START fill:#e1f5fe
style CATALOG fill:#e8f5e8
style CHAT_START fill:#fff3e0
style ORDER_CREATE fill:#f3e5f5
style PUSH fill:#ffebee
Все сервисы развёрнуты на db3.zubat.ru через Docker с Nginx API Gateway:
Host: db3.zubat.ru
Domain: mapp.stage-plus.ru (SSL via Let's Encrypt)
Services (127.0.0.1 only):
├── Core API :8000 (4 workers)
├── IAM Service :8010 (2 workers)
├── Chat Service :8020 (2 workers, stateful WebSocket)
├── Calculator :8096 (1 worker)
├── Car Specs :8094 (1 worker)
├── Auction Data :8098 (1 worker)
├── OTP Bot :8095 (1 worker)
├── Web Panel :3000 (Nginx static)
├── PostgreSQL :5432 (4 databases)
├── Redis :6379 (cache & pub/sub)
└── MinIO :9000/:9001 (S3-compatible)
| Route |
Destination |
Purpose |
/iam/* |
iam-service:8010 |
Authentication, users |
/api/v1/* |
core-api:8000 |
Cars, orders, files |
/chat/* |
chat-service:8020 |
Chats, messages |
/chat/ws |
WebSocket upgrade |
Real-time chat |
/calculator/* |
calculator:8096 |
Price calculation |
/car-specs/* |
car-specs:8094 |
Technical specifications |
/files/* |
minio:9000 |
File storage |
/panel/* |
web-panel:3000 |
Admin interface |
PostgreSQL с разделением по доменам:
-- 4 отдельные базы данных
stageplus_iam -- IAM Service (users, device_tokens, app_versions)
stageplus_core -- Core API (cars, orders, files)
stageplus_chat -- Chat Service (chats, messages)
car_specs -- Car Specs Service (car_specs)
-- Auction Data Service использует schema
stageplus_core.auction_data (auction_lots, lot_photos)
- JWT токены с shared secret между сервисами
- IAM Service - единственный источник токенов
- Все сервисы валидируют JWT самостоятельно (без межсервисных вызовов)
- API Gateway терминирует SSL и добавляет заголовки
- Rate limiting на Nginx уровне
- Prometheus metrics на
/metrics каждого сервиса
- Health checks на
/health
- Structured logging (JSON format)
- Docker logs для централизованного сбора
- Core API (основная нагрузка)
- IAM Service
- Calculator Service
- Car Specs Service
- Auction Data Service
- OTP Bot
- Chat Service - WebSocket соединения + Redis pub/sub
- Horizontal scaling - увеличение workers для Core API
- Kubernetes migration - контейнеризация с Helm charts
- Database sharding - разделение по регионам (Япония/Корея/Китай)
- CDN для статических файлов и изображений автомобилей
- Read replicas для PostgreSQL (аналитические запросы)
- PostgreSQL - основные данные
- Redis - WebSocket pub/sub, кэширование
- MinIO - хранение файлов и изображений
- Bitrix24 - создание и отслеживание заказов
- Firebase FCM - push уведомления
- AJES - источник данных об автомобилях
- CBR API - курсы валют (есть fallback)
- Car Specs DB - технические характеристики (fallback на расчёт)
- Telegram Bot - отправка SMS (можно переключить на SMS.ru)
Документ обновлён: 2026-02-21
Версия системы: Production v2.0