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

Руководство для администратора: как развернуть сервер ARTEX и окружающую инфраструктуру.

<p class="callout warning">Имена образов и переменные окружения ХАБа в примерах ниже приведены как шаблон. Перед развёртыванием сверьте их с актуальным репозиторием платформы.</p>

## Состав развёртывания

| Компонент | Контейнер | Обязательность |
|---|---|---|
| ХАБ платформы (Gateway, Stream Engine, Device Manager) | образ ARTEX HUB | Обязательно |
| Веб-интерфейс оператора | статический фронтенд (React), раздаётся ХАБом (ClientIOModule) или отдельным веб-сервером | Обязательно |
| Redis | `redis` | Рекомендуется |
| PostgreSQL | `postgres` | Обязательно для многопользовательского режима |
| S3-совместимое хранилище | `minio/minio` | Для записи видео и датасетов |
| Time Series DB | например, TimescaleDB или InfluxDB | Для записи телеметрии |
| AI Runtime / модели | отдельные контейнеры с GPU | При использовании моделей ИИ |
| Prometheus + Grafana | `prom/prometheus`, `grafana/grafana` | Рекомендуется |

## Требования к серверу

| Ресурс | Минимум (демо, 1–5 роботов) | Рекомендуется (соревнования, модели ИИ) |
|---|---|---|
| CPU | 4 ядра | 8+ ядер |
| RAM | 8 ГБ | 32 ГБ |
| GPU | не требуется | NVIDIA с поддержкой CUDA для YOLO / RL |
| Диск | 50 ГБ SSD | 1 ТБ+ под видео и датасеты |
| Сеть | 100 Мбит/с | 1 Гбит/с; ~2–5 Мбит/с на каждый видеопоток |
| ПО | Linux, Docker, Docker Compose | Kubernetes-кластер |

## Шаг 1. Подготовка хоста

```bash
# Docker и Compose
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# Для моделей ИИ на GPU — NVIDIA Container Toolkit
# https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/
```

Доступ администраторов к серверу — только по SSH-ключам.

## Шаг 2. Инфраструктура хранения (Docker Compose)

```yaml
# docker-compose.infra.yml
services:
  redis:
    image: redis:7
    restart: unless-stopped
    ports: ["6379:6379"]

  postgres:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_DB: artex
      POSTGRES_USER: artex
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes: ["pg_data:/var/lib/postgresql/data"]

  minio:
    image: minio/minio
    restart: unless-stopped
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: ${MINIO_USER}
      MINIO_ROOT_PASSWORD: ${MINIO_PASSWORD}
    ports: ["9000:9000", "9001:9001"]
    volumes: ["minio_data:/data"]

  timescaledb:
    image: timescale/timescaledb:latest-pg16
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${TSDB_PASSWORD}
    volumes: ["tsdb_data:/var/lib/postgresql/data"]

volumes:
  pg_data:
  minio_data:
  tsdb_data:
```

```bash
docker compose -f docker-compose.infra.yml up -d
```

## Шаг 3. Запуск ХАБа

```yaml
# docker-compose.hub.yml (шаблон)
services:
  artex-hub:
    image: <registry>/artex-hub:<version>
    restart: unless-stopped
    ports:
      - "80:80"        # веб-интерфейс, WebSocket, Socket.IO для роботов
    environment:
      REDIS_URL: redis://redis:6379
      POSTGRES_DSN: postgres://artex:${POSTGRES_PASSWORD}@postgres:5432/artex
      S3_ENDPOINT: http://minio:9000
      JWT_SECRET: ${JWT_SECRET}
```

Роботы по умолчанию подключаются к адресу `http://artex.arcon:80` — это значение параметра `server` в SDK. Настройте DNS-запись (или `/etc/hosts` на роботах) либо укажите реальный адрес сервера в `params.json` каждого робота.

## Шаг 4. Проверка

1. Откройте веб-интерфейс в браузере: `http://<адрес-сервера>/`. Должна открыться страница «Подключения».
2. Запустите на тестовом устройстве минимальный пример из раздела [Быстрый старт](https://docs.mephi-ai.ru/books/po-dlia-robota/page/bystryi-start).
3. Убедитесь, что устройство появилось в таблице подключений, а телеметрия обновляется.

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

Для продуктивного режима каждый сервис разворачивается отдельным Deployment:

- **Gateway / Stream Engine / Device Manager** — горизонтально масштабируются; для Socket.IO и WebSocket включите «липкие» сессии (sticky sessions) на Ingress.
- **AI Runtime** — Deployment на узлах с GPU (`nodeSelector` / `tolerations`), ресурс `nvidia.com/gpu`.
- **Хранилища** — StatefulSet или управляемые сервисы.
- Секреты (`JWT_SECRET`, пароли БД, ключи S3) — через Kubernetes Secrets.
- Метрики — через ServiceMonitor для Prometheus.

## Обновление

1. Обновите образ в манифесте/compose-файле.
2. `docker compose pull && docker compose up -d` (или `kubectl rollout restart deployment/<имя>`).
3. Роботы переподключатся автоматически (SDK делает до 5 попыток с задержкой 1–5 с). Если сервер был недоступен дольше — перезапустите ПО на роботах.