jze9 34fa495fb1
Some checks are pending
Deploy / deploy (push) Waiting to run
ci: авто-деплой в прод через Gitea Actions (push в main)
Self-hosted act_runner в host-режиме на app-хосте 1.32 (label "deploy").
При пуше в main workflow клонирует коммит и запускает scripts/deploy.sh:
синхронизация кода → пересборка/перезапуск бэкенд-сервисов → миграции →
сборка фронтенда → выкладка статики на CT 102 (reverse-proxy) с бэкапом.

Доступ к Proxmox-хосту для CT 102 — через секрет PVE_PASSWORD.
Больше ручных rsync/rebuild — деплой по git push.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-29 13:23:04 +05:00

Академический помощник

Микросервисная система антиплагиата и поиска академических источников.

Студент вводит тему → система ищет источники → проверяет плагиат → форматирует ГОСТ-библиографию. Всё асинхронно: студент закрыл браузер, получил 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

Быстрый старт

# 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

Команды

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

Парсеры источников

# Запарсить 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) — на случай отдельного выделенного сервера в будущем.

Продакшн деплой

# На сервере
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

Description
No description provided
Readme 382 KiB
Languages
Python 63.6%
TypeScript 32.8%
Makefile 1.5%
Shell 1.1%
Dockerfile 0.7%
Other 0.3%