Skip to content

Sizing: сколько железа нужно платформе ​

Сколько ресурсов требует Unishift Platform на одну установку и как считать железо под конкретное число пользователей. Документ отвечает на вопросы пресейла: «что взять под 200 человек», «хватит ли 1 ТБ», «нужна ли GPU».

Готовые схемы размещения — в референсных архитектурах.

Короткий ответ ​

СценарийvCPURAMДискПримечание
Демо / пилот, до 25 пользователей48 ГБ100 ГБ SSDAI — через внешний API
200 пользователей, внешняя LLM8–1632 ГБ1 ТБ NVMeрекомендуемый старт
200 пользователей, локальный AI на CPU1632–48 ГБ1 ТБ NVMeслужебные модели 0.3–3B
200 пользователей, локальная LLM 7–14B8–16 (app) + 8 (AI)32 ГБ + 64 ГБ1 ТБ + 500 ГБGPU 16–24 ГБ VRAM
500–1000 пользователей32+ (app)128 ГБ4 ТБ NVMeпроектный, см. reference-architecture

Самый тяжёлый компонент — не сервисы, а локальная модель (если AI работает в контуре) и данные (Postgres + pgvector + MinIO). Приложение без инференса укладывается в 1.5 ГБ RAM.

Что измерено, а что посчитано ​

ТипОткуда
Измереноdev-стенд, TAG 0.5.9, Apple Silicon (arm64), простой (idle). Снято через docker stats, pm2 jlist, pg_database_size: значения помечены в таблицах
Посчитаноформулы и примеры под 200 пользователей — экстраполяция измеренного baseline с запасом
Оценкапропускная способность моделей на CPU/GPU, требования VRAM по размеру модели

На x86_64 Linux абсолютные значения отличаются на десятки процентов, а поведение под нагрузкой — сильнее: пики дают парсинг документов, индексация RAG, пайплайны Flow Manager и распознавание речи.

Из чего складывается потребление ​

  1. Приложение — 25 Go-сервисов + 8 раннеров Command Manager.
  2. Инфраструктура — PostgreSQL 16 (pgvector), NATS, MinIO, Centrifugo, SearXNG.
  3. AI-инференс — Ollama (планировщик, заполнение, диаграммы, эмбеддинги), llama.cpp-сайдкар decision-модели, Voice (TTS/STT).
  4. Данные — БД сервисов, векторный индекс RAG, файлы в MinIO, образы, модели, логи и бэкапы.

Измеренный baseline ​

КомпонентИзмереноКомментарий
25 Go-сервисов, простой278 МБ суммарнобольше всех flow-manager — 69 МБ; далее proxy-manager 26, command-manager 24, gateway 17, ai-router 13; остальные 4–12 МБ
8 раннеров, простой47 МБ суммарно~6 МБ каждый (shell, code, sql, docker, ollama, docx, pdf, xlsx)
PostgreSQL (Docker, простой)59 МБбез учёта shared_buffers и рабочих процессов
NATS / MinIO / Centrifugo16 / 34 / 15 МБNATS с JetStream
SearXNG2.5 МБрастёт кэш на диске
UI-контейнеры (4 шт.)~5 МБnginx со статикой, CPU почти не потребляет
Образ Go-сервиса12–21 МБcontent-extract 12 МБ, ai-router 21 МБ
Образ voice56 МБCGO + sherpa-onnx
Образ ollama7 ГБCUDA/ROCm-рантайм в базовом образе
Прод-набор моделей~1.8 ГБlittlelamb-planner/fill/diagram по 303 МБ + bosun-v3.1-0.6b 610 МБ измерены локально; nomic-embed-text ~274 МБ — размер из реестра Ollama, локально не измерялся
Модель локального чата 3B1.8 ГБqwen-3b-instruct (dev-набор)
llama.cpp-сайдкар decision5.8 ГиБ RSS, до 150% CPUснимок под нагрузкой dev-стенда; включает KV-кэш под большой ctx, веса модели — только 610 МБ
БД после миграций7.5–8.1 МБ на сервис~160 МБ на ~21 базу

Ключевой вывод

Все 34 сервиса прод-стека в простое — это меньше 1 ГБ RAM и ~0.5 ГБ образов (без ollama). Sizing определяют Postgres, объём данных и режим AI.

Профили установки ​

Платформа ставится выборочно: каталог services.yaml делит сервисы на направления core, business, automate (ush platform install, ush platform enable/disable <service>). Чем меньше направлений — тем меньше железо.

ПрофильНаправленияСервисовvCPURAMДискПользователи
Ядроcore924–8 ГБ60 ГБдо 20, без AI
Командаcore + business19412 ГБ160 ГБдо 50
Полныйвсё34 (prod)8–1624–32 ГБ1 ТБ150–300

Состав направлений:

  • core — postgres, nats, minio, minio-init, centrifugo, gateway, auth, spaces, client.
  • business — task-tracker, documents, notifications, storage, data-tables, spark-grid, messaging, collatio, concierge, concierge_web.
  • automate — ollama, ai-router, mcp-gateway, flow-manager, command-manager, scheduler, env-manager, searxng, nats-bridge, guard, notebooks, content-extract, proxy-manager, voice.

Дополнительно к сервисам в стеке живут одноразовые *-migrate-контейнеры (20 штук, завершаются сразу) и, в dev-стенде devops/dev, Prometheus с экспортёрами. В прод-compose мониторинг не разворачивается.

Расчёт под 200 пользователей ​

Допущения примера:

  • 200 учётных записей, 40–60 одновременно в пиковые часы;
  • 20–40 AI-ходов на активного пользователя в день → 2 000–8 000 ходов в сутки;
  • ~500 документов на пользователя → ~100 000 страниц, проиндексированных в RAG;
  • ~2 ГБ файлов на пользователя (вложения, медиа) → ~400 ГБ;
  • горизонт планирования — 1 год с запасом на рост.

RAM ​

СтатьяРасчётИтого
Go-сервисы25 × 64 МБ (резерв на пики поверх измеренных 278 МБ)1.6 ГБ
Раннеры8 × 32 МБ0.25 ГБ
PostgreSQLshared_buffers 2–4 ГБ + рабочие процессы6–8 ГБ
MinIO + NATS + Centrifugo + SearXNGпо измерениям с запасом1.5 ГБ
ОС, Docker, nginx-контейнеры—2.5 ГБ
Резерв на пики и фрагментацию~30%4 ГБ

Итог: 16–20 ГБ минимум, рекомендуется 32 ГБ. Пики дают парсинг офисных файлов (content-extract), индексация RAG, сборка пайплайнов и Voice.

Формула:

RAM ≈ 2 ГБ (сервисы и раннеры)
    + RAM(PostgreSQL)          # shared_buffers ≈ 25% RAM узла, но не больше 8–16 ГБ
    + 1.5 ГБ (MinIO, NATS, Centrifugo, SearXNG)
    + RAM(инференс)            # 0 без локальных моделей
    + 25–30% резерв

Локальный инференс добавляет:

РежимДополнительно RAMCPU
Служебные модели (0.3B ×3 + 0.6B + эмбеддинги)4–8 ГБ+4 vCPU
Локальный чат 3B8–16 ГБ+8 vCPU
GPU-узел инференса 7–14B64 ГБ на узле8 vCPU + GPU

CPU ​

Измеренный простой — почти 0%. CPU нужен на всплески и на инференс:

НагрузкаЧто требует
Postgres4 vCPU рабочий минимум, 8 — комфортно
content-extractпарсинг PDF/DOCX/XLSX — CPU-bound, 2–4 vCPU на параллельные загрузки
Индексация RAGэмбеддинги + rerank, 2–4 vCPU
Flow Manager / Command Managerсборки и раннеры внутри sandbox, пиково 2–4 vCPU
Voice (STT/TTS)sherpa-onnx: 2–4 vCPU, для STT заметно больше
Локальная LLM на CPU8+ vCPU: 3B даёт ориентировочно 10–25 ток/с на поток (оценка)

Итог для 200 пользователей: 8 vCPU минимум, 16 vCPU рекомендуется.

Диск ​

Формулы:

Диск_Postgres ≈ 160 МБ (базовые схемы)
              + 0.2–0.4 ГБ на пользователя в год   # данные, чаты, аудит
              + 15 МБ на 1000 страниц RAG          # pgvector + FTS

Диск_MinIO    ≈ 1.1 × объём загруженных файлов
Диск_модели   ≈ 2 ГБ (служебный набор) / 6–10 ГБ (локальный чат 7–14B)
Диск_образы   ≈ 0.5 ГБ (Go) + 7 ГБ (образ ollama) + 0.1 ГБ (voice)
Диск_логи     ≈ 20–40 ГБ в год с ротацией
Диск_бэкап    ≈ 1.5–2 × (Диск_Postgres + Диск_MinIO)

Пример под 200 пользователей, год 1:

СтатьяОбъём
Postgres (данные + аудит + чаты)40–80 ГБ
Векторный индекс RAG (100 000 страниц)~2 ГБ
MinIO (400 ГБ файлов + метаданные, превью)~440 ГБ
Образы и модели~10 ГБ (без CUDA-образа ollama), ~17 ГБ с ним
Логи и метрики20–40 ГБ
Свободный запас 25–30%~150 ГБ
Итого~700 ГБ → 1 ТБ NVMe

Локальные бэкапы на том же узле удваивают требование → берите 2 ТБ или выносите копии на отдельный узел/NAS.

Сеть ​

ПараметрЗначение
Внешний канал100 Мбит/с достаточно для 200 пользователей
AI-стриминг50 одновременных чатов ≈ 20–50 Мбит/с
Внутренний трафиксервисы общаются по docker-сети; NATS-события и WebSocket
Задержкаgateway → сервис локально < 1 мс; основная задержка — провайдер LLM

pgvector: сколько места съедает RAG ​

  • vector(1536) — 6 КБ на вектор, vector(768) — 3 КБ (float32).
  • HNSW-индекс добавляет примерно +50–100% к объёму векторов.
  • Одна страница даёт ~1.2–1.5 чанка; чанк ≈ 800 токенов.
  • Полнотекстовый индекс (tsvector) добавляет +30–50% к объёму текста.
КорпусВекторыМесто (векторы + индекс)
1 000 страниц~1 500 чанков12–18 МБ
10 000 страниц~15 000 чанков120–180 МБ
100 000 страниц~150 000 чанков1.2–1.8 ГБ

RAG редко бывает причиной нехватки диска — основной объём дают файлы и история чатов.

Локальный AI-инференс: режимы и железо ​

РежимЖелезоЧто даётКогда выбирать
Внешний API (OpenAI-совместимый)без GPUлучшее качество и латентность, ноль затрат на своё железопилот, демо, если политика допускает egress
Локальные служебные модели8–16 vCPU, 4–8 ГБ RAM, 2 ГБ дискапланировщик хода, заполнение, диаграммы, decision-гейты, эмбеддингизакрытый контур: AI нужен, но чат-модель не обязательна локально
Локальный чат на CPU (3B)+8 vCPU, 8–16 ГБ RAMчат и RAG без внешних вызовов, умеренная скоростьнебольшие команды, жёсткий air-gap
Локальный чат на GPU (7–14B)GPU 16–24 ГБ VRAM, 16 vCPU, 64 ГБ RAMосновной сценарий чата и RAG в контурепродуктив 200+ пользователей в закрытом контуре
ГибридCPU-сайдкары + GPU-чат + внешний API для тяжёлых задачоптимум по стоимости и качествутиповая схема для крупных внедрений

Ориентиры по VRAM (оценка, зависит от квантизации и ctx):

МодельВеса (Q4/Q8)+ KV-кэшVRAM с запасом
0.6B (decision, Q8)0.6 ГБ0.5–2 ГБCPU, GPU не нужна
3B1.8–3 ГБ1–2 ГБ6–8 ГБ (если GPU)
7B4.5–5 ГБ1–2 ГБ8–12 ГБ
14B9–10 ГБ2–4 ГБ16–24 ГБ

При 2–4 параллельных потоках VRAM растёт в 1.5–2 раза либо нужен батчинг (vLLM/TGI). Для 200 пользователей одна GPU 24 ГБ закрывает чат при последовательной обработке; при 40+ одновременных чатов планируйте вторую.

Бэкап: сколько места и где ​

ЧтоКакОбъём
Postgrespg_dump/pg_dumpall (в сжатом виде 30–50% от БД)20–40 ГБ на 200 пользователей
MinIOкопия тома/бакетаравен объёму файлов
Модели и образыперекачиваются, бэкапить не нужно—
Конфиги.env, docker-compose.yaml, services.yaml, каталог llm-decision/modelsмегабайты

Автоматического бэкапа в платформе пока нет: есть только ручной порядок переноса сервера (devops/prod/SERVER_MIGRATION.md) и нет pre-migration snapshot — см. раздел ограничений ниже. Планируйте минимум ежедневный дамп + недельное хранение, целевой узел — вне app-узла.

Ограничения платформы, влияющие на sizing ​

ОграничениеСледствие для железа
В compose нет лимитов ресурсов (mem_limit/cpus/deploy.resources не заданы ни для одного сервиса)один сервис при утечке или пике может выесть всю RAM узла; лимиты стоит добавить override-файлом
Один PostgreSQL на все БД, без реплик и PITRмасштабируется только вертикально; бэкап — дампами
Нет HA и автоскейла, общий TAG на все сервисы200+ пользователей = один узел; отказоустойчивость проектируется отдельно
Flow Manager пишет sandbox и артефакты на локальный диск узлагоризонтальное масштабирование app-узлов требует общей ФС
guard-ner не входит в прод-composeNER-классификация DLP при включении добавит RAM и CPU
Мониторинг (Prometheus + экспортёры) только в devops/devдля прода закладывайте отдельный узел наблюдаемости

Пример ограничения ресурсов через override-файл рядом с docker-compose.yaml:

yaml
# docker-compose.override.yaml
services:
  postgres:
    deploy:
      resources:
        limits: { cpus: "4", memory: 8g }
  ai-router:
    deploy:
      resources:
        limits: { cpus: "2", memory: 1g }
  flow-manager:
    deploy:
      resources:
        limits: { cpus: "4", memory: 2g }
  content-extract:
    deploy:
      resources:
        limits: { cpus: "4", memory: 1g }
  ollama:
    deploy:
      resources:
        limits: { cpus: "8", memory: 16g }

Как измерить на своём стенде ​

bash
# Потребление контейнеров (снимок)
docker stats --no-stream --format '{{.Name}}\t{{.MemUsage}}\t{{.CPUPerc}}'

# Состав стека и статусы
docker compose ps
ush platform ps

# Размеры баз по сервисам
docker compose exec postgres psql -U "$DB_USER" -d postgres -c \
  "SELECT datname, pg_size_pretty(pg_database_size(datname)) AS size
     FROM pg_database ORDER BY pg_database_size(datname) DESC;"

# Размер векторного индекса RAG
docker compose exec postgres psql -U "$DB_USER" -d ai_router_db -c \
  "SELECT pg_size_pretty(pg_total_relation_size('document_chunks'));"

# Тома и образы
docker system df -v | head -40

# Локальный PM2-стенд
pm2 jlist | jq '.[] | {name, mem: .monit.memory, cpu: .monit.cpu}'

Снимайте два профиля: простой и пиковый (загрузка документов, индексация, несколько параллельных чатов). Sizing строится по пику, а не по простою.

Дальше ​