- Unify API: lib/api.ts uses /api/v1, inbox uses /api/inbox (rewrites) - Remove localhost refs: openapi, inbox page - Add rewrites: /api/inbox|tmc -> inbox-server, /api/v1 -> FastAPI - Add stub routes: knowledge/insights, recommendations, search, log-error - Transfer from PAPA: prompts (inspection, tmc), scripts, supabase, data/tmc-requests - Fix inbox-server: ORDER BY created_at, package.json - Remove redundant app/api/inbox/files route (rewrites handle it) - knowledge/ in gitignore (large PDFs) Co-authored-by: Cursor <cursoragent@cursor.com>
9.5 KiB
Архитектура технологий системы
Обзор
Система использует современный стек технологий для обеспечения масштабируемости, производительности и надёжности.
Компоненты
1. PostgreSQL - CRUD и авторизация
Назначение: Основная база данных для операционных данных и авторизации
Использование:
- Хранение пользователей и ролей
- CRUD операции для воздушных судов, аудитов, рисков
- Транзакционные данные
- Связи между сущностями
Конфигурация:
DB_HOST=localhost
DB_PORT=5432
DB_NAME=klg
DB_USER=klg
DB_PASSWORD=klg
Файлы:
lib/database/connection.ts- подключениеlib/database/schema.sql- схема БД
2. S3/MinIO + Parquet - Хранение данных
Назначение: Объектное хранилище для больших объёмов данных в формате Parquet
Использование:
- Хранение исторических данных
- Экспорт/импорт больших объёмов
- Архивные копии
- Данные для аналитики
Конфигурация:
MINIO_ENDPOINT=http://localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET=klg-data
Файлы:
lib/storage/s3-client.ts- клиент S3/MinIOlib/parquet/polars-utils.ts- утилиты для Parquet
Использование:
import { uploadParquetFile, getParquetFile } from '@/lib/storage/s3-client';
// Загрузка Parquet файла
await uploadParquetFile('aircraft/data.parquet', buffer);
// Получение файла
const data = await getParquetFile('aircraft/data.parquet');
3. ClickHouse - Аналитика и тяжёлые списки
Назначение: Колоночная БД для аналитических запросов и больших объёмов данных
Использование:
- Аналитические запросы
- Агрегации по большим объёмам данных
- Отчёты и дашборды
- Исторические данные
Конфигурация:
CLICKHOUSE_URL=http://localhost:8123
CLICKHOUSE_DB=klg_analytics
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=
Файлы:
lib/analytics/clickhouse-client.ts- клиент ClickHousescripts/clickhouse-init/init.sql- инициализация схемы
Использование:
import { queryClickHouse, insertClickHouse } from '@/lib/analytics/clickhouse-client';
// Аналитический запрос
const analytics = await queryClickHouse(`
SELECT operator, COUNT(*) as total
FROM aircraft_analytics
GROUP BY operator
`);
// Вставка данных
await insertClickHouse('aircraft_analytics', data);
4. OpenSearch - Полнотекстовый поиск
Назначение: Поиск по всем данным системы с поддержкой полнотекстового поиска
Использование:
- Поиск воздушных судов
- Поиск в документах
- Поиск в аудитах и рисках
- Нечёткий поиск (fuzzy search)
Конфигурация:
OPENSEARCH_URL=http://localhost:9200
OPENSEARCH_USERNAME=
OPENSEARCH_PASSWORD=
Файлы:
lib/search/opensearch-client.ts- клиент OpenSearch
Использование:
import { searchAircraft, indexDocument } from '@/lib/search/opensearch-client';
// Индексация документа
await indexDocument('aircraft', aircraftId, aircraftData);
// Поиск
const results = await searchAircraft('RA-12345', {
operator: 'Аэрофлот',
status: 'Активен'
});
5. Airflow/Prefect + Python (Polars/DuckDB) - Пайплайны
Назначение: Оркестрация ETL пайплайнов для обработки данных
Использование:
- Импорт данных из ФАВТ
- Обработка больших объёмов данных
- Конвертация форматов (CSV → Parquet)
- Загрузка данных в аналитические хранилища
Конфигурация:
PREFECT_API_URL=http://localhost:4200/api
MINIO_ENDPOINT=http://localhost:9000
CLICKHOUSE_URL=http://localhost:8123
Файлы:
scripts/pipelines/aircraft_pipeline.py- пайплайн обработки ВСscripts/pipelines/favt_import_pipeline.py- пайплайн импорта ФАВТscripts/pipelines/requirements.txt- Python зависимости
Установка:
pip install -r scripts/pipelines/requirements.txt
Запуск пайплайна:
# Через Prefect CLI
prefect deployment run aircraft-data-pipeline
# Или напрямую
python scripts/pipelines/aircraft_pipeline.py
6. OpenAPI → Генерация типов на фронт
Назначение: Автоматическая генерация TypeScript типов из OpenAPI схемы
Использование:
- Типобезопасность API
- Автодополнение в IDE
- Валидация запросов/ответов
- Документация API
Файлы:
openapi.json- OpenAPI схемаscripts/openapi-generate.ts- генератор типов
Генерация типов:
npm run generate:types
Использование:
import { Aircraft, APIEndpoints } from '@/lib/api/generated-types';
// Типизированный запрос
const aircraft: Aircraft = await fetch('/api/aircraft/123').then(r => r.json());
Docker Compose
Все сервисы запускаются через Docker Compose:
docker-compose up -d
Сервисы:
db- PostgreSQL (5432)minio- MinIO S3 (9000, 9001)clickhouse- ClickHouse (8123, 9000)opensearch- OpenSearch (9200)opensearch-dashboards- Dashboards (5601)redis- Redis (6379)prefect- Prefect UI (4200)backend- FastAPI (8000)frontend- Next.js (3000)
Поток данных
Импорт данных из ФАВТ
- Python скрипт (
fetch_favt_registry.py) загружает CSV с сайта ФАВТ - Prefect пайплайн (
favt_import_pipeline.py):- Читает CSV
- Конвертирует в Parquet через Polars
- Сохраняет в S3/MinIO
- Импортирует в PostgreSQL
- Данные синхронизируются:
- PostgreSQL - для операционных запросов
- ClickHouse - для аналитики
- OpenSearch - для поиска
Обработка данных
- Пайплайн (
aircraft_pipeline.py):- Загружает данные из PostgreSQL
- Обрабатывает через Polars/DuckDB
- Сохраняет в Parquet
- Загружает в S3 и ClickHouse
Поиск
- При создании/обновлении записи:
- Данные сохраняются в PostgreSQL
- Индексируются в OpenSearch
- При поиске:
- Запрос идёт в OpenSearch
- Результаты возвращаются с релевантностью
Переменные окружения
Создайте файл .env.local:
# PostgreSQL
DB_HOST=localhost
DB_PORT=5432
DB_NAME=klg
DB_USER=klg
DB_PASSWORD=klg
# MinIO/S3
MINIO_ENDPOINT=http://localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin
MINIO_BUCKET=klg-data
# ClickHouse
CLICKHOUSE_URL=http://localhost:8123
CLICKHOUSE_DB=klg_analytics
CLICKHOUSE_USER=default
CLICKHOUSE_PASSWORD=
# OpenSearch
OPENSEARCH_URL=http://localhost:9200
# Prefect
PREFECT_API_URL=http://localhost:4200/api
# Redis
REDIS_HOST=localhost
REDIS_PORT=6379
Запуск системы
-
Запуск всех сервисов:
docker-compose up -d -
Инициализация ClickHouse:
docker-compose exec clickhouse clickhouse-client < scripts/clickhouse-init/init.sql -
Создание bucket в MinIO:
- Откройте http://localhost:9001
- Логин: minioadmin / minioadmin
- Создайте bucket
klg-data
-
Генерация типов из OpenAPI:
npm run generate:types -
Запуск пайплайнов:
# Установка зависимостей pip install -r scripts/pipelines/requirements.txt # Запуск Prefect сервера (уже в Docker) # Запуск пайплайна prefect deployment run aircraft-data-pipeline
Мониторинг
- Prefect UI: http://localhost:4200
- MinIO Console: http://localhost:9001
- OpenSearch Dashboards: http://localhost:5601
- ClickHouse: http://localhost:8123/play
Дополнительная информация
См. также:
docs/MASHTABIRUEMOST.md- масштабируемостьdocs/DEPLOYMENT.md- развёртываниеscripts/pipelines/- примеры пайплайнов