Files
anti-plagiarism/docker-compose.test.yml
jze9 9894fa9320 feat: админ-панель, лицензия, тестовый стек на распределённой инфраструктуре
Админ-панель (доступ: is_admin + секретный код сессии в /admin/<code>):
- разделы: дашборд (здоровье сервисов, статистика), клиенты, работы,
  база документов, хранилище MinIO, источники парсинга, отстойник работ
- backend: модели ParseSource/StagedWork/AdminSession, миграция 003,
  core/admin (авторизация), роутер api/admin
- frontend: AdminLayout + 7 вкладок, adminApi, вход из кабинета
- Celery index.run_parser (фоновый парсинг), автосбор проверенных работ
  в отстойник с ручным одобрением → индексация в базу

Исправления:
- openalex parser: тип article (не journal-article), убран is_oa-фильтр
- winnowing: приведение xxh64 к signed int64 (фикс bigint out of range)
- bcrypt пин 4.0.1 (совместимость с passlib 1.7.4)
- alembic: prepend_sys_path + asyncpg-драйвер
- frontend: контракт Task (public_id вместо id), react-dropzone

Инфраструктура:
- docker-compose.test.yml: api+frontend+воркеры локально, БД/кэш/хранилище/
  брокер/LLM — на удалённых серверах через .env
- .gitignore: исправлено ошибочное игнорирование кода services/*/app/models/
- LICENSE: проприетарная

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 20:45:53 +05:00

140 lines
4.4 KiB
YAML

# ═══════════════════════════════════════════════════════════════════════════════
# ТЕСТОВЫЙ стек: локально — api, frontend, воркеры, elasticsearch, flower.
# Удалённо (через .env) — postgres, redis, minio, ollama, rabbitmq (сервер .82).
# Запуск: docker compose -f docker-compose.test.yml up -d --build
# ═══════════════════════════════════════════════════════════════════════════════
networks:
aptest:
driver: bridge
volumes:
es_test_data:
faiss_index:
x-app-env: &app-env
env_file: .env
networks:
- aptest
restart: unless-stopped
services:
# ─── Локальная инфраструктура ──────────────────────────────────────────────
elasticsearch:
image: elasticsearch:8.13.0
container_name: aptest-elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- xpack.ml.enabled=false
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- bootstrap.memory_lock=false
- cluster.name=antiplagiator-test
volumes:
- es_test_data:/usr/share/elasticsearch/data
networks:
- aptest
ports:
- "9200:9200"
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -qv '\"status\":\"red\"'"]
interval: 15s
timeout: 10s
retries: 10
start_period: 60s
# ─── Приложение ────────────────────────────────────────────────────────────
# RabbitMQ вынесен на отдельный сервер 192.168.20.82 (см. RABBITMQ_URL в .env)
api:
build:
context: ./services/api
dockerfile: Dockerfile
container_name: aptest-api
<<: *app-env
command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload --reload-dir /app/app
volumes:
- ./services/api:/app
ports:
- "8000:8000"
depends_on:
elasticsearch:
condition: service_healthy
frontend:
build:
context: ./services/frontend
dockerfile: Dockerfile.dev
container_name: aptest-frontend
environment:
VITE_API_TARGET: http://api:8000
networks:
- aptest
volumes:
- ./services/frontend:/app
- /app/node_modules
ports:
- "5173:5173"
depends_on:
- api
restart: unless-stopped
worker-gpu:
build:
context: ./services/worker-gpu
dockerfile: Dockerfile
container_name: aptest-worker-gpu
<<: *app-env
command: celery -A app.celery_app worker -Q queue.gpu -c 1 -n gpu@%h --loglevel=info
volumes:
- ./services/worker-gpu:/app
- faiss_index:/data/index
worker-indexer:
build:
context: ./services/worker-indexer
dockerfile: Dockerfile
container_name: aptest-worker-indexer
<<: *app-env
command: celery -A app.celery_app worker -Q queue.index -c 2 -n indexer@%h --loglevel=info
volumes:
- ./services/worker-indexer:/app
- ./scripts/parsers:/parsers:ro
depends_on:
elasticsearch:
condition: service_healthy
worker-notifier:
build:
context: ./services/worker-notifier
dockerfile: Dockerfile
container_name: aptest-worker-notifier
<<: *app-env
command: celery -A app.celery_app worker -Q queue.notify -c 4 -n notifier@%h --loglevel=info
volumes:
- ./services/worker-notifier:/app
worker-gost:
build:
context: ./services/worker-gost
dockerfile: Dockerfile
container_name: aptest-worker-gost
<<: *app-env
command: celery -A app.celery_app worker -Q queue.gost -c 2 -n gost@%h --loglevel=info
volumes:
- ./services/worker-gost:/app
flower:
image: mher/flower:2.0
container_name: aptest-flower
command: celery --broker=${RABBITMQ_URL} flower --port=5555
environment:
CELERY_BROKER_URL: ${RABBITMQ_URL}
CELERY_RESULT_BACKEND: ${REDIS_URL}
networks:
- aptest
ports:
- "5555:5555"
restart: unless-stopped