# Академический помощник Микросервисная система антиплагиата и поиска академических источников. Студент вводит тему → система ищет источники → проверяет плагиат → форматирует ГОСТ-библиографию. Всё асинхронно: студент закрыл браузер, получил email когда готово. ## Архитектура ``` ┌─────────────────┐ │ Frontend │ React + Vite + TypeScript │ (React SPA) │ └────────┬────────┘ │ HTTPS ┌────────▼────────┐ │ API Gateway │ FastAPI, порт 8000 │ (FastAPI) │ JWT, Rate Limit, WebSocket └──┬─────────┬───┘ │ RabbitMQ│ Celery задачи ┌────────────▼──┐ ┌──▼──────────────┐ │ worker-gpu │ │ worker-indexer │ │ (CUDA/FAISS) │ │ (PDF/DOCX parse) │ │ Sem. search │ │ Winnowing/MinHash │ │ LLM paraphrase│ └──────────────────┘ └────────────────┘ │ ┌─────────▼──────────┐ ┌────────────────────┐ │ worker-notifier │ │ worker-gost │ │ (SMTP email) │ │ (ГОСТ 7.1/7.0.5) │ └────────────────────┘ └────────────────────┘ Инфраструктура: PostgreSQL 16 · Redis 7 · RabbitMQ 3 · Elasticsearch 8 MinIO (4TB) · Ollama (llama3:8b) · NVIDIA RTX 2060 ``` ## Быстрый старт ```bash # 1. Клонировать репозиторий git clone https://github.com/jze9/anti-plagiarism.git cd anti-plagiarism # 2. Создать файл конфигурации cp .env.example .env # Отредактировать .env — сменить пароли и ключи! # 3. Запустить в режиме разработки make dev # 4. Применить миграции базы данных make migrate-dev # 5. Создать ES индекс make es-init # 6. Открыть браузер # Frontend: http://localhost:5173 # API docs: http://localhost:8000/api/docs # RabbitMQ: http://localhost:15672 (guest/guest) # Flower: http://localhost:5555 # MinIO: http://localhost:9001 ``` ## Команды ```bash make dev # Запуск в dev режиме (hot reload) make build # Сборка Docker образов make up # Запуск в продакшн режиме make down # Остановить все сервисы make migrate # Применить Alembic миграции make logs # Логи всех сервисов make shell-api # Shell в контейнере API make shell-gpu # Shell в контейнере GPU воркера make lint # Запустить линтер make test # Запустить тесты make clean # Удалить контейнеры и volumes ``` ## Стек технологий | Компонент | Технологии | |-----------|-----------| | API Gateway | FastAPI 0.111, Python 3.11, SQLAlchemy 2.0, Alembic | | GPU Worker | sentence-transformers, FAISS-GPU (IVFFlat), Ollama (llama3:8b) | | Indexer | PyMuPDF, python-docx, Winnowing, MinHash LSH | | Очереди | RabbitMQ (брокер) + Celery 5 (воркеры) + Redis (результаты) | | База данных | PostgreSQL 16 | | Поиск | Elasticsearch 8 (BM25) + FAISS GPU (cosine) | | Хранилище | MinIO (S3-совместимый) | | Frontend | React 18, Vite, TypeScript, TailwindCSS, Zustand, React Query v5 | ## Проверка плагиата (4 уровня) 1. **Winnowing + MinHash** (~мс) — точное совпадение по fingerprints 2. **n-граммы + Jaccard** (~сек) — нечёткое совпадение 3. **FAISS GPU cosine** (~мс) — семантическое сходство (порог 0.75) 4. **Ollama Llama3** (~2сек) — LLM анализ парафраза (confidence > 0.7) ## Тарифные планы | Тариф | Цена | Поиск/день | Изложений/мес | Плагиат/мес | Одновременно | |-------|------|-----------|--------------|-------------|-------------| | Бесплатный | 0₽ | 10 | 3 | 1 | 1 | | Студенческий | 199₽ | безлимит | 30 | 10 | 2 | | Премиум | 499₽ | безлимит | безлимит | 50 | 5 | | Научный | 999₽ | безлимит | безлимит | безлимит | 10 | ## Парсеры источников ```bash # Запарсить OpenAlex python scripts/run_parser.py openalex \ --query "машинное обучение" \ --limit 10000 \ --output /data/processed # КиберЛенинка python scripts/run_parser.py cyberleninka \ --query "нейронные сети" \ --limit 1000 # arXiv python scripts/run_parser.py arxiv \ --query "deep learning" \ --categories cs.AI cs.LG \ --limit 5000 ``` ## Переменные окружения Смотри `.env.example` для полного списка переменных. Обязательно смените `SECRET_KEY`, `POSTGRES_PASSWORD`, `MINIO_SECRET_KEY`. ## Три docker-compose файла | Файл | Назначение | |------|-----------| | `docker-compose.prod.yml` | **Реальный прод.** app-сервисы + nginx (собранный фронтенд + TLS) + локальный Elasticsearch. Postgres/Redis/RabbitMQ/MinIO/Ollama — уже существующие общие серверы, адреса в `.env`. | | `docker-compose.test.yml` | Повседневная разработка — hot reload против той же общей инфры, что и прод (`make test-up`). | | `docker-compose.selfhosted.yml.example` | Не используется. Полностью автономный вариант (свои Postgres/Redis/RabbitMQ/ES/MinIO/Ollama + GPU passthrough) — на случай отдельного выделенного сервера в будущем. | ## Продакшн деплой ```bash # На сервере cp .env.example .env nano .env # Настроить все пароли и ключи, указать реальные адреса общих Postgres/Redis/RabbitMQ/MinIO/Ollama # Сертификат ДО первого запуска nginx-контейнера (standalone, порт 80 должен быть свободен) certbot certonly --standalone -d academic.jze9.ru make build make up make migrate ``` Nginx работает внутри контейнера (`docker-compose.prod.yml`, сервис `nginx`, Dockerfile в `infra/nginx/Dockerfile`) — собирает `services/frontend` в статику и отдаёт её вместе с проксированием `/api/`, `/ws/` на `api:8000` по конфигу `infra/nginx/nginx.conf`. Контейнер монтирует `/etc/letsencrypt` с хоста как read-only — сертификат обновляется на хосте (`certbot renew`), контейнер просто читает его. ## Лицензия MIT