# Основной вариант — JVM: прогретая, она вдвое экономнее native по процессору и # втрое быстрее по задержке. Холодное окно закрывает прогрев на старте. # docker compose up pd-guard # # Наблюдение поднимается вместе со всем стеком: `docker compose up` даёт сервис, # Prometheus на 9090 и Grafana на 3000 с уже заведённым дашбордом. # # Несколько узлов: маскирование детерминировано и работает на любом узле, а вот # обратный шаг требует общего состояния — иначе запрос попадёт не на тот узел. # docker compose --profile cluster up services: pd-guard: image: pd-guard-spring:jvm build: context: . dockerfile: src/main/docker/Dockerfile ports: - "8080:8080" environment: PDGUARD_MAX_CONCURRENT: "2000" PDGUARD_STORE_TTL_MINUTES: "30" # Прогоны на старте, чтобы первые запросы не шли по непрогретому коду. PDGUARD_WARMUP_ITERATIONS: "2000" # Вторая ступень распознавания. Модель в репозиторий не входит: # ./tools/fetch-ner-model.sh. Пока её нет, ступень сама выключится и # сервис работает на одних правилах. PDGUARD_NER_ENGINE: rubert PDGUARD_NER_MODEL: /deployments/models/rubert-ner volumes: - ./config:/deployments/config:ro - ./models:/deployments/models:ro healthcheck: test: ["CMD", "curl", "-fsS", "http://localhost:8080/health"] interval: 10s timeout: 2s retries: 3 prometheus: image: prom/prometheus:v2.54.1 command: - --config.file=/etc/prometheus/prometheus.yml - --storage.tsdb.retention.time=6h - --web.enable-lifecycle ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro depends_on: - pd-guard grafana: image: grafana/grafana:11.2.0 ports: - "3000:3000" environment: # Демонстрационный стенд: вход без пароля, чтобы жюри не искало учётные данные. # Для контура с реальными данными это надо снять. GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: Admin GF_AUTH_DISABLE_LOGIN_FORM: "true" GF_USERS_DEFAULT_THEME: light # Сразу открывать дашборд модуля, а не пустую главную. GF_DASHBOARDS_DEFAULT_HOME_DASHBOARD_PATH: /var/lib/grafana/dashboards/pd-guard.json volumes: - ./monitoring/grafana/provisioning:/etc/grafana/provisioning:ro - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards:ro depends_on: - prometheus redis: profiles: ["cluster"] image: redis:7-alpine command: ["redis-server", "--save", "", "--appendonly", "no", "--maxmemory", "1gb", "--maxmemory-policy", "allkeys-lru"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 2s retries: 5 node-a: &node profiles: ["cluster"] build: context: . dockerfile: src/main/docker/Dockerfile ports: - "8081:8080" environment: PDGUARD_STORE_BACKEND: redis SPRING_DATA_REDIS_HOST: redis PDGUARD_MAX_CONCURRENT: "2000" PDGUARD_WARMUP_ITERATIONS: "2000" volumes: - ./config:/deployments/config:ro depends_on: redis: condition: service_healthy node-b: <<: *node ports: - "8082:8080"