# ═══════════════════════════════════════════════════════════════════════════════ # ПРОД стек: локально — nginx (static+proxy), api, воркеры, elasticsearch. # Удалённо (через .env) — postgres, redis, minio, ollama, rabbitmq. # Тот же принцип, что и docker-compose.test.yml (не дублировать общую инфру), # но без bind-mount'ов исходников, без --reload, с собранным фронтендом и nginx/TLS. # Запуск: docker compose -f docker-compose.prod.yml up -d --build # ═══════════════════════════════════════════════════════════════════════════════ networks: antiplagiator: driver: bridge volumes: es_prod_data: faiss_index_prod: x-app-env: &app-env env_file: .env networks: - antiplagiator restart: unless-stopped services: # ─── Локальная инфраструктура ────────────────────────────────────────────── 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 - bootstrap.memory_lock=true - cluster.name=antiplagiator-prod ulimits: memlock: soft: -1 hard: -1 volumes: - es_prod_data:/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: 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: antiplagiator-api <<: *app-env depends_on: elasticsearch: condition: service_healthy worker-gpu: build: context: ./services/worker-gpu dockerfile: Dockerfile container_name: antiplagiator-worker-gpu <<: *app-env volumes: - faiss_index_prod:/data/index depends_on: elasticsearch: condition: service_healthy worker-indexer: build: context: ./services/worker-indexer dockerfile: Dockerfile container_name: antiplagiator-worker-indexer <<: *app-env volumes: - ./scripts/parsers:/parsers:ro depends_on: elasticsearch: condition: service_healthy worker-notifier: build: context: ./services/worker-notifier dockerfile: Dockerfile container_name: antiplagiator-worker-notifier <<: *app-env worker-gost: build: context: ./services/worker-gost dockerfile: Dockerfile container_name: antiplagiator-worker-gost <<: *app-env flower: image: mher/flower:2.0 container_name: antiplagiator-flower command: celery --broker=${RABBITMQ_URL} flower --port=5555 environment: CELERY_BROKER_URL: ${RABBITMQ_URL} CELERY_RESULT_BACKEND: ${REDIS_URL} networks: - antiplagiator restart: unless-stopped # Flower не публикуется наружу напрямую — доступ через ssh-туннель при необходимости # ─── Nginx: собранный фронтенд (static) + proxy /api, /ws → api:8000, TLS ── nginx: build: context: . dockerfile: infra/nginx/Dockerfile container_name: antiplagiator-nginx networks: - antiplagiator ports: - "80:80" - "443:443" volumes: - /etc/letsencrypt:/etc/letsencrypt:ro depends_on: - api restart: unless-stopped