Skip to main content

Deployment

Развёртывание

Локальный стек (Ray + MLflow + MinIO + MySQL + scheduler)

Корневой ../docker-compose.yml поднимает весь стек одной командой, без обращения к какому-либо Docker registry — все свои образы (head, worker, scheduler, mlflow-server) собираются локально через build::

docker compose up -d --build --remove-orphans

Сервисы:

Сервис Контейнер Порты Назначение
head ray-head REDISPORT, DASHBOARDPORT, DASHBOARDPORT1, HEADNODEPORT, METRICSPORT голова Ray-кластера
worker — (replicas=NUM_WORKERS) — воркеры Ray-кластера
scheduler mlumina-scheduler 8264 см. scheduler.md
minio mlflow-s3 9000, 9001 S3-совместимое хранилище артефактов MLflow
mc mc — одноразовый бутстрап бакета mlflow в MinIO
db mlflow-db 3306 MySQL — backend store MLflow
server mlflow-server 5001 MLflow tracking server (собирается из ./mlflow)

head/worker/scheduler собираются из корневого ../Dockerfile (база rayproject/ray:latest-py312-cpu, pip install -e .) с локальным тегом mlumina:latest. server собирается из ../mlflow/Dockerfile (просто python:3.12-slim-bookworm + mlflow/requirements.txt).

Все сервисы сидят в одной внешней сети nginx_network (external: true) — предполагается, что она уже создана на хосте (например, реверс-прокси на проде). Переменные окружения читаются из .env (шаблон — .env.sample): порты Ray, число и размер воркеров, логины/пароли MinIO/MySQL, URI MLflow/S3.

docker-compose-local.yml — без внешней сети

Тот же самый стек, но использует свою внутреннюю сеть mlumina-network (bridge, подсеть 172.63.0.0/16), которая создаётся автоматически — не нужно заранее создавать nginx_network. Предназначен для запуска на машине разработчика, где нет и не должно быть внешнего reverse-proxy стека:

docker compose -f docker-compose-local.yml up -d --build --remove-orphans

Оба файла эквивалентны по составу сервисов и версиям образов; различие только в сетевой конфигурации.

MinIO-образы (minio/minio, minio/mc) берутся не с Docker Hub (проект MinIO прекратил публикацию туда), а с quay.io/minio/minio и quay.io/minio/mc, закреплены по digest.

CI/CD (.gitlab-ci.yml)

Пайплайн деплоит на два раннера — gitlab-runner-shell-hpc24 и gitlab-runner-shell-ladaai (блок ladaai в файле сейчас может быть частично закомментирован — см. текущее состояние .gitlab-ci.yml). Сборка и запуск идут полностью локально на раннере, без внешнего Docker registry:

  1. Стадия stop_service* — docker compose down в $PATH_COMPOSE/${CI_PROJECT_NAME}.
  2. Стадия deploy* — копирует весь checkout проекта (rsync, кроме .git) в $PATH_COMPOSE/${CI_PROJECT_NAME} (нужен полный build-контекст: Dockerfile, mlflow/, src/ и т.д.), кладёт .env из .env.sample, затем docker compose build && docker compose up -d --force-recreate.

deploy/ — отдельный GPU/CPU-стек с мониторингом

deploy/compose.yaml + deploy/compose.common.yaml + deploy/compose.cpu.yaml/compose.gpu.yaml — самостоятельный вариант деплоя Ray-кластера, не связанный с корневым docker-compose.yml:

  • свой ../deploy/Dockerfile (multi-stage: uv build пакета mlumina → образ на базе rayproject/ray), переключается между CPU/GPU через RUNTIME/MLUMINA_RUNTIME;
  • head/worker запускаются через deploy/scripts/start-head.sh/start-worker.sh, а не напрямую командой ray start;
  • включает Prometheus + Grafana с готовыми дашбордами (deploy/prometheus/, deploy/grafana/provisioning/);
  • конфигурируется через deploy/.env.sample (MLUMINA_RUNTIME, MLUMINA_NUM_WORKERS, MLUMINA_WORKER_CPUS/GPUS/MEMORY, MLUMINA_HEAD_CPUS/MEMORY, MLUMINA_SHM_SIZE);
  • запуск и назначение описаны в deploy/README.md.

Ни в CI, ни в корневом docker-compose.yml этот стек не задействован — используется отдельно, вручную, там, где нужен GPU-профиль и/или мониторинг.