DRX AI OPS Обсудить задачу

Наша разработка · Образ ВМ · Без интернета · Версия 0.1.0-rc1

ИИ-помощник для Directum RX в одной виртуальной машине

Сотрудник спрашивает в чате своими словами, что у него просрочено или кто согласует договор по регламенту. Помощник читает задания и документы в RX с правами этого сотрудника и отвечает. Модель, чат и вход собраны в один образ ВМ, который ставится на ваш гипервизор и работает без интернета.

Экран консоли через 2–5 минут после включения
Чат: https://<адрес>:8443/
Keycloak: admin и пароль, созданный при первом запуске
Демо-пользователи: ivanova, petrov, orlov
Что у меня просрочено?

Как устроено

Снаружи виден один nginx. За ним чат, вход, модель и связка с RX, все во внутренней сети контейнеров на этой же ВМ.

ОткудаКудаЧто происходит
Браузерnginx, порт 8443TLS 1.2/1.3, единственная точка входа
nginx /auth/KeycloakВход сотрудника, проверка роли rx-assistant
nginx /LibreChatЧат и история бесед
LibreChatllama-serverМодель Qwen3 на процессоре
LibreChatrxmcpВызов инструментов RX с токеном сотрудника
rxmcpСервис интеграции RXТот же токен, данные с правами сотрудника
Мониторингnginx, порт 9180Метрики модели по ключу

Помощник видит то же, что сотрудник

Сотрудник входит в чат через Keycloak. Его токен доходит через rxmcp до сервиса интеграции RX, и RX отдаёт ровно то, что этому сотруднику положено по правам. Общей служебной учётки, через которую помощник мог бы прочитать чужое, нет.

Только чтение

rxmcp в коробке открывает модели инструменты чтения: задания, задачи, документы и их текст, сотрудники, проекты, справка RX. Выполнить задание, согласовать или подписать документ помощник не может.

Журнал обращений

rxmcp записывает, кто вызвал какой инструмент, с какими параметрами (имена без значений), успешно ли и за сколько.

Демо без настоящего RX

Сразу после установки помощник работает на выдуманной компании ООО «Северный ветер»: у каждого демо-пользователя свои задания и документы. Так помощника можно показать до того, как подключён ваш RX. Когда задан адрес вашего RX, демо-учётки выключаются сами.

Что в коробке

Debian 13 со стандартным ядром и контейнеры нашей сборки. Драйверы virtio, VMware и Hyper-V уже в ядре, загрузка из BIOS и из UEFI.

КомпонентЗачем
nginx 1.31.7Вход снаружи, TLS, раздача по путям
LibreChat 0.8.8Чат. Собран из исходников с обновлёнными зависимостями
llama-server (llama.cpp)Сервер модели на процессоре, API в формате OpenAI
Keycloak 26.8.2 и PostgreSQLВход и роли. Пользователи и настройки хранятся в PostgreSQL внутри ВМ
MongoDB 8.0.34История чатов, доступ по паролю
rxmcp 0.18.131 инструмент чтения RX
demo-rxВыдуманная компания для показа и проверки моделей
ФорматКуда
OVAVMware vSphere, ESXi, Workstation, VirtualBox
qcow2KVM/libvirt, Proxmox, OpenStack, zVirt, РЕД Виртуализация, Брест, VK Cloud, Yandex Cloud
VHDXHyper-V, поколение 1 или 2 (для второго выключить Secure Boot или выбрать шаблон «Microsoft UEFI CA»)

Все три формата получены из одной сборки, содержимое одинаковое. Для другого гипервизора qcow2 конвертируется через qemu-img convert в raw, vmdk, vdi или vpc. Целостность проверяется по файлу SHA256SUMS.

Ресурсы и скорость

Модель считает на процессоре, видеокарта не нужна. Нужен x86-64 с AVX2, это серверы примерно с 2013 года. AVX-512 и AMX подхватываются сами, если есть.

Qwen3 8BQwen3 30B-A3B
vCPU8 (на 4 ответы вдвое дольше)16
Память16 ГБ32 ГБ
Системный диск40 ГБ, тонкий, занято ~8 ГБ40 ГБ
Диск данных50 ГБ80 ГБ
Самый первый вопрос после импорта модели3–4 мин~4 мин
Первый вопрос после перезагрузки ВМ, вместе со входом27–42 сне замеряли
Следующие вопросы, с вызовом инструментов RX30–60 с40–70 с
Верных ответов на проверке drxeval40 из 4242 из 42

Откуда эти минуты и секунды

Замер на 16 vCPU Xeon Cascade Lake: модель читает запрос со скоростью 45–60 токенов в секунду, а пишет ответ со скоростью 3–4 токена в секунду. Каждый запрос начинается с одинакового для всех префикса: системный промпт и описания 31 инструмента, около 9,5 тыс. токенов. Целиком он читается один раз после импорта модели, дальше берётся из кеша.

Кеш переживает перезагрузку

Кеш префикса сохраняется на диск данных раз в 30 минут и поднимается при каждом старте сервера модели. После перезагрузки, смены настроек или отката модели первый вопрос не ждёт три-четыре минуты: на Qwen3 8B после перезагрузки ВМ помощник готов примерно через минуту, а первый ответ приходит за 27–42 секунды вместе со входом в чат.

Вопросы встают в очередь

Сервер модели отвечает на один вопрос за раз (parallel = 1). Второй параллельный слот на процессоре перечитывал бы префикс заново, и каждый ответ стал бы дольше. Поэтому вопросы сотрудников ждут в очереди, каждый 30–70 секунд. Сколько сотрудников выдержит конкретный сервер, можно прикинуть в калькуляторе железа под ИИ.

Первый запуск

Развернули образ, подключили второй диск под данные, включили. Через 2–5 минут на экране консоли адрес чата и пароли.

  1. Сеть

    Адрес берётся по DHCP. Если DHCP нет, на экране будет «Сети нет»: войдите в консоль и задайте адрес, шлюз, DNS и NTP командой sudo drxai-net. Установка продолжится сама. Синхронизация времени обязательна: без неё Keycloak и RX расходятся в сроке действия токенов, и вход ломается.

  2. Установка без участия

    ВМ размечает пустой диск данных, загружает образы контейнеров из комплекта, создаёт пароли, свой центр сертификации и сертификат на свой адрес, заводит realm в Keycloak. В образе паролей нет, все создаются на этом шаге.

  3. Адрес и пароли

    На экране консоли до входа появляются адрес чата, пароль администратора Keycloak и демо-пользователи. То же печатает sudo drxai info. Центр сертификации ВМ скачивается по адресу https://<адрес>:8443/ca.crt, его добавляют в доверенные на рабочих местах. Можно положить и свой сертификат.

  4. Модель

    Файл весов приносят на ВМ и импортируют одной командой (раздел ниже). Пока модели нет, чат открывается, но не отвечает.

  5. Проверка на демо

    Войдите как ivanova, petrov или orlov с паролем demo и спросите «Что у меня просрочено?» или «Сколько дней в неделю можно работать удалённо?». Пользователя smirnova без роли rx-assistant чат не пустит: так видно, что проверка роли работает.

SSH только по ключам. Ключ кладут с консоли или передают через cloud-init, если платформа это умеет (OpenStack, VK Cloud, Yandex Cloud). Настройки можно задать заранее файлом /etc/drxai/drxai.conf, тогда консоль не понадобится.

Модель отдельно от образа

Веса модели в образ не входят. Модель поставляется как артефакт с версией, и её смена проходит те же шаги, что обновление базового образа: сменить, проверить, выкатить.

МодельФайл весовЛицензия
Qwen3 8B, Q4_K_M5,0 ГБApache-2.0
Qwen3 30B-A3B Instruct 2507, Q4_K_M18,6 ГБApache-2.0
sudo drxai model import /var/lib/drxai/Qwen3-8B-Q4_K_M.gguf /var/lib/drxai/app/models/qwen3-8b-q4km.toml --move
sudo drxai model eval        # проверка drxeval на демо-данных: 14 сценариев по 3 раза
sudo drxai model use qwen3-30b-a3b-2507-q4km
sudo drxai model rollback    # вернуть прежнюю

Манифест фиксирует всё, что влияет на ответы

Файл весов и его sha256, квантизацию, шаблон чата, параметры сервера модели, системный промпт и набор инструментов rxmcp. Любая правка манифеста считается новой версией.

Подменённый файл не включится

import сверяет размер, sha256 весов, шаблон чата и промпт с манифестом и при расхождении отказывает. Файл весов переносят на ВМ любым способом: scp, общий каталог, флешка.

Проверка перед выкаткой

drxai model eval гоняет сценарии drxeval на выдуманных данных и сравнивает долю верных ответов с прошлым прогоном. Проверка идёт напрямую к серверу модели, без чата, поэтому её результат близок к поведению в чате, но с ним не совпадает.

Откат одной командой

Включена всегда одна модель, остальные лежат на диске данных. rollback возвращает предыдущую. Свою модель или квантизацию подключают своим манифестом по образцу комплектных.

Безопасность

Все образы контейнеров собраны нами и проверены trivy. На дату сборки по всем образам 0 уязвимостей уровня CRITICAL и 0 уровня HIGH. Отчёт лежит в комплекте (SECURITY.txt).

Наружу два порта

8443 для чата и входа сотрудников и 9180 для метрик по ключу. Консоль администратора Keycloak на том же 8443 открыта только с адресов из списка, по умолчанию с самой ВМ и её подсети. API модели наружу по умолчанию выключен и включается тоже списком адресов. Сервер модели, rxmcp, базы и Keycloak во внутренней сети контейнеров. SSH только по ключам.

Вход только через Keycloak

Своей регистрации и паролей у чата нет. Без роли rx-assistant не пускают ни чат, ни rxmcp. Подпись, издателя, аудиторию, срок и роль токена проверяет rxmcp, прежде чем передать токен в RX. Keycloak ведёт журнал входов и действий администраторов (90 дней) и блокирует учётку после 10 неверных паролей подряд.

Чат без выхода наружу

В чате отключены внешние провайдеры моделей, поиск в интернете, выполнение кода и подключение своих MCP-серверов. Общих ссылок на беседы нет: беседу с данными RX видит только её автор. Политика CSP не даёт странице чата загрузить картинку или отправить запрос на чужой адрес.

Контейнеры с урезанными правами

Контейнеры работают не от root (кроме MongoDB, она работает от своего пользователя) и с no-new-privileges, у большинства файловая система только на чтение. Образы сервера модели, rxmcp и demo-rx собраны без ОС.

Готовые образы мы пересобрали

В официальных образах на дату сборки были известные уязвимости: в чате 4 CRITICAL и 47 HIGH, в MongoDB 1 CRITICAL и 30 HIGH, в nginx 1 CRITICAL и 5 HIGH. Мы подняли зависимости, убрали лишние утилиты и проверили, что после этого всё работает.

Ноль уязвимостей действует на дату сборки. Базы trivy обновляются каждый день, и то, что найдут после выпуска, закрывается пересборкой комплекта и обновлением ВМ.

Подключение к вашему RX

На серверы RX ничего не ставится: сервис интеграции должен принимать токены Keycloak помощника. Эту настройку инженер внедрения делает вместе с администратором RX.

sudo drxai configure --rx-url https://rx.company.ru/Integration --demo off
sudo drxai configure --rx-ca /root/company-ca.crt    # центр сертификации, которым подписан RX
sudo drxai rx-trust                                  # что указать в сервисе интеграции

Что настроить в сервисе интеграции

Включить вход по токену (Bearer), добавить к уже настроенным издателя (адрес realm Keycloak помощника) и аудиторию rxmcp, указать сертификат подписи токенов. Все значения и файл сертификата печатает drxai rx-trust. Если в RX несколько арендаторов, нужный задаётся параметром --tenant.

Сотрудники

Логин в Keycloak должен совпадать с логином в RX. Сотрудников заводят во встроенном Keycloak или подключают каталог: LDAP, Active Directory, Kerberos.

Keycloak организации

Если в компании уже есть Keycloak, помощник работает через него: drxai configure --keycloak external и клиент чата в вашем realm с ролью rx-assistant и аудиторией rxmcp.

Метрики в мониторинг

Скорость ответа, очередь, занятые слоты и контекст модели отдаются на порту 9180. В drxmon их подключает одна команда configure-ai.

Резервная копия и обновление

Всё накопленное хранится на диске данных, система на системном диске. Поэтому новую версию можно поставить, не теряя ни пользователей, ни историю чатов.

sudo drxai backup                  # настройки, пароли, база Keycloak, история чатов
sudo drxai restore <архив>         # на этой же или на новой ВМ

Копия каждую ночь

Таймер снимает копию около 03:20 и хранит последние семь, вручную копию делает drxai backup. Копии лежат на диске данных, их нужно уносить с ВМ. Веса модели в копию не входят: файл большой и его проще импортировать заново с той же проверкой sha256.

Новая ВМ на старом диске данных

Разворачивают новую версию образа, подключают к ней диск данных от старой ВМ, старую удаляют. Пароли, настройки, пользователи, история чатов и модели остаются.

Комплект поверх

Тот же результат без замены ВМ: распаковать новый комплект в /opt/drxai-bundle и перезапустить установку.

Если диск данных пропал

Когда диск данных был, а после перезагрузки не подключился, помощник не запускается и на экране консоли пишет, что подключить. Без этой проверки он начал бы с пустыми настройками.

Как получить

Сейчас это выпуск-кандидат 0.1.0-rc1, проверенный в облаке на KVM. Ставим в пилоте с нашими клиентами: разворачиваем, подключаем к вашему RX и остаёмся на связи.

Готовая виртуальная машина

OVA для VMware и VirtualBox, qcow2 для KVM, Proxmox, zVirt, Бреста, OpenStack и облаков, VHDX для Hyper-V. Веса моделей передаются отдельно с контрольными суммами. Образ передаём по запросу.

Сначала посмотреть

Как помощник отвечает на вопросы сотрудников выдуманной компании, видно в записях прогонов: каждый запрос в RX там можно раскрыть. Связка с RX построена на открытом rxmcp, его можно прочитать и проверить до пилота.