Платформа для автоматической генерации Apache Velocity шаблонов для трансформации JSON в XML на основе схем данных.
Система предназначена для автоматизации процесса создания шаблонов преобразования данных между форматами JSON и XML.
Основная задача: упростить интеграцию с государственными информационными системами (ГИС), которые требуют данные в формате XML, когда исходные данные поступают в JSON.
- Парсинг схем - анализирует JSON Schema и XSD схемы
- Автоматический маппинг - сопоставляет поля между схемами используя алгоритмы:
- Levenshtein distance (расстояние редактирования)
- Fuzzy matching (нечёткое сопоставление)
- Token sort ratio (сравнение токенов)
- Генерация VM шаблонов - создаёт Apache Velocity шаблоны для трансформации
- Валидация - проверяет корректность сгенерированных шаблонов
- Предпросмотр - показывает результат трансформации на тестовых данных
Система построена на микросервисной архитектуре с 6 основными сервисами:
┌─────────────────────────────────────────────────────────────┐
│ Frontend │
│ (React + TypeScript) │
└──────────────────────────┬──────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ NGINX (Reverse Proxy) │
│ Load Balancer + SSL │
└──────────────────────────┬──────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ BFF Service (API Gateway) │
│ Оркестрация запросов + Аггрегация │
└─────┬─────────────┬─────────┬──────────────┬─────────────┬──┘
│ │ │ │ │
↓ ↓ ↓ ↓ ↓
┌────────┐ ┌────────┐ ┌────────┐ ┌─────────┐ ┌────────────┐
│Auth │ │Projects│ │File │ │Generator│ │Notification│
│Service │ │Service │ │Service │ │Service │ │Service │
└─┬──────┘ └─┬──────┘ └─┬──────┘ └─────────┘ └────┬───────┘
│ │ │ │
└──────────┴──────────┴───────────────────────────────┘
│ │
↓ ↓
┌────────────────┐ ┌──────────┐
│ PostgreSQL │ │ RabbitMQ │
│ (Shared DB) │ │ Queue │
└────────────────┘ └──────────┘
│
↓
┌──────────────┐
│ email worker │
└──────────────┘
- Аутентификация и авторизация (JWT)
- Управление пользователями и ролями
- Регистрация, вход, обновление профиля
- API Gateway для фронтенда
- Оркестрация запросов между сервисами
- Аггрегация данных
- Единая точка входа
- Управление проектами
- Хранение field mappings
- История изменений проектов
- CRUD операции
- Загрузка и хранение файлов
- Управление JSON/XSD схемами
- Тестовые данные и VM шаблоны
- Скачивание файлов
- Парсинг JSON Schema и XSD
- Автоматический маппинг полей
- Генерация Apache Velocity шаблонов
- Валидация шаблонов
- Stateless сервис
- Отправка email уведомлений
- Асинхронная обработка через RabbitMQ
- История уведомлений
- Retry механизм
- Language: Python 3.11
- Framework: FastAPI
- Database: PostgreSQL
- ORM: SQLAlchemy
- Message Queue: RabbitMQ
- Validation: Pydantic
- Async: asyncio, httpx, aiofiles
- XML/XSD: lxml, xmlschema
- JSON: jsonschema, json-ref-dict
- Fuzzy Matching: rapidfuzz
- Framework: React 18
- Language: TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS
- State Management: Zustand
- HTTP Client: Axios
- Desktop: Electron (опционально)
- Reverse Proxy: NGINX
- Containerization: Docker + Docker Compose
- CI/CD: Docker Compose (dev/prod)
- Storage: Local File System (можно заменить на S3/MinIO)
Платформа поддерживает три режима работы в зависимости от ваших требований к инфраструктуре и интеграции:
Файл конфигурации: docker-compose.prod.yml
Полноценное облачное решение с веб-интерфейсом для работы через браузер.
Особенности:
- ✅ Все компоненты в контейнерах (включая frontend)
- ✅ NGINX для reverse proxy и load balancing
- ✅ CloudPub для публичного доступа к приложению
- ✅ Полная облачная инфраструктура
- ✅ Email уведомления через RabbitMQ
- ✅ Автоматический SSL (с настройкой)
- ✅ Готово для production развертывания
Идеально для:
- Публичного доступа к платформе
- Командной работы
- Enterprise развертывания
- Работы из любого браузера
Запуск:
docker-compose -f docker-compose.prod.yml up -dДоступ:
- Web UI:
https://your-domain.com(через CloudPub) - API:
https://your-domain.com/api
Файл конфигурации: docker-compose.dev.yml
Оптимальное решение для разработки - десктоп приложение с облачным хранилищем и функционалом.
Особенности:
- ✅ Backend сервисы в контейнерах (Docker)
- ✅ Frontend как desktop приложение (Electron)
- ✅ Облачное хранилище файлов
- ✅ RabbitMQ для очередей
- ✅ Email уведомления
- ✅ CloudPub для публичного доступа к backend API
- ✅ Hot reload для разработки
Идеально для:
- Разработки и тестирования
- Desktop UX с облачными возможностями
- Работы с удаленной командой
- Доступа к backend API извне
Запуск:
# 1. Запустить backend сервисы
docker-compose -f docker-compose.dev.yml up -d
# 2. Запустить desktop приложение
cd frontend
npm install
npm run dev:electronДоступ:
- Desktop UI: Electron приложение (автоматически откроется)
- Backend API:
http://localhost:8000или через CloudPub публичный URL - RabbitMQ UI:
http://localhost:15672
Файл конфигурации: docker-compose.local.yml
Автономное решение для работы без интернета - все хранится локально.
Особенности:
- ✅ Минимальный набор сервисов
- ✅ Desktop приложение (Electron)
- ✅ Локальное хранилище файлов
- ✅ Работает БЕЗ интернета (Docker образы в репозитории)
- ✅ Автоматическая загрузка образов из файлов
- ✅ Автоматический запуск в dev режиме
- ❌ Без email уведомлений (нет RabbitMQ)
- ❌ Без CloudPub (нет публичного доступа)
- ❌ Без NGINX (прямое подключение к BFF)
Состав сервисов:
- PostgreSQL (2 базы данных)
- BFF Service (API Gateway)
- Files Service (локальное хранилище)
- Projects Service
- Generator Service
Идеально для:
- Работы без интернета
- Защищенных/изолированных сред
- Личного использования
- Максимальной приватности данных
- Переносимой установки (флешка/диск)
Подготовка для offline (один раз на машине с интернетом):
# Экспортировать Docker образы в репозиторий
chmod +x export-docker-images.bash
./export-docker-images.bash
# Добавить образы в git и запушить
git add docker-images/
git commit -m "Add Docker images for offline mode"
git pushЗапуск (на машине БЕЗ интернета):
# Просто запустите один скрипт - всё автоматически!
chmod +x local.bash
./local.bashЧто происходит при запуске:
- ✅ Проверка Node.js
- ✅ Загрузка Docker образов из
docker-images/ - ✅ Проверка Docker
- ✅ Запуск контейнеров (БЕЗ сборки)
- ✅ Установка npm зависимостей
- ✅ Автоматический запуск в dev режиме
Доступ:
- Desktop UI: Electron приложение (запустится автоматически)
- Backend API:
http://localhost:8000(только локально)
📖 Подробная инструкция: См. OFFLINE-SETUP.md
| Функционал | Production (Web) | Development (Hybrid) | Local (Offline) |
|---|---|---|---|
| Frontend | Web (в контейнере) | Desktop (Electron) | Desktop (Electron) |
| Backend | Docker | Docker | Docker |
| Доступ | Публичный URL | Desktop + API URL | Только локально |
| Хранилище | Облачное | Облачное | Локальное |
| Email уведомления | ✅ | ✅ | ❌ |
| Интернет | Обязателен | Обязателен | Не требуется |
| NGINX | ✅ | ✅ | ❌ |
| CloudPub | ✅ | ✅ | ❌ |
| RabbitMQ | ✅ | ✅ | ❌ |
| Hot reload | ❌ | ✅ | ✅ |
# Остановить текущий режим
docker-compose -f docker-compose.<current>.yml down
# Запустить новый режим
docker-compose -f docker-compose.<new>.yml up -dВажно: Данные БД сохраняются в отдельных volumes для каждого режима, поэтому переключение безопасно.
- Docker 20.10+
- Docker Compose 2.0+
- Node.js 18+ (для фронтенда)
- npm или yarn
- 4GB RAM minimum
- 10GB свободного места
git clone <repository-url>
cd test# Запустить все backend сервисы (PostgreSQL, RabbitMQ, все API)
docker-compose -f docker-compose.dev.yml up -d
# Дождаться пока все контейнеры запустятся (~30 секунд)
# Проверить статус
docker-compose -f docker-compose.dev.yml ps
# Должно быть 8 контейнеров в статусе "Up":
# - postgres-db
# - rabbitmq
# - auth-service
# - bff-service
# - projects-service
# - files-service
# - generator-service
# - notification-serviceПроверка работоспособности backend:
# Проверить health check
curl http://localhost:8000/health
# Ожидаемый ответ: {"status":"healthy"}
# Открыть Swagger документацию
open http://localhost:8000/docs# Перейти в директорию фронтенда
cd frontend
# Установить зависимости (первый раз)
npm install
# Запустить frontend в режиме разработки
npm run dev
# ИЛИ запустить в режиме Electron desktop приложения
npm run dev:electronПосле запуска:
- Frontend (web): http://localhost:5173
- Frontend (electron): откроется desktop окно
# Зарегистрировать пользователя через Swagger UI
# или через curl:
curl -X POST http://localhost:8000/api/auth/create \
-H "Content-Type: application/json" \
-d '{
"email": "admin@example.com",
"password": "admin123",
"confirm_password": "admin123"
}'| Сервис | URL | Логин/Пароль |
|---|---|---|
| Frontend (Web) | http://localhost:5173 | - |
| BFF API | http://localhost:8000 | - |
| Swagger Docs | http://localhost:8000/docs | - |
| PostgreSQL | localhost:5432 | postgres / postgres |
| RabbitMQ UI | http://localhost:15672 | guest / guest |
# Все сервисы
docker-compose -f docker-compose.dev.yml logs -f
# Конкретный сервис
docker-compose -f docker-compose.dev.yml logs -f bff-service
# Последние 100 строк
docker-compose -f docker-compose.dev.yml logs --tail=100 generator-service# Остановить backend
docker-compose -f docker-compose.dev.yml down
# Остановить и удалить данные (volumes)
docker-compose -f docker-compose.dev.yml down -v
# Frontend останавливается через Ctrl+C в терминале# Запустить в production режиме
docker-compose -f docker-compose.prod.yml up -dДоступы:
- Frontend: https://your-domain.com
- BFF API: https://your-domain.com/api
- Все через NGINX (SSL + Load Balancing)
POST /api/projects/fullОдин запрос делает всё:
- Создаёт проект
- Загружает файлы (JSON schema, XSD schema, test data)
- Парсит схемы
- Автоматически маппит поля
- Генерирует VM шаблон
- Валидирует шаблон
- Сохраняет результаты
Время выполнения: ~5 секунда ⚡
Вы получаете:
- Созданный проект (status: COMPLETED)
- 3 загруженных файла (JSON, XSD, test_data)
- N автоматических маппингов (с confidence score)
- Сгенерированный VM шаблон (готов к использованию)
- Результаты валидации
- Предпросмотр XML (если переданы test_data)
Если автоматический маппинг неточный:
- Просмотр маппингов:
GET /api/projects/{id}/mappings - Обновление:
PUT /api/projects/mappings/{id} - Пересоздание шаблона:
POST /api/generator/generate
# 1. Логин
curl -X POST http://localhost:8000/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123"
}'
# Response: { "access_token": "eyJ...", ... }
# 2. Создать проект с генерацией (ONE-SHOT!)
curl -X POST http://localhost:8000/api/projects/full \
-H "Authorization: Bearer eyJ..." \
-F "name=My Project" \
-F "description=Test project" \
-F "files=@json_schema.json" \
-F "files=@xsd_schema.xsd" \
-F "files=@test_data.json" \
-F "file_types=JSON_SCHEMA,XSD_SCHEMA,TEST_DATA" \
-F "generate=true"
# Response: полный результат с проектом, файлами, маппингами, шаблоном!
# 3. Скачать сгенерированный VM шаблон
curl -X GET http://localhost:8000/api/files/{template_id}/download \
-H "Authorization: Bearer eyJ..." \
-o generated_template.vmВ директории doc/test/files/ есть готовые примеры:
- simple/ - простая схема (5 полей)
- medium/ - средняя сложность (15 полей)
- complex/ - сложная схема (24+ полей)
После запуска доступна интерактивная документация:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- OpenAPI Schema: http://localhost:8000/openapi.json
Основные настройки находятся в docker-compose.dev.yml / docker-compose.prod.yml
Обязательные:
# Database
DATABASE_URL=postgresql://user:pass@postgres-db:5432/project_db
# JWT
SECRET_KEY=your-secret-key-change-in-production
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# SMTP (для уведомлений)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-passwordОпциональные:
# Генератор
DEFAULT_CONFIDENCE_THRESHOLD=0.5
MAX_SCHEMA_SIZE=10485760
# Файлы
MAX_FILE_SIZE=104857600
STORAGE_PATH=/app/storage# Health check всех сервисов
curl http://localhost:8000/health
# Статус контейнеров
docker-compose -f docker-compose.dev.yml ps# Подключиться к PostgreSQL
docker exec -it postgres-db psql -U postgres -d project_db
# Просмотр таблиц
\dt
# Количество проектов
SELECT COUNT(*) FROM projects;- Web UI: http://localhost:15672
- Login: guest / guest
- Просмотр очередей и сообщений
- JWT аутентификация с ограниченным временем жизни
- Пароли хешируются с bcrypt
- HTTPS в production (через NGINX)
- CORS настройки
- SQL injection защита (ORM)
- Валидация всех входных данных (Pydantic)
- Rate limiting (опционально в NGINX)
- Изоляция сервисов (Docker network)
- Сменить SECRET_KEY на случайный длинный ключ
- Использовать HTTPS с валидными сертификатами
- Настроить firewall (только 80, 443 порты открыты)
- Регулярные бэкапы PostgreSQL
- Мониторинг логов на подозрительную активность
- Обновлять зависимости (security patches)
- Создавать репликации (bff-service особенно)
project_name/
├── auth-service/ # Аутентификация
├── bff-service/ # API Gateway
├── projects-service/ # Проекты и маппинги
├── files-service/ # Файлы
├── generator-service/ # Генерация VM
├── notification-service/ # Уведомления
├── frontend/ # React UI
├── infrastructure/ # NGINX configs
├── doc/ # Документация
│ ├── setup/ # Инструкции по настройке
│ ├── test/ # Тестовые данные
│ └── tz/ # Техническое задание
│ └── service/ # Описание сервисов
├── docker-compose.dev.yml
├── docker-compose.prod.yml
└── README.md
- Создать директорию
new-service/ - Добавить
Dockerfileиrequirements.txt - Добавить в
docker-compose.dev.yml - Добавить клиента в
bff-service/app/services/
В development режиме все сервисы автоматически перезагружаются при изменении кода (volumes mounted).
- Улучшение алгоритмов маппинга (ML модель)
- Версионирование проектов
- Экспорт/импорт проектов
- Batch генерация (несколько проектов)
- Графический редактор маппингов
- Kubernetes deployment
- Prometheus + Grafana мониторинг
- ELK Stack для логов
- S3/MinIO для файлов
- Redis для кеширования
- CI/CD пайплайн (GitHub Actions)
Разработано для автоматизации интеграций с государственными информационными системами.
Технологический стек выбран для:
- Высокой производительности (FastAPI + async)
- Гибкости и масштабируемости (микросервисы)
- Простоты разработки (Python + TypeScript)
- Надёжности (Docker + PostgreSQL)