# Схема системы
Визуальная схема к [ARCHITECTURE.md](ARCHITECTURE.md) (там — полное текстовое описание).
## Компоненты и потоки данных
```mermaid
flowchart TB
subgraph client["Клиент"]
FE["Frontend (React SPA)
CT 102, nginx"]
end
subgraph app["App-хост 1.32"]
API["API (FastAPI)
JWT · rate-limit · /metrics"]
MQ[("RabbitMQ .82
брокер Celery")]
subgraph workers["Celery-воркеры"]
IDX["worker-indexer
L1 Winnowing · L2 MinHash
PDF/DOCX · парсеры"]
GPU["worker-gpu
L3 семантика · L4 LLM
эмбеддинги"]
GOST["worker-gost
ГОСТ 7.1 / 7.0.5"]
NOTIFY["worker-notifier
SMTP email"]
end
ES[("Elasticsearch
BM25, local")]
VEC{{"Векторный бэкенд
VECTOR_BACKEND"}}
FAISS["FAISS
(файл, дефолт)"]
QDR["Qdrant
(опционально)"]
end
subgraph shared["Общая инфраструктура"]
PG[("PostgreSQL 1.38
users/tasks/documents/
fingerprints/...")]
REDIS[("Redis 1.35
кэш · rate-limit · LSH-индекс")]
MINIO[("MinIO 1.21
документы · full-text · бэкапы")]
OLLAMA["Ollama .163
qwen2.5:7b"]
end
subgraph obs["Опционально (профили compose)"]
PROM["Prometheus"]
GRAF["Grafana"]
end
FE -->|"HTTPS /api, /ws"| API
API -->|"send_task"| MQ
API <-->|"users/tasks"| PG
API <-->|"session/rate-limit"| REDIS
MQ -->|"queue.index"| IDX
MQ -->|"queue.gpu"| GPU
MQ -->|"queue.gost"| GOST
MQ -->|"queue.notify"| NOTIFY
IDX <-->|"documents/fingerprints"| PG
IDX <-->|"MinHash LSH (antiplag_lsh)"| REDIS
IDX <-->|"PDF/full-text"| MINIO
IDX --> ES
IDX -->|"gpu.embed_documents"| MQ
GPU <-->|"documents"| PG
GPU --> VEC
VEC --> FAISS
VEC -.->|"переключение флагом"| QDR
GPU -->|"L4 парафраз"| OLLAMA
GPU --> ES
GOST <-->|"documents"| PG
NOTIFY <-->|"tasks"| PG
NOTIFY -->|"email"| SMTP(["jze9mail.ru"])
API -->|"/metrics"| PROM
PROM --> GRAF
style VEC fill:#00000000,stroke-dasharray: 4 3
style obs fill:#00000000,stroke-dasharray: 4 3
```
## Конвейер проверки плагиата (4 уровня)
```mermaid
sequenceDiagram
participant U as Студент
participant API as API
participant IDX as worker-indexer
participant GPU as worker-gpu
participant LLM as Ollama
U->>API: upload файла
API->>API: сохранить в MinIO, создать Task, commit
API->>IDX: index.extract_and_check
IDX->>IDX: извлечь текст → фрагменты
IDX->>IDX: L1 Winnowing (fingerprints)
IDX->>IDX: L2 MinHash LSH (Redis)
IDX->>GPU: gpu.check_plagiarism (частичные совпадения)
loop по подозрительным фрагментам
GPU->>GPU: L3 семантический поиск (FAISS/Qdrant)
GPU->>LLM: L4 check_paraphrase
LLM-->>GPU: is_paraphrase, confidence
end
GPU->>GPU: app.scoring.aggregate_results (итоговый %)
GPU->>API: результат → Task.result
GPU-->>U: notify.send_task_done → email/WebSocket
```
## Легенда
- Сплошные стрелки — прямые вызовы/запросы; пунктир у `VEC` — переключение бэкенда
по настройке `VECTOR_BACKEND`, не одновременная работа обоих.
- `obs` (Prometheus/Grafana) и `Qdrant` — опциональны, поднимаются под
`docker compose --profile qdrant|observability`, по умолчанию выключены.