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:
259
docker-compose.yml
Normal file
259
docker-compose.yml
Normal file
@@ -0,0 +1,259 @@
|
||||
version: "3.9"
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
# Академический помощник — Production Docker Compose
|
||||
# ═══════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
networks:
|
||||
antiplagiator:
|
||||
driver: bridge
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
rabbitmq_data:
|
||||
elasticsearch_data:
|
||||
minio_data:
|
||||
ollama_data:
|
||||
faiss_index:
|
||||
|
||||
# ─── Общие переменные окружения для app-сервисов ────────────────────────────
|
||||
x-app-env: &app-env
|
||||
env_file: .env
|
||||
networks:
|
||||
- antiplagiator
|
||||
restart: unless-stopped
|
||||
|
||||
services:
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# ИНФРАСТРУКТУРА
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
postgres:
|
||||
image: postgres:16
|
||||
container_name: antiplagiator-postgres
|
||||
environment:
|
||||
POSTGRES_DB: antiplagiator
|
||||
POSTGRES_USER: antiplagiator
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
|
||||
volumes:
|
||||
- ./data/postgres:/var/lib/postgresql/data
|
||||
- ./infra/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
|
||||
networks:
|
||||
- antiplagiator
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U antiplagiator -d antiplagiator"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 30s
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: antiplagiator-redis
|
||||
command: redis-server --appendonly yes --maxmemory 512mb --maxmemory-policy allkeys-lru
|
||||
volumes:
|
||||
- ./data/redis:/data
|
||||
networks:
|
||||
- antiplagiator
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
rabbitmq:
|
||||
image: rabbitmq:3-management
|
||||
container_name: antiplagiator-rabbitmq
|
||||
environment:
|
||||
RABBITMQ_DEFAULT_USER: ${RABBITMQ_USER:-guest}
|
||||
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_PASSWORD:-guest}
|
||||
volumes:
|
||||
- ./data/rabbitmq:/var/lib/rabbitmq
|
||||
networks:
|
||||
- antiplagiator
|
||||
ports:
|
||||
- "15672:15672" # Management UI
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
|
||||
elasticsearch:
|
||||
image: elasticsearch:8.13.0
|
||||
container_name: antiplagiator-elasticsearch
|
||||
environment:
|
||||
- discovery.type=single-node
|
||||
- xpack.security.enabled=false
|
||||
- xpack.ml.enabled=false
|
||||
- ES_JAVA_OPTS=-Xms2g -Xmx2g
|
||||
- cluster.name=antiplagiator
|
||||
- bootstrap.memory_lock=true
|
||||
ulimits:
|
||||
memlock:
|
||||
soft: -1
|
||||
hard: -1
|
||||
volumes:
|
||||
- ./data/elasticsearch:/usr/share/elasticsearch/data
|
||||
networks:
|
||||
- antiplagiator
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -s http://localhost:9200/_cluster/health | grep -qv '\"status\":\"red\"'"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
start_period: 60s
|
||||
|
||||
minio:
|
||||
image: minio/minio:latest
|
||||
container_name: antiplagiator-minio
|
||||
command: server /data --console-address ":9001"
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:-minioadmin}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:-changeme}
|
||||
volumes:
|
||||
- ./data/minio:/data
|
||||
networks:
|
||||
- antiplagiator
|
||||
ports:
|
||||
- "9001:9001" # Console UI
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "mc", "ready", "local"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 5
|
||||
|
||||
ollama:
|
||||
image: ollama/ollama:latest
|
||||
container_name: antiplagiator-ollama
|
||||
volumes:
|
||||
- ./data/ollama:/root/.ollama
|
||||
networks:
|
||||
- antiplagiator
|
||||
restart: unless-stopped
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: nvidia
|
||||
count: all
|
||||
capabilities: [gpu]
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
# ПРИЛОЖЕНИЕ
|
||||
# ═══════════════════════════════════════════════════════════════════════════
|
||||
|
||||
api:
|
||||
build:
|
||||
context: ./services/api
|
||||
dockerfile: Dockerfile
|
||||
container_name: antiplagiator-api
|
||||
<<: *app-env
|
||||
ports:
|
||||
- "8000:8000"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
elasticsearch:
|
||||
condition: service_healthy
|
||||
minio:
|
||||
condition: service_healthy
|
||||
|
||||
worker-gpu:
|
||||
build:
|
||||
context: ./services/worker-gpu
|
||||
dockerfile: Dockerfile
|
||||
container_name: antiplagiator-worker-gpu
|
||||
<<: *app-env
|
||||
command: celery -A app.celery_app worker -Q queue.gpu -c 1 -n gpu@%h --loglevel=info
|
||||
volumes:
|
||||
- faiss_index:/data/index
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
deploy:
|
||||
resources:
|
||||
reservations:
|
||||
devices:
|
||||
- driver: nvidia
|
||||
count: all
|
||||
capabilities: [gpu]
|
||||
|
||||
worker-indexer:
|
||||
build:
|
||||
context: ./services/worker-indexer
|
||||
dockerfile: Dockerfile
|
||||
container_name: antiplagiator-worker-indexer
|
||||
<<: *app-env
|
||||
command: celery -A app.celery_app worker -Q queue.index -c 4 -n indexer@%h --loglevel=info
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
elasticsearch:
|
||||
condition: service_healthy
|
||||
|
||||
worker-notifier:
|
||||
build:
|
||||
context: ./services/worker-notifier
|
||||
dockerfile: Dockerfile
|
||||
container_name: antiplagiator-worker-notifier
|
||||
<<: *app-env
|
||||
command: celery -A app.celery_app worker -Q queue.notify -c 16 -n notifier@%h --loglevel=info
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
|
||||
worker-gost:
|
||||
build:
|
||||
context: ./services/worker-gost
|
||||
dockerfile: Dockerfile
|
||||
container_name: antiplagiator-worker-gost
|
||||
<<: *app-env
|
||||
command: celery -A app.celery_app worker -Q queue.gost -c 8 -n gost@%h --loglevel=info
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
rabbitmq:
|
||||
condition: service_healthy
|
||||
|
||||
flower:
|
||||
image: mher/flower:2.0
|
||||
container_name: antiplagiator-flower
|
||||
command: celery --broker=${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/} flower --port=5555
|
||||
networks:
|
||||
- antiplagiator
|
||||
ports:
|
||||
- "5555:5555"
|
||||
depends_on:
|
||||
- rabbitmq
|
||||
- redis
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
CELERY_BROKER_URL: ${RABBITMQ_URL:-amqp://guest:guest@rabbitmq:5672/}
|
||||
CELERY_RESULT_BACKEND: ${REDIS_URL:-redis://redis:6379/0}
|
||||
Reference in New Issue
Block a user