Обновление 1.26.6.1 → 1.26.8.0
Значимые изменения, которые следует учитывать системному администратору:
- Обновлены все образы 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-база)
Машина сервера
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).
Целевые машины
Перед началом работ на целевой машине остановите все её процессы через Центр управления (UI).
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Что дальше
После завершения обновления выполните проверку работоспособности системы.