Обновление 1.26.6.1 → 1.26.8.3
Перед началом работ на целевой машине остановите все её процессы через Центр управления (UI).
Значимые изменения, которые следует учитывать системному администратору:
- Обновлены все образы Docker:
ai-server-api,ai-server-auth,ai-server-ft,ai-server-idp-cpu,ai-server-idp-gpu,ai-server-inference,ai-server-logs,ai-server-machineinfo,ai-server-nlp,ai-server-ollama,ai-server-rag-gpu,ai-server-ui - Образ vLLM заменён:
primo-rpa/ai-server-vllm-gpu→ внешний образexternals/vllm-openai:v0.26.0 - Добавлена новая модель
base-LLM-12-35b-safetensors-nfvp4(vLLM) - Изменены конфигурации сервисов: Api (
LlmRunners,Agents.UsagePeriod), Inference (Orchestrator), агент (переработана секцияLlmEngineProcess:EndpointвместоUrl, диапазоны портов,ExposePort) - Обновлены дистрибутивы
Agent-linux.zipиApi.MachineInfo-linux.zip - TLS-сертификаты больше не встроены в образ
ai-server-ui— теперь монтируются через volume вdocker-compose.yaml - Обновлены версии Python-зависимостей в сервисах DS (устранение CVE)
- Образ Ollama (
ai-server-ollama) теперь запускается от непривилегированного пользователя (UID 1001) - Обновлён образ RabbitMQ:
3.10.7-management→4.2.8-management-alpine(устранение уязвимостей, Alpine-база) - Обновлён образ PostgreSQL:
postgres:17.6→postgres:17.10-alpine(устранение уязвимостей, Alpine-база) - Обновлён образ Redis:
redis:latest→redis:7.4-alpine(устранение уязвимостей, Alpine-база) - Добавлены параметры модели Обработка изображений и Рассуждение для внешней LLM
Машина сервера
1. Извлеките TLS-сертификаты из текущего образа
Начиная с версии 1.26.6.2 сертификаты не включены в образ ai-server-ui. Перед обновлением необходимо сохранить сертификаты из работающего контейнера и подключить их через volume.
Создайте директорию для сертификатов:
sudo mkdir -p /app/Primo.AI/Api/volumes/nginx/sslИзвлеките сертификаты из работающего контейнера server_ui:
docker cp server_ui:/etc/nginx/cert1.crt /app/Primo.AI/Api/volumes/nginx/ssl/cert1.crt
docker cp server_ui:/etc/nginx/cert1.rsa /app/Primo.AI/Api/volumes/nginx/ssl/cert1.rsaУстановите права доступа:
sudo chmod 644 /app/Primo.AI/Api/volumes/nginx/ssl/cert1.crt
sudo chmod 600 /app/Primo.AI/Api/volumes/nginx/ssl/cert1.rsaЕсли контейнер server_ui уже остановлен или сертификаты недоступны, сгенерируйте новые по инструкции.
2. Обновите docker-compose.yaml
Откройте файл /app/Primo.AI/Api/docker-compose.yaml и внесите следующие изменения:
a) Обновите образ PostgreSQL:
postgres:
image: externals/postgres:17.10-alpineb) Обновите образ RabbitMQ:
rabbitMQ:
image: externals/rabbitmq:4.2.8-management-alpinec) Обновите образ Redis:
redis:
image: externals/redis:7.4-alpined) Добавьте в секцию nginx → volumes монтирование сертификатов:
nginx:
image: primo-rpa/ai-server-ui
...
volumes:
- ./volumes/nginx/nginx.conf:/etc/nginx/nginx.conf
- ./volumes/nginx/ssl/cert1.crt:/etc/nginx/cert1.crt:ro
- ./volumes/nginx/ssl/cert1.rsa:/etc/nginx/cert1.rsa:ro
- ./volumes/nginx/:/var/log/nginx3. Обновите образы Docker
Через архив:
sudo apt update && sudo apt install 7z
names="ai-server-api ai-server-auth ai-server-inference ai-server-logs ai-server-machineinfo ai-server-ui"
externals="postgres:17.10-alpine rabbitmq:4.2.8-management-alpine redis:7.4-alpine"
for name in $names; do
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr&files=$name.tar.7z"
7z x $name.tar.7z
docker load -i $name.tar
rm $name.tar.7z $name.tar
done
for external in $externals; do
filename=$(echo "$external" | sed 's/:/_/g')
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr%2Fexternals&files=$filename.tar.7z"
7z x $filename.tar.7z
docker load -i $filename.tar
rm $filename.tar.7z $filename.tar
doneЕсли есть доступ к nexus.primo-rpa.ru:8005:
names="ai-server-api ai-server-auth ai-server-inference ai-server-logs ai-server-machineinfo ai-server-ui"
externals="postgres:17.10-alpine rabbitmq:4.2.8-management-alpine redis:7.4-alpine"
for name in $names; do
docker pull nexus.primo-rpa.ru:8005/primo-rpa/$name
docker tag nexus.primo-rpa.ru:8005/primo-rpa/$name primo-rpa/$name
docker rmi nexus.primo-rpa.ru:8005/primo-rpa/$name
done
for external in $externals; do
docker pull nexus.primo-rpa.ru:8005/externals/$external
docker tag nexus.primo-rpa.ru:8005/externals/$external externals/$external
docker rmi nexus.primo-rpa.ru:8005/externals/$external
done4. Скачайте новую модель
| Имя модели | Имя файла | Исполнение |
|---|---|---|
| base-llm-12-35b-safetensors-nfvp4 | 63e56e59-6c96-4fc7-9ecb-afab3d79bb21 | vLLM |
filenames="63e56e59-6c96-4fc7-9ecb-afab3d79bb21"
for filename in $filenames; do
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdata%2Fmodels%2FNLP&files=$filename" -P /app/Primo.AI/Api/volumes/Api_Models/
done5. Обновите конфигурацию сервисов
a) Api. В файле /app/Primo.AI/Api/volumes/conf/Api/appsettings.ProdLinux.json добавьте параметр UsagePeriod в секцию Agents и новую секцию LlmRunners:
...
"Agents": {
...
"StopProcessAfterUnavailablePeriod": 300,
"UsagePeriod": 10000
},
...
"LlmRunners": {
"StartTimeoutSeconds": 1200,
"StopTimeoutSeconds": 300
},
...b) Inference. В файле /app/Primo.AI/Api/volumes/conf/Inference/appsettings.ProdLinux.json добавьте секцию Orchestrator:
...
"Orchestrator": {
"Login": "aiserver",
"Password": "JLWIyl1xZNDVVx8tcVllOg==",
"Address": "https://<адрес Центра управления>:44392"
},
...Укажите в Address реальный внешний адрес Центра управления. Password — зашифрованное значение.
6. Обновите Api.MachineInfo
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr&files=Api.MachineInfo-linux.zip"
sudo systemctl stop Primo.AI.Api.MachineInfo
sudo unzip -o Api.MachineInfo-linux.zip -x "appsettings*" -d /app/Primo.AI/Api.MachineInfo/
sudo chmod +x /app/Primo.AI/Api.MachineInfo/Primo.AI.Api.MachineInfo
sudo chown primo:primo-ai /app/Primo.AI/Api.MachineInfo/
sudo systemctl start Primo.AI.Api.MachineInfo7. Перезапустите компоненты:
docker compose -f /app/Primo.AI/Api/docker-compose.yaml down && \
docker compose -f /app/Primo.AI/Api/docker-compose.yaml up -dУбедитесь, что Центр управления доступен по HTTPS (порт 44392).
После обновления Центра управления выполните повторный вход в систему.
Целевые машины
1. Настройте права доступа для Ollama
Шаг обязателен, если на целевой машине используется Ollama. Образ ai-server-ollama теперь запускается от непривилегированного пользователя (UID 1001). Агент создаёт файлы и поддиректории в ModelTemplates от имени agent:primo-ai, поэтому для доступа Ollama используется механизм POSIX ACL с наследованием прав — он не зависит от текущего владельца файла. Директории blobs и meta дополнительно должны принадлежать непосредственно UID 1001: Ollama изменяет временные метки файлов в них, а для этого требуется реальное владение файлом, а не только ACL.
Установите пакет acl, если он отсутствует:
sudo apt-get install -y aclНастройте права доступа для UID 1001 на существующие файлы и директории:
sudo setfacl -R -m u:1001:rwx /app/Primo.AI/AgentData/ModelTemplatesУстановите default ACL для автоматического наследования прав новыми файлами и директориями:
sudo setfacl -R -d -m u:1001:rwx /app/Primo.AI/AgentData/ModelTemplatesВерните владельца директории агенту:
sudo chown -R agent:primo-ai /app/Primo.AI/AgentData/ModelTemplatesСмените владельца файлов моделей на UID 1001:
sudo chown -R 1001:1001 /app/Primo.AI/AgentData/ModelTemplates/blobs/*
sudo chown -R 1001:1001 /app/Primo.AI/AgentData/ModelTemplates/meta/*Проверьте результат:
getfacl /app/Primo.AI/AgentData/ModelTemplatesВ выводе должны присутствовать строки user:1001:rwx и default:user:1001:rwx.
2. Замените ln на cp в конфигурации агента
Шаг обязателен, если на целевой машине используется Ollama. Ранее агент создавал жёсткую ссылку (ln) на файл модели. Жёсткая ссылка сохраняет владельца исходного файла (agent:primo-ai), а Ollama (UID 1001) не может изменить временные метки чужого файла. Операция chtimes завершается ошибкой operation not permitted. Замена на копирование (cp) решает проблему: копия создаётся от имени пользователя контейнера (UID 1001), и Ollama получает полный доступ.
Откройте файл /app/Primo.AI/Agent/appsettings.ProdLinux.json, найдите секцию Ollama → PostRunCommands и замените ln на cp:
"PostRunCommands": [
"cp {modelFilePath} {blobFilePath}",
"ollama create {modelId} -f {modelMetaFilePath}",
"ollama run {modelId} \"\""
]3. Обновите файлы агента
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr&files=Agent-linux.zip&downloadStartSecret=uf3pctriscf"
sudo systemctl stop Primo.AI.Agent
sudo unzip -o Agent-linux.zip -x "appsettings*" -d /app/Primo.AI/Agent/
sudo chmod +x /app/Primo.AI/Agent/Primo.AI.Agent
sudo chown -R agent:primo-ai /app/Primo.AI/Agent/
sudo systemctl start Primo.AI.Agent4. Обновите образы DS
- Вариант загрузки 1: скачайте необходимые архивы из официальной поставки AI Server:
images=""
externals=""
echo "GPU? y/n"
read GPU
if [ "$GPU" = "y" ] || [ "$GPU" = "Y" ]; then
echo "FT-сервер? y/n"
read ft_server
if [ "$ft_server" = "y" ] || [ "$ft_server" = "Y" ]; then
images+=" ai-server-ft"
fi
echo "NLP-сервер? y/n"
read nlp_server
if [ "$nlp_server" = "y" ] || [ "$nlp_server" = "Y" ]; then
images+=" ai-server-nlp"
fi
echo "Ollama? y/n"
read ollama
if [ "$ollama" = "y" ] || [ "$ollama" = "Y" ]; then
images+=" ai-server-ollama"
fi
echo "vLLM? y/n"
read vllm
if [ "$vllm" = "y" ] || [ "$vllm" = "Y" ]; then
externals+=" vllm-openai:v0.26.0"
fi
echo "IDP-сервер? y/n"
read idp_server
if [ "$idp_server" = "y" ] || [ "$idp_server" = "Y" ]; then
images+=" ai-server-idp-gpu"
fi
echo "RAG? y/n"
read rag
if [ "$rag" = "y" ] || [ "$rag" = "Y" ]; then
images+=" ai-server-rag-gpu"
fi
else
echo "NLP-сервер? y/n"
read nlp_server
if [ "$nlp_server" = "y" ] || [ "$nlp_server" = "Y" ]; then
images+=" ai-server-nlp"
fi
echo "Ollama? y/n"
read ollama
if [ "$ollama" = "y" ] || [ "$ollama" = "Y" ]; then
images+=" ai-server-ollama"
fi
echo "IDP-сервер? y/n"
read idp_server
if [ "$idp_server" = "y" ] || [ "$idp_server" = "Y" ]; then
images+=" ai-server-idp-cpu"
fi
fi
# Удаляем ведущий пробел
images=$(echo $images | sed 's/^ //')
names=$(echo $images | tr ' ' '\n')
echo "Загружаемые images: $images"
sudo apt update && sudo apt install -y 7z
for name in $names; do
echo "Загрузка $name..."
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr&files=$name.tar.7z"
7z x $name.tar.7z
docker load -i $name.tar
rm -f $name.tar.7z $name.tar
done
for external in $externals; do
echo "Загрузка external $external..."
filename=$(echo "$external" | sed 's/:/_/g')
wget --content-disposition "https://disk.primo-rpa.ru/index.php/s/t9BHBjR6PP06Yax/download?path=%2FRelease%2FAI%20Server%2Fdistr%2Fexternals&files=$filename.tar.7z"
7z x $filename.tar.7z
docker load -i $filename.tar
rm -f $filename.tar.7z $filename.tar
done
echo "Готово!"- Вариант загрузки 2: используя репозиторий Docker:
Работает при наличии подключения к
nexus.primo-rpa.ru:8005.
#!/bin/bash
images=""
externals=""
echo "GPU? y/n"
read GPU
if [ "$GPU" = "y" ] || [ "$GPU" = "Y" ]; then
echo "FT-сервер? y/n"
read ft_server
if [ "$ft_server" = "y" ] || [ "$ft_server" = "Y" ]; then
images+=" ai-server-ft"
fi
echo "NLP-сервер? y/n"
read nlp_server
if [ "$nlp_server" = "y" ] || [ "$nlp_server" = "Y" ]; then
images+=" ai-server-nlp"
fi
echo "Ollama? y/n"
read ollama
if [ "$ollama" = "y" ] || [ "$ollama" = "Y" ]; then
images+=" ai-server-ollama"
fi
echo "vLLM? y/n"
read vllm
if [ "$vllm" = "y" ] || [ "$vllm" = "Y" ]; then
externals+=" vllm-openai:v0.26.0"
fi
echo "IDP-сервер? y/n"
read idp_server
if [ "$idp_server" = "y" ] || [ "$idp_server" = "Y" ]; then
images+=" ai-server-idp-gpu"
fi
echo "RAG? y/n"
read rag
if [ "$rag" = "y" ] || [ "$rag" = "Y" ]; then
images+=" ai-server-rag-gpu"
fi
else
echo "NLP-сервер? y/n"
read nlp_server
if [ "$nlp_server" = "y" ] || [ "$nlp_server" = "Y" ]; then
images+=" ai-server-nlp"
fi
echo "Ollama? y/n"
read ollama
if [ "$ollama" = "y" ] || [ "$ollama" = "Y" ]; then
images+=" ai-server-ollama"
fi
echo "IDP-сервер? y/n"
read idp_server
if [ "$idp_server" = "y" ] || [ "$idp_server" = "Y" ]; then
images+=" ai-server-idp-cpu"
fi
fi
# Удаляем ведущий пробел
images=$(echo $images | sed 's/^ //')
names=$(echo $images | tr ' ' '\n')
echo "Загружаемые images: $images"
for name in $names; do
docker pull nexus.primo-rpa.ru:8005/primo-rpa/$name
docker tag nexus.primo-rpa.ru:8005/primo-rpa/$name primo-rpa/$name
docker rmi nexus.primo-rpa.ru:8005/primo-rpa/$name
done
for external in $externals; do
docker pull nexus.primo-rpa.ru:8005/externals/$external
docker tag nexus.primo-rpa.ru:8005/externals/$external externals/$external
docker rmi nexus.primo-rpa.ru:8005/externals/$external
done
echo "Готово!"5. Обновите конфигурацию агента
Добавьте параметр ExtraEnvs в секцию Ollama файла /app/Primo.AI/Agent/appsettings.ProdLinux.json:
"Ollama": {
...
"PostRunCommands": [
"cp {modelFilePath} {blobFilePath}",
"ollama create {modelId} -f {modelMetaFilePath}",
"ollama run {modelId} \"\""
],
"ExtraEnvs": [ "-e OLLAMA_GO_TEMPLATE=1" ]
}Также переработана секция LlmEngineProcess (проверка доступности через Endpoint вместо Url, диапазоны портов PortsRangeFrom/PortsRangeTo вместо Port, параметр ExposePort). Приведите секцию к следующему виду:
"LlmEngineProcess": {
"HealthCheck": {
"Vllm": {
"Endpoint": "/version",
"TimeoutSeconds": 600,
"PeriodMilliseconds": 500
},
"Ollama": {
"Endpoint": "/v1/models",
"TimeoutSeconds": 600,
"PeriodMilliseconds": 500
},
"LlamaCppPython": {
"Endpoint": "/v1/models",
"TimeoutSeconds": 600,
"PeriodMilliseconds": 500
}
},
"EnginesDockerRun": {
"Vllm": {
"ImageName": "externals/vllm-openai:v0.26.0",
"ContainerName": "vllm",
"PortsRangeFrom": 8000,
"PortsRangeTo": 8019,
"Subnet": "agent_agent_ai",
"ExposePort": true
},
"Ollama": {
"ImageName": "primo-rpa/ai-server-ollama",
"ContainerName": "ollama",
"PortsRangeFrom": 8020,
"PortsRangeTo": 8039,
"Subnet": "agent_agent_ai",
"PostRunCommands": [
"cp {modelFilePath} {blobFilePath}",
"ollama create {modelId} -f {modelMetaFilePath}",
"ollama run {modelId} \"\""
],
"ExtraEnvs": [ "-e OLLAMA_GO_TEMPLATE=1" ]
},
"LlamaCppPython": {
"ImageName": "primo-rpa/ai-server-llama-cpp-python",
"ContainerName": "llama",
"PortsRangeFrom": 8040,
"PortsRangeTo": 8059,
"Subnet": "agent_agent_ai",
"ExposePort": true
}
}
},Перезапустите агент:
sudo systemctl restart Primo.AI.AgentЧто дальше
После завершения обновления выполните проверку работоспособности системы.