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}