feat: initial microservices project structure
Services: - api: FastAPI gateway with JWT auth, async endpoints, WebSocket - worker-gpu: CUDA sentence-transformers, FAISS IVFFlat, Ollama LLM - worker-indexer: Winnowing+MinHash plagiarism detection, PDF/DOCX extraction - worker-notifier: SMTP email notifications - worker-gost: GOST 7.1-2003 and GOST R 7.0.5-2008 formatting Infrastructure: - docker-compose.yml (production) + docker-compose.dev.yml (hot reload) - Nginx reverse proxy + WebSocket support - PostgreSQL 16 with Alembic migrations - Elasticsearch 8 with Russian/English analyzers - MinIO, RabbitMQ, Redis, Ollama Frontend: - React 18 + Vite + TypeScript + TailwindCSS + Zustand + React Query v5 - 9 pages: Home, Search, Cabinet, Task, Check, Bibliography, Pricing, Login, Register Scripts: - Parser stubs: OpenAlex, КиберЛенинка, arXiv (Phase 0 - to be filled) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
154
README.md
Normal file
154
README.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# Академический помощник
|
||||
|
||||
Микросервисная система антиплагиата и поиска академических источников.
|
||||
|
||||
Студент вводит тему → система ищет источники → проверяет плагиат → форматирует ГОСТ-библиографию.
|
||||
Всё асинхронно: студент закрыл браузер, получил 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`.
|
||||
|
||||
## Продакшн деплой
|
||||
|
||||
```bash
|
||||
# На сервере
|
||||
cp .env.example .env
|
||||
nano .env # Настроить все пароли и ключи
|
||||
|
||||
make build
|
||||
make up
|
||||
make migrate
|
||||
|
||||
# SSL сертификат (Let's Encrypt)
|
||||
certbot --nginx -d academic.jze9.ru
|
||||
```
|
||||
|
||||
## Лицензия
|
||||
|
||||
MIT
|
||||
Reference in New Issue
Block a user