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. Приложение — 23 Go-сервиса prod-направлений (на измеренном dev-стенде — 25) + 9 раннеров Command Manager (shell, code, sql, docker, agent, ollama, docx, pdf, xlsx).
  2. Инфраструктура — PostgreSQL 16 (pgvector), NATS, MinIO, Centrifugo, SearXNG.
  3. AI — провайдер вне стека (внешний API или свой сервер моделей) и Voice (TTS/STT).
  4. Данные — БД сервисов, векторный индекс RAG, файлы в MinIO, образы, модели, логи и бэкапы.

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

КомпонентИзмереноКомментарий
Go-сервисы dev-стенда (25), простой278 МБ суммарнобольше всех flow-manager — 69 МБ; далее proxy-manager 26, command-manager 24, gateway 17, ai-router 13; остальные 4–12 МБ
9 раннеров, простой47 МБ суммарно~6 МБ каждый (shell, code, sql, docker, agent, 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
БД после миграций7.5–8.1 МБ на сервис~160 МБ на ~21 базу

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

Сервисы прод-стека в простое — меньше 1 ГБ RAM и около 0.5 ГБ образов. Отдельного образа инференса в стеке нет. Sizing определяют Postgres, объём данных и то, где запущен провайдер LLM.

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

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

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

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

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

Дополнительно к сервисам в стеке живут одноразовые *-migrate-контейнеры (19 штук, завершаются сразу) и, в 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-сервисы23 × 64 МБ (резерв на пики поверх измеренных 278 МБ)1.5 ГБ
Раннеры9 × 32 МБ0.3 ГБ
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 × объём загруженных файлов
Диск_модели   ≈ 0 на app-узле; на своём AI-узле 2 ГБ (служебный набор) / 6–10 ГБ (чат 7–14B)
Диск_образы   ≈ 0.5 ГБ (Go) + 0.1 ГБ (voice)
Диск_логи     ≈ 20–40 ГБ в год с ротацией
Диск_бэкап    ≈ 1.5–2 × (Диск_Postgres + Диск_MinIO)

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

СтатьяОбъём
Postgres (данные + аудит + чаты)40–80 ГБ
Векторный индекс RAG (100 000 страниц)~2 ГБ
MinIO (400 ГБ файлов + метаданные, превью)~440 ГБ
Образы стека~0.5 ГБ Go-сервисов + voice. Веса моделей в стек не входят
Логи и метрики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мегабайты

Автоматического бэкапа в платформе пока нет: есть только ручной порядок переноса сервера (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 }

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

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 строится по пику, а не по простою.

Дальше ​