Postgres/Redis/RabbitMQ/MinIO/Ollama теперь общие серверы сети (адреса в .env), локально в докере остаётся только Elasticsearch + app-сервисы. Старый docker-compose.yml (полностью автономный стек) сохранён как docker-compose.selfhosted.yml.example на случай отдельного GPU-сервера в будущем. Добавлен docker-compose.prod.yml (app + свой nginx с TLS, собирающий фронтенд в статику). Makefile переписан под три режима (dev/test-up/prod). Мелкая чистка неиспользуемых импортов во фронтенде.
266 lines
8.5 KiB
Plaintext
266 lines
8.5 KiB
Plaintext
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# Академический помощник — self-hosted вариант (свои Postgres/Redis/RabbitMQ/
|
||
# ES/MinIO/Ollama + GPU passthrough для ollama/worker-gpu).
|
||
#
|
||
# НЕ используется сейчас — реальный прод разворачивается через
|
||
# docker-compose.prod.yml поверх уже существующей общей инфры (Postgres .11,
|
||
# Redis .19, RabbitMQ .82, MinIO .21, Ollama CT108). Держим этот файл на случай,
|
||
# если когда-нибудь появится отдельный GPU-сервер под этот проект — тогда
|
||
# у worker-indexer нужно будет ещё добавить volume ./scripts/parsers:/parsers:ro
|
||
# (в этом файле его сейчас нет, в отличие от prod/test).
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
|
||
networks:
|
||
antiplagiator:
|
||
driver: bridge
|
||
|
||
volumes:
|
||
postgres_data:
|
||
redis_data:
|
||
rabbitmq_data:
|
||
elasticsearch_data:
|
||
minio_data:
|
||
ollama_data:
|
||
faiss_index_selfhosted:
|
||
|
||
# ─── Общие переменные окружения для 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_selfhosted:/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}
|