Архитектура системы
Архитектура OpenMPFlow — сервисы, API, модель данных, плагины, миграции
Сервисы
OpenMPFlow запускается как три Docker-контейнера:
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────┐
│ Admin UI │────▶│ Proxy │────▶│ PostgreSQL │
│ (nginx) │ │ (FastAPI) │ │ │
│ port 3000 │ │ port 8000 │ │ port 5432 │
└─────────────────┘ └─────────────────┘ └──────────────────┘- Admin UI — vanilla JS SPA с Tailwind CSS, раздаётся через nginx
- Proxy — FastAPI backend с 4 API поверхностями
- PostgreSQL — все данные, 24+ файлов миграций
Четыре API поверхности
1. Admin ERP API (/v1/admin/*)
Основной API для Admin UI. 15 доменных роутеров: каталог, заказы, продажи, финансы, отчёты, инвентарь, логистика, планирование, ценообразование, Ozon, интеграции, акции, настройки, пользователи, API-ключи.
Авторизация: API-ключи (mpk_), legacy HMAC-токены.
2. MCP сервер (/mcp)
54 инструмента через Streamable HTTP транспорт. Используется AI-клиентами (Claude, ChatGPT).
Авторизация: API-ключи или OAuth (Logto JWT).
3. Tool API (/v1/tools/invoke)
Вызывается агентами OpenClaw в E2B-песочницах.
4. OAuth endpoints (корневой уровень)
RFC-совместимый OAuth прокси к Logto:
/.well-known/oauth-protected-resource/.well-known/oauth-authorization-server/oauth/authorize,/oauth/token,/oauth/register
Модель данных
Основные сущности следуют жизненному циклу продавца:
Карточка (SKU) → Заказ поставщику → FIFO-партия → Продажа → ПрибыльКлючевые таблицы
| Таблица | Назначение |
|---|---|
master_cards | Каталог товаров (SKU, название, атрибуты, источники) |
supplier_orders | Заказы поставщикам с распределением общих затрат |
supplier_order_items | Позиции заказа с ценами в CNY |
fifo_lots | Партии для FIFO-учёта себестоимости |
card_sales | Продажи с COGS из FIFO-распределения |
finance_transactions | Ручные записи доходов/расходов |
stock_movements | Аудит-трейл перемещений товаров |
admin_users | Аккаунты пользователей с тенантной изоляцией |
admin_api_keys | API-ключи (SHA256 хэш, скоупы) |
Тенантная изоляция
Все запросы изолированы по user_id. Каждая таблица содержит user_id и все запросы включают WHERE user_id = $1.
Миграции
SQL-миграции в /migrations/ отслеживаются таблицей schema_migrations. Скрипт scripts/init-db.sh:
- Создаёт
schema_migrationsесли не существует - Сканирует
init.sql+0*.sqlфайлы по порядку - Пропускает уже применённые (идемпотентно)
- Записывает каждую применённую миграцию с timestamp