Установка Unica

Инфраструктурные компоненты готовы. Теперь устанавливаются сервисы продукта Unica. Каждый самостоятельный сервис вынесен в отдельный раздел; общими остаются только подготовительные действия, которые используются несколькими компонентами.

На этой странице

4.1. Имена Helm-релизов

В командах ниже используются фиксированные имена Helm-релизов. В используемых пакетах имя релиза участвует в формировании DNS-имени Kubernetes Service, поэтому менять эти имена без одновременного изменения конфигурации зависимых сервисов не следует.

files-api
datamanagement-api
embedding-api
llm-api
imagelab
diarization-api
recognition-api
speechrecognition-api
unica
unica-agent
unica-workflow
unica-ops

Параметры, которые не указаны в командах установки явно, берутся из values соответствующей версии Helm-пакета. Перед изменением таких параметров следует посмотреть значения текущей версии пакета и переопределять только те настройки, которые действительно нужны для стенда.

Важно: после установки каждого прикладного сервиса дождитесь, пока его Pod-ы перейдут в состояние Running/Ready. Только после этого переходите к следующему сервису.

4.2. Files API

Files API предоставляет прикладным сервисам доступ к файлам в MinIO. Для подключения сервису передаются адрес MinIO и учётные данные объектного хранилища.

Передача учётных данных MinIO в Files API

Files API работает в пространстве имён unica-app, а Secret MinIO создан в unica-storage. Kubernetes Secret доступен только внутри своего пространства имён, поэтому для Files API создаётся Secret minio в unica-app с теми же учётными данными.

MINIO_ACCESS_KEY="$(kubectl -n unica-storage get secret minio -o jsonpath='{.data.MINIO_ROOT_USER}' | base64 -d)"
MINIO_SECRET_KEY="$(kubectl -n unica-storage get secret minio -o jsonpath='{.data.MINIO_ROOT_PASSWORD}' | base64 -d)"

kubectl -n unica-app create secret generic minio \
  --from-literal=MINIO_ROOT_USER="${MINIO_ACCESS_KEY}" \
  --from-literal=MINIO_ROOT_PASSWORD="${MINIO_SECRET_KEY}" \
  --dry-run=client -o yaml | kubectl apply -f -

Параметры --dry-run=client -o yaml | kubectl apply -f - позволяют одной и той же командой как создать Secret при первой установке, так и обновить его при повторном выполнении.

Установка Files API

Helm-релиз запускает Files API в unica-app, подключает внутренний адрес MinIO и использует подготовленный Secret с учётными данными.

helm upgrade --install files-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-files \
  --version <FILES_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.files" \
  --set-string env.MINIO_ENDPOINT="minio.unica-storage.svc.cluster.local:9000" \
  --set-string env.MINIO_WITH_SSL="false" \
  --set secret.enabled=false \
  --set secret.name=minio

4.3. DataManagement API

DataManagement API использует PostgreSQL для хранения данных и Files API для работы с файлами.

Подключение DataManagement к PostgreSQL

Пароль пользователя DataManagement считывается из ранее созданного Secret PostgreSQL, после чего формируется строка подключения к отдельной базе datamanagement_db.

DATAMANAGEMENT_PASSWORD="$(kubectl -n unica-db get secret postgresql -o jsonpath='{.data.DATAMANAGEMENT_PASSWORD}' | base64 -d)"
DATAMANAGEMENT_POSTGRES="Host=postgresql.unica-db.svc.cluster.local;Port=5432;Database=datamanagement_db;Username=datamanagement_user;Password=${DATAMANAGEMENT_PASSWORD}"

Установка DataManagement API

DataManagement API получает строку подключения к своей базе PostgreSQL и внутренний адрес Files API.

helm upgrade --install datamanagement-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-datamanagement \
  --version <DATAMANAGEMENT_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.datamanagement" \
  --set-string env.ConnectionStrings__Postgres="${DATAMANAGEMENT_POSTGRES}" \
  --set-string env.FilesApiOptions__Url="http://files-api.unica-app.svc.cluster.local:8080"

4.4. Embedding API

Embedding API принимает запросы на построение векторных представлений и передаёт их в vLLM, где запущена модель Qwen3-Embedding-8B.

Установка Embedding API

Embedding API подключается к внутреннему маршрутизатору vLLM и передаёт ему запросы на построение векторных представлений.

helm upgrade --install embedding-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-embedding \
  --version <EMBEDDING_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.embedding" \
  --set-string env.Vllm__Url="http://vllm-router-service.unica-infra.svc.cluster.local/v1"

4.5. LLM API

LLM API предоставляет прикладной интерфейс к языковой модели Gemma-4-12B, запущенной в vLLM. Для работы с файлами сервис также использует Files API.

Установка LLM API

LLM API подключается к тому же внутреннему маршрутизатору vLLM для работы с Gemma-4-12B и к Files API для операций с файлами.

helm upgrade --install llm-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-llm \
  --version <LLM_API_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.llm" \
  --set-string env.Vllm__Url="http://vllm-router-service.unica-infra.svc.cluster.local/v1" \
  --set-string env.FilesApi__Url="http://files-api.unica-app.svc.cluster.local:8080"

4.6. Imagelab

Imagelab используется Unica для работы с изображениями. Для взаимодействия между сервисами создаётся отдельный токен.

Токен Imagelab

Для вызовов Imagelab из Unica используется отдельный токен. Он генерируется перед установкой сервиса и позднее добавляется в общую конфигурацию Unica.

IMAGELAB_TOKEN="$(openssl rand -hex 32)"

Установка Imagelab

Helm-релиз запускает Imagelab в unica-app и передаёт созданный токен, который позднее будет использован основной Unica.

helm upgrade --install imagelab \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-imagelab \
  --version <IMAGELAB_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.imagelab" \
  --set-string env.UNICA_IMAGELAB_TOKEN="${IMAGELAB_TOKEN}"

4.7. Подготовка моделей Diarization и Recognition

До развёртывания Diarization API и Recognition Engine необходимо загрузить и распаковать модели на узле с GPU (${GPU_NODE}), а затем установить необходимые права доступа к каталогам.

Скачать архив моделей:

cd /tmp

wget \
  "https://downloads.rp-it.ru/asr.tar.gz" \
  -O asr.tar.gz

Архив содержит каталоги:

diarization/
recognition/

Проверить содержимое архива:

tar -tzf /tmp/asr.tar.gz | head -50

Создать базовый каталог и распаковать модели:

mkdir -p /storage

tar -xzf /tmp/asr.tar.gz \
  -C /storage

После распаковки должны существовать:

/storage/diarization
/storage/recognition

Установить владельца каталогов и их содержимого:

chown -R 2000:2000 \
  /storage/diarization \
  /storage/recognition

chmod 755 \
  /storage/diarization \
  /storage/recognition

Проверить:

ls -ld \
  /storage/diarization \
  /storage/recognition

du -sh \
  /storage/diarization \
  /storage/recognition

После успешной проверки архив можно удалить:

rm -f /tmp/asr.tar.gz

Важно: Diarization API и Recognition Engine разворачиваются только после загрузки и распаковки asr.tar.gz. Владельцем каталогов /storage/diarization и /storage/recognition должен быть 2000:2000.

4.8. Diarization API

Diarization API использует модель из /storage/diarization, отдельный MIG-ресурс nvidia.com/mig-2g.10gb, RabbitMQ и Files API.

Подключение Diarization API к RabbitMQ

Имя пользователя и пароль берутся из Secret, созданного на этапе настройки RabbitMQ. Из них формируется внутренний адрес подключения к очереди сообщений.

RABBITMQ_USER="$(kubectl -n unica-infra get secret rabbitmq-diarization-user -o jsonpath='{.data.username}' | base64 -d)"
RABBITMQ_PASSWORD="$(kubectl -n unica-infra get secret rabbitmq-diarization-user -o jsonpath='{.data.password}' | base64 -d)"
RABBITMQ_DIARIZATION_URL="amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq.unica-infra.svc.cluster.local:5672/"

Установка Diarization API

Сервис закрепляется за ${GPU_NODE}, получает MIG-профиль 2g.10gb, подключает локальную модель и использует RabbitMQ для обработки заданий.

helm upgrade --install diarization-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-diarization \
  --version <DIARIZATION_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set runtimeClassName=nvidia \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.diarization" \
  --set persistence.size="20Gi" \
  --set persistence.localPath="/storage/diarization" \
  --set persistence.nodeHostname="${GPU_NODE}" \
  --set gpu.nvidiaResource="nvidia.com/mig-2g.10gb" \
  --set-string env.RABBITMQ_URL="${RABBITMQ_DIARIZATION_URL}" \
  --set-string env.FILES_API_URL="http://files-api.unica-app.svc.cluster.local:8080"

4.9. Recognition Engine

Recognition Engine использует модель из /storage/recognition, отдельный MIG-ресурс nvidia.com/mig-1g.5gb, RabbitMQ и Files API.

Подключение Recognition Engine к RabbitMQ

Recognition Engine использует собственную учётную запись RabbitMQ. Значения считываются из Secret и используются только при формировании строки подключения.

RABBITMQ_USER="$(kubectl -n unica-infra get secret rabbitmq-recognition-user -o jsonpath='{.data.username}' | base64 -d)"
RABBITMQ_PASSWORD="$(kubectl -n unica-infra get secret rabbitmq-recognition-user -o jsonpath='{.data.password}' | base64 -d)"
RABBITMQ_RECOGNITION_URL="amqp://${RABBITMQ_USER}:${RABBITMQ_PASSWORD}@rabbitmq.unica-infra.svc.cluster.local:5672/"

Установка Recognition Engine

Recognition Engine запускается на ${GPU_NODE}, получает MIG-профиль 1g.5gb, подключает локальную модель распознавания и собственную учётную запись RabbitMQ.

helm upgrade --install recognition-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-recognitionengine \
  --version <RECOGNITION_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set runtimeClassName=nvidia \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.recognitionengine" \
  --set persistence.size="20Gi" \
  --set persistence.localPath="/storage/recognition" \
  --set persistence.nodeHostname="${GPU_NODE}" \
  --set gpu.nvidiaResource="nvidia.com/mig-1g.5gb" \
  --set-string env.RABBITMQ_URL="${RABBITMQ_RECOGNITION_URL}" \
  --set-string env.FILES_API_URL="http://files-api.unica-app.svc.cluster.local:8080"

4.10. SpeechRecognition API

SpeechRecognition API объединяет работу PostgreSQL, RabbitMQ, Files API, DataManagement API, Diarization API и Recognition Engine в единую цепочку обработки.

Подключения SpeechRecognition API

SpeechRecognition API использует отдельную базу PostgreSQL и учётную запись RabbitMQ asr. На этом шаге значения извлекаются из Kubernetes Secrets и собираются в параметры подключения для Helm-релиза.

ASR_DB_PASSWORD="$(kubectl -n unica-db get secret postgresql -o jsonpath='{.data.ASR_PASSWORD}' | base64 -d)"
ASR_RABBIT_USER="$(kubectl -n unica-infra get secret rabbitmq-asr-user -o jsonpath='{.data.username}' | base64 -d)"
ASR_RABBIT_PASSWORD="$(kubectl -n unica-infra get secret rabbitmq-asr-user -o jsonpath='{.data.password}' | base64 -d)"
ASR_POSTGRES="Host=postgresql.unica-db.svc.cluster.local;Port=5432;Database=asr_db;Username=asr_user;Password=${ASR_DB_PASSWORD}"

Установка SpeechRecognition API

Этот сервис связывает ранее установленные компоненты обработки аудио: PostgreSQL, RabbitMQ, DataManagement API, Files API, Diarization API и Recognition Engine.

helm upgrade --install speechrecognition-api \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-speechrecognition \
  --version <SPEECHRECOGNITION_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.speechrecognition" \
  --set-string env.ConnectionStrings__Postgres="${ASR_POSTGRES}" \
  --set-string env.DataManagementApiOptions__Url="http://datamanagement-api.unica-app.svc.cluster.local:8080" \
  --set-string env.FilesApiOptions__Url="http://files-api.unica-app.svc.cluster.local:8080" \
  --set-string env.DiarizationApiOptions__Url="http://diarization-api.unica-app.svc.cluster.local:8080" \
  --set-string env.RecognitionEngineApiOptions__Url="http://recognition-api.unica-app.svc.cluster.local:8080" \
  --set-string env.Messaging__Host="rabbitmq://rabbitmq.unica-infra.svc.cluster.local:5672" \
  --set-string env.Messaging__Username="${ASR_RABBIT_USER}" \
  --set-string env.Messaging__Password="${ASR_RABBIT_PASSWORD}"

4.11. Проверка прикладных API

Перед установкой основной Unica все прикладные API должны быть запущены и готовы принимать запросы внутри кластера.

kubectl -n unica-app get pods -o wide

4.12. Подготовка параметров Unica

Перед установкой основного сервиса собираются актуальные учётные данные инфраструктуры и один раз создаются прикладные секреты. Эти значения сохраняются в /root/unica.env и затем используются Unica, Agent, Workflow и Ops.

Общий файл параметров /root/unica.env

Перед установкой основной части Unica собираем в одном защищённом файле адреса, учётные данные и токены, которые будут повторно использоваться несколькими Helm-релизами. Это позволяет не генерировать значения заново между установкой Unica, Agent, Workflow и Ops.

UNICA_DB_PASSWORD="$(kubectl -n unica-db get secret postgresql -o jsonpath='{.data.UNICA_PASSWORD}' | base64 -d)"
QDRANT_API_KEY="$(kubectl -n unica-db get secret qdrant -o jsonpath='{.data.api-key}' | base64 -d)"
MINIO_ACCESS_KEY="$(kubectl -n unica-storage get secret minio -o jsonpath='{.data.MINIO_ROOT_USER}' | base64 -d)"
MINIO_SECRET_KEY="$(kubectl -n unica-storage get secret minio -o jsonpath='{.data.MINIO_ROOT_PASSWORD}' | base64 -d)"
IMAGELAB_TOKEN="$(kubectl -n unica-app get secret imagelab-secret -o jsonpath='{.data.UNICA_IMAGELAB_TOKEN}' | base64 -d)"

DATABASE_URL="postgresql://unica_user:${UNICA_DB_PASSWORD}@postgresql.unica-db.svc.cluster.local:5432/unica_db"

APP_SECRET="$(openssl rand -base64 48 | tr -d '\n')"
SESSION_SECRET="$(openssl rand -hex 32)"

AGENT_RUNTIME_TOKEN="$(openssl rand -hex 32)"
AGENT_GATEWAY_TOKEN="$(openssl rand -hex 32)"

WORKFLOW_RUNTIME_TOKEN="$(openssl rand -hex 32)"
WORKFLOW_GATEWAY_TOKEN="$(openssl rand -hex 32)"

JANITOR_RUNTIME_TOKEN="$(openssl rand -hex 32)"
JANITOR_GATEWAY_TOKEN="${JANITOR_RUNTIME_TOKEN}"

Создать файл:

umask 077
cat > /root/unica.env <<EOF
export UNICA_HOST='<unica-domain>'
export DATABASE_URL='${DATABASE_URL}'
export QDRANT_API_KEY='${QDRANT_API_KEY}'
export MINIO_ACCESS_KEY='${MINIO_ACCESS_KEY}'
export MINIO_SECRET_KEY='${MINIO_SECRET_KEY}'
export IMAGELAB_TOKEN='${IMAGELAB_TOKEN}'
export APP_SECRET='${APP_SECRET}'
export SESSION_SECRET='${SESSION_SECRET}'
export AGENT_RUNTIME_TOKEN='${AGENT_RUNTIME_TOKEN}'
export AGENT_GATEWAY_TOKEN='${AGENT_GATEWAY_TOKEN}'
export WORKFLOW_RUNTIME_TOKEN='${WORKFLOW_RUNTIME_TOKEN}'
export WORKFLOW_GATEWAY_TOKEN='${WORKFLOW_GATEWAY_TOKEN}'
export JANITOR_RUNTIME_TOKEN='${JANITOR_RUNTIME_TOKEN}'
export JANITOR_GATEWAY_TOKEN='${JANITOR_GATEWAY_TOKEN}'
EOF

chmod 600 /root/unica.env
source /root/unica.env

Проверить наличие переменных, не выводя сами секреты:

for v in \
  DATABASE_URL \
  QDRANT_API_KEY \
  MINIO_ACCESS_KEY \
  MINIO_SECRET_KEY \
  IMAGELAB_TOKEN \
  APP_SECRET \
  SESSION_SECRET \
  AGENT_RUNTIME_TOKEN \
  AGENT_GATEWAY_TOKEN \
  WORKFLOW_RUNTIME_TOKEN \
  WORKFLOW_GATEWAY_TOKEN \
  JANITOR_RUNTIME_TOKEN \
  JANITOR_GATEWAY_TOKEN
do
  [ -n "${!v:-}" ] && echo "$v=SET" || echo "$v=EMPTY"
done

Все значения должны быть SET.

Для компонентов Unica-* используется селектор узла unica-role=app. Метка назначается рабочим узлам на этапе их подключения к Kubernetes. Перед установкой необходимо проверить, что есть хотя бы один узел в состоянии Ready с этой меткой:

kubectl get nodes -l unica-role=app -o wide

4.13. Unica

Основной Helm-релиз получает адреса всех обязательных внутренних сервисов, учётные данные инфраструктуры, домен стенда и прикладные токены. Именно этот компонент публикуется наружу через ingress-nginx.

source /root/unica.env

helm upgrade --install unica \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-unica \
  --version <UNICA_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.unica" \
  --set ingress.host="${UNICA_HOST}" \
  --set-string env.common.DATABASE_URL="${DATABASE_URL}" \
  --set-string env.common.QDRANT_URL="http://qdrant.unica-db.svc.cluster.local:6333" \
  --set-string env.common.QDRANT_API_KEY="${QDRANT_API_KEY}" \
  --set-string env.common.MINIO_ENDPOINT="http://minio.unica-storage.svc.cluster.local:9000" \
  --set-string env.common.MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY}" \
  --set-string env.common.MINIO_SECRET_KEY="${MINIO_SECRET_KEY}" \
  --set-string env.common.REDIS_URL="redis://redis.unica-infra.svc.cluster.local:6379/" \
  --set-string env.common.UNICA_AGENT_RUNTIME_URL="http://unica-agent.unica-app.svc.cluster.local:8000" \
  --set-string env.common.UNICA_AGENT_RUNTIME_TOKEN="${AGENT_RUNTIME_TOKEN}" \
  --set-string env.common.UNICA_AGENT_GATEWAY_URL="http://unica.unica-app.svc.cluster.local:5000/api/internal/agent-runtime" \
  --set-string env.common.UNICA_AGENT_GATEWAY_TOKEN="${AGENT_GATEWAY_TOKEN}" \
  --set-string env.common.UNICA_WORKFLOW_RUNTIME_URL="http://unica-workflow.unica-app.svc.cluster.local:5001" \
  --set-string env.common.UNICA_WORKFLOW_RUNTIME_TOKEN="${WORKFLOW_RUNTIME_TOKEN}" \
  --set-string env.common.UNICA_WORKFLOW_GATEWAY_TOKEN="${WORKFLOW_GATEWAY_TOKEN}" \
  --set-string env.common.UNICA_LLM_API_URL="http://llm-api.unica-app.svc.cluster.local:8080" \
  --set-string env.common.UNICA_EMBEDDING_API_URL="http://embedding-api.unica-app.svc.cluster.local:8080" \
  --set-string env.common.UNICA_FILES_API_URL="http://files-api.unica-app.svc.cluster.local:8080" \
  --set-string env.common.UNICA_SPEECH_RECOGNITION_API_URL="http://speechrecognition-api.unica-app.svc.cluster.local:8080" \
  --set-string env.common.UNICA_DATA_MANAGEMENT_API_URL="http://datamanagement-api.unica-app.svc.cluster.local:8080" \
  --set-string env.application.STATIC_ALLOWED_HOSTNAMES="${UNICA_HOST}" \
  --set-string env.application.APP_SECRET="${APP_SECRET}" \
  --set-string env.application.SESSION_SECRET="${SESSION_SECRET}" \
  --set-string env.application.UNICA_IMAGELAB_URL="http://imagelab.unica-app.svc.cluster.local:8000" \
  --set-string env.application.UNICA_IMAGELAB_TOKEN="${IMAGELAB_TOKEN}" \
  --set-string env.application.UNICA_JANITOR_RUNTIME_URL="http://unica-ops.unica-app.svc.cluster.local:5004" \
  --set-string env.application.UNICA_JANITOR_RUNTIME_TOKEN="${JANITOR_RUNTIME_TOKEN}"

Обязательные адреса прикладных API задаются явно, так как пакет Helm проверяет их наличие.

Docling является необязательным компонентом и по умолчанию отключён в пакете Helm. Если Docling развёрнут на шаге «Docling Serve», к команде установки Unica необходимо добавить:

--set-string env.common.DOCLING_ENABLED="true" \
--set-string env.common.DOCLING_API_URL="http://docling-serve.unica-infra.svc.cluster.local:5001"

Если Docling не используется, дополнительные параметры не требуются.

4.14. Unica Agent

Unica Agent устанавливается после основного сервиса и использует отдельные токены среды выполнения и шлюза, согласованные с параметрами Unica.

UNICA_AGENT_RUNTIME_TOKEN и UNICA_AGENT_GATEWAY_TOKEN — разные значения и должны совпадать с соответствующими значениями, переданными в основной пакет Helm Unica.

source /root/unica.env

helm upgrade --install unica-agent \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-unica-agent \
  --version <UNICA_AGENT_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.unica.agent" \
  --set-string env.UNICA_AGENT_RUNTIME_TOKEN="${AGENT_RUNTIME_TOKEN}" \
  --set-string env.UNICA_AGENT_GATEWAY_TOKEN="${AGENT_GATEWAY_TOKEN}"

4.15. Unica Workflow

Workflow использует тот же AGENT_RUNTIME_TOKEN, что и Unica Agent, и собственную пару токенов среды выполнения и шлюза.

source /root/unica.env

helm upgrade --install unica-workflow \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-unica-workflow \
  --version <UNICA_WORKFLOW_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.unica.workflow" \
  --set-string env.MINIO_ENDPOINT="http://minio.unica-storage.svc.cluster.local:9000" \
  --set-string env.REDIS_URL="redis://redis.unica-infra.svc.cluster.local:6379/" \
  --set-string env.DATABASE_URL="${DATABASE_URL}" \
  --set-string env.MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY}" \
  --set-string env.MINIO_SECRET_KEY="${MINIO_SECRET_KEY}" \
  --set-string env.UNICA_AGENT_RUNTIME_TOKEN="${AGENT_RUNTIME_TOKEN}" \
  --set-string env.UNICA_WORKFLOW_RUNTIME_TOKEN="${WORKFLOW_RUNTIME_TOKEN}" \
  --set-string env.UNICA_WORKFLOW_GATEWAY_TOKEN="${WORKFLOW_GATEWAY_TOKEN}"

4.16. Unica Ops

Unica Ops использует Qdrant, MinIO, Redis и PostgreSQL, а также токены, подготовленные ранее в /root/unica.env. Дополнительные секреты на этом шаге создавать не требуется.

source /root/unica.env

helm upgrade --install unica-ops \
  oci://<REGISTRY>/<HELM_CHARTS_PATH>/rospartner-ai-unica-ops \
  --version <UNICA_OPS_CHART_VERSION> \
  --namespace unica-app \
  --set nodeSelector.unica-role=app \
  --set image.repository="<REGISTRY>/<IMAGES_PATH>/rospartner.ai.unica.ops" \
  --set-string env.QDRANT_URL="http://qdrant.unica-db.svc.cluster.local:6333" \
  --set-string env.MINIO_ENDPOINT="http://minio.unica-storage.svc.cluster.local:9000" \
  --set-string env.REDIS_URL="redis://redis.unica-infra.svc.cluster.local:6379/" \
  --set-string env.DATABASE_URL="${DATABASE_URL}" \
  --set-string env.QDRANT_API_KEY="${QDRANT_API_KEY}" \
  --set-string env.MINIO_ACCESS_KEY="${MINIO_ACCESS_KEY}" \
  --set-string env.MINIO_SECRET_KEY="${MINIO_SECRET_KEY}" \
  --set-string env.UNICA_JANITOR_RUNTIME_TOKEN="${JANITOR_RUNTIME_TOKEN}" \
  --set-string env.UNICA_JANITOR_GATEWAY_TOKEN="${JANITOR_GATEWAY_TOKEN}"