Наша разработка · Образ ВМ · Без интернета · Версия 0.1.0-rc1
Сотрудник спрашивает в чате своими словами, что у него просрочено или кто согласует договор по регламенту. Помощник читает задания и документы в RX с правами этого сотрудника и отвечает. Модель, чат и вход собраны в один образ ВМ, который ставится на ваш гипервизор и работает без интернета.
https://<адрес>:8443/admin и пароль, созданный при первом запускеivanova, petrov, orlovСнаружи виден один nginx. За ним чат, вход, модель и связка с RX, все во внутренней сети контейнеров на этой же ВМ.
| Откуда | Куда | Что происходит |
|---|---|---|
| Браузер | nginx, порт 8443 | TLS 1.2/1.3, единственная точка входа |
nginx /auth/ | Keycloak | Вход сотрудника, проверка роли rx-assistant |
nginx / | LibreChat | Чат и история бесед |
| LibreChat | llama-server | Модель Qwen3 на процессоре |
| LibreChat | rxmcp | Вызов инструментов RX с токеном сотрудника |
| rxmcp | Сервис интеграции RX | Тот же токен, данные с правами сотрудника |
| Мониторинг | nginx, порт 9180 | Метрики модели по ключу |
Сотрудник входит в чат через Keycloak. Его токен доходит через rxmcp до сервиса интеграции RX, и RX отдаёт ровно то, что этому сотруднику положено по правам. Общей служебной учётки, через которую помощник мог бы прочитать чужое, нет.
rxmcp в коробке открывает модели инструменты чтения: задания, задачи, документы и их текст, сотрудники, проекты, справка RX. Выполнить задание, согласовать или подписать документ помощник не может.
rxmcp записывает, кто вызвал какой инструмент, с какими параметрами (имена без значений), успешно ли и за сколько.
Сразу после установки помощник работает на выдуманной компании ООО «Северный ветер»: у каждого демо-пользователя свои задания и документы. Так помощника можно показать до того, как подключён ваш 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.1 | 31 инструмент чтения RX |
| demo-rx | Выдуманная компания для показа и проверки моделей |
| Формат | Куда |
|---|---|
| OVA | VMware vSphere, ESXi, Workstation, VirtualBox |
| qcow2 | KVM/libvirt, Proxmox, OpenStack, zVirt, РЕД Виртуализация, Брест, VK Cloud, Yandex Cloud |
| VHDX | Hyper-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 8B | Qwen3 30B-A3B | |
|---|---|---|
| vCPU | 8 (на 4 ответы вдвое дольше) | 16 |
| Память | 16 ГБ | 32 ГБ |
| Системный диск | 40 ГБ, тонкий, занято ~8 ГБ | 40 ГБ |
| Диск данных | 50 ГБ | 80 ГБ |
| Самый первый вопрос после импорта модели | 3–4 мин | ~4 мин |
| Первый вопрос после перезагрузки ВМ, вместе со входом | 27–42 с | не замеряли |
| Следующие вопросы, с вызовом инструментов RX | 30–60 с | 40–70 с |
| Верных ответов на проверке drxeval | 40 из 42 | 42 из 42 |
Замер на 16 vCPU Xeon Cascade Lake: модель читает запрос со скоростью 45–60 токенов в секунду, а пишет ответ со скоростью 3–4 токена в секунду. Каждый запрос начинается с одинакового для всех префикса: системный промпт и описания 31 инструмента, около 9,5 тыс. токенов. Целиком он читается один раз после импорта модели, дальше берётся из кеша.
Кеш префикса сохраняется на диск данных раз в 30 минут и поднимается при каждом старте сервера модели. После перезагрузки, смены настроек или отката модели первый вопрос не ждёт три-четыре минуты: на Qwen3 8B после перезагрузки ВМ помощник готов примерно через минуту, а первый ответ приходит за 27–42 секунды вместе со входом в чат.
Сервер модели отвечает на один вопрос за раз (parallel = 1). Второй параллельный слот на процессоре перечитывал бы префикс заново, и каждый ответ стал бы дольше. Поэтому вопросы сотрудников ждут в очереди, каждый 30–70 секунд. Сколько сотрудников выдержит конкретный сервер, можно прикинуть в калькуляторе железа под ИИ.
Развернули образ, подключили второй диск под данные, включили. Через 2–5 минут на экране консоли адрес чата и пароли.
Адрес берётся по DHCP. Если DHCP нет, на экране будет «Сети нет»: войдите в консоль и задайте адрес, шлюз, DNS и NTP командой sudo drxai-net. Установка продолжится сама. Синхронизация времени обязательна: без неё Keycloak и RX расходятся в сроке действия токенов, и вход ломается.
ВМ размечает пустой диск данных, загружает образы контейнеров из комплекта, создаёт пароли, свой центр сертификации и сертификат на свой адрес, заводит realm в Keycloak. В образе паролей нет, все создаются на этом шаге.
На экране консоли до входа появляются адрес чата, пароль администратора Keycloak и демо-пользователи. То же печатает sudo drxai info. Центр сертификации ВМ скачивается по адресу https://<адрес>:8443/ca.crt, его добавляют в доверенные на рабочих местах. Можно положить и свой сертификат.
Файл весов приносят на ВМ и импортируют одной командой (раздел ниже). Пока модели нет, чат открывается, но не отвечает.
Войдите как ivanova, petrov или orlov с паролем demo и спросите «Что у меня просрочено?» или «Сколько дней в неделю можно работать удалённо?». Пользователя smirnova без роли rx-assistant чат не пустит: так видно, что проверка роли работает.
SSH только по ключам. Ключ кладут с консоли или передают через cloud-init, если платформа это умеет (OpenStack, VK Cloud, Yandex Cloud). Настройки можно задать заранее файлом /etc/drxai/drxai.conf, тогда консоль не понадобится.
Веса модели в образ не входят. Модель поставляется как артефакт с версией, и её смена проходит те же шаги, что обновление базового образа: сменить, проверить, выкатить.
| Модель | Файл весов | Лицензия |
|---|---|---|
| Qwen3 8B, Q4_K_M | 5,0 ГБ | Apache-2.0 |
| Qwen3 30B-A3B Instruct 2507, Q4_K_M | 18,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 только по ключам.
Своей регистрации и паролей у чата нет. Без роли 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 ничего не ставится: сервис интеграции должен принимать токены 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, помощник работает через него: 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, его можно прочитать и проверить до пилота.