← Все гайды AI Release
EN Подписаться на @ai_release1

Пошаговое руководство: как запустить автономных ИИ-агентов в безопасном рантайме OpenShell

Обновлено: 23.10.2026 · AI Release · @ai_release1
Пошаговое руководство: как запустить автономных ИИ-агентов в безопасном рантайме OpenShell

TL;DR

Требования и подготовка

Иллюстрация к разделу «Требования и подготовка»
Иллюстрация к разделу «Требования и подготовка»

Пример: проверка базы перед стартом.

docker --version
git --version
df -h / | tail -1

Ожидаемый вывод — три строки: версия Docker (Docker version 24.x или новее), версия git (git version 2.x), и строка с Avail не меньше 20G.

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

Шаг 1. Разверните изолированный хост и получите исходники OpenShell

Что сделать: подключитесь к выделенному хосту по SSH и склонируйте репозиторий NVIDIA.

ssh <пользователь>@<ip-хоста>
mkdir -p ~/work && cd ~/work
git clone https://github.com/NVIDIA/OpenShell.git
cd OpenShell
ls -la

Зачем: OpenShell — это рантайм, то есть программа, которая запускает и ограничивает другие процессы. Исходники дают вам манифесты запуска и документацию; без чтения README дальше идти нельзя, потому что детали реализации в анонсе не публиковались.

Как проверить: команда ls -la должна показать содержимое репозитория, а следующая — текст README.

cat README.md | head -60

Пример: если в README есть раздел установки, вы увидите строки вида ## Installation или ## Quickstart. Если README пустой или содержит только описание проекта — установка ещё не документирована, сверьтесь с Issues и остальными файлами:

grep -ril "docker\|compose\|requirements\|pyproject" . --include="*.md" --include="*.yaml" --include="*.yml" --include="*.toml" | head -20

По этой выборке видно, чем проект собирается: Dockerfile, docker-compose.yml, pyproject.toml или requirements.txt. Почему это работает: менеджеры зависимостей и контейнеризация всегда оставляют в репозитории один из этих файлов.

Шаг 2. Настройте изоляцию рантайма и запустите первый агент

Иллюстрация к разделу «Шаг 2. Настройте изоляцию рантайма и запустите первый агент»
Иллюстрация к разделу «Шаг 2. Настройте изоляцию рантайма и запустите первый агент»

Что сделать: соберите образ и опишите политику ограничений — сеть, права, файловая система, лимиты. Это ключевой этап: безопасность даёт не сам OpenShell, а конфигурация, с которой вы его запускаете.

Зачем: автономный агент — программа, которая сама решает, какие команды выполнять. Если дать ей сеть без ограничений и права root, «приватный рантайм» превратится в обычный контейнер с полным доступом наружу.

Сначала определите имя образа и команду запуска по документации:

grep -n "docker run\|docker compose\|image:" README.md docker-compose.yml 2>/dev/null | head -20

Пример: типовая безопасная команда запуска. Имя образа и тег в анонсе не публиковались — подставьте значения из README (сверьтесь с документацией), здесь они обозначены как <openshell-image>:<tag>.

docker build -t <openshell-image>:<tag> .   # если в репозитории есть Dockerfile
docker run -d \
  --name openshell-agent-01 \
  --user 10001:10001 \
  --read-only \
  --tmpfs /tmp:rw,size=256m \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  --memory 4g --cpus 2 \
  --env-file ./agent.env \
  -v /srv/openshell/artifacts:/work/artifacts \
  <openshell-image>:<tag>

Файл agent.env создайте рядом, права 600:

printf 'MODEL_API_KEY=%s\nMODEL_ENDPOINT=%s\n' "<ваш-ключ>" "https://<эндпоинт-модели>/v1" > agent.env
chmod 600 agent.env

Как проверить: контейнер должен быть в статусе Up, а внутри — не root и только для чтения.

docker ps --filter name=openshell-agent-01
docker exec openshell-agent-01 id

Ожидаемый результат: в docker ps статус Up ..., а id возвращает uid=10001 gid=10001, не uid=0(root).

Чек-лист перед тем, как пускать агента в работу:

Последний пункт проверяется правилами файрвола или прокси:

sudo ufw default deny outgoing
sudo ufw allow out 53/udp
sudo ufw allow out 443/tcp to <ip-эндпоинта-модели>
sudo ufw enable

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

Шаг 3. Проверьте изоляцию и убедитесь, что агент работает

Иллюстрация к разделу «Шаг 3. Проверьте изоляцию и убедитесь, что агент работает»
Иллюстрация к разделу «Шаг 3. Проверьте изоляцию и убедитесь, что агент работает»

Что сделать: прогоните три проверки — доступность разрешённого эндпоинта, блокировка запрещённого и запись артефакта.

docker exec openshell-agent-01 sh -c 'curl -sS -m 5 -o /dev/null -w "%{http_code}\n" https://<эндпоинт-модели>/v1/models'
docker exec openshell-agent-01 sh -c 'curl -sS -m 5 https://example.org ; echo "exit=$?"'

Как проверить: первая команда печатает 200 (или 401 — если ключ не передан, это тоже признак, что сеть открыта), вторая — ошибку соединения и exit=28 (таймаут) либо exit=7 (нет соединения). Если вторая команда вернула HTML — изоляция не работает, вернитесь к правилам ufw.

Пример: если curl в образе нет, используйте Python, который обычно есть в образах под агентов:

docker exec openshell-agent-01 python3 -c "import urllib.request;print(urllib.request.urlopen('https://example.org',timeout=5).status)"

Ожидаемо: urllib.error.URLError или TimeoutError. Отсутствие ответа — это и есть успех проверки.

Финальная проверка записи артефакта:

docker exec openshell-agent-01 sh -c 'touch /work/artifacts/probe && echo ok' && ls -l /srv/openshell/artifacts/

На экране — ok и строка probe в листинге каталога. При этом запись в корень должна падать: docker exec openshell-agent-01 touch /probe вернёт Read-only file system.

Когда несколько агентов работают подолгу, имеет смысл вывести их статусы в Telegram — схема описана в гайде Как настроить мониторинг VPS через Telegram-бота с Mini App.

Возможные проблемы и решения

Проблема. Репозиторий не клонируется

curl -s https://api.github.com/orgs/NVIDIA/repos?per_page=100 | grep -o '"clone_url": "[^"]*OpenShell[^"]*"'
git clone <полученный-URL>

Проблема. Docker не запускается от текущего пользователя

sudo usermod -aG docker $USER
newgrp docker
docker ps

Проблема. Агент не может обратиться к модели

getent hosts <эндпоинт-модели>
sudo ufw allow out 443/tcp to <полученный-ip>
sudo ufw reload

Резюме и следующие шаги

Вы развернули изолированный хост, склонировали NVIDIA/OpenShell, запустили агента с read-only ФС, сброшенными capabilities и allowlist в исходящей сети. Дальше масштабируйте на флот: по одному контейнеру и одному agent.env на агента, а лицензию и поддерживаемые платформы уточните в репозитории — в анонсе они не раскрывались.

FAQ

Что такое NVIDIA OpenShell?

Рантайм для безопасного и приватного выполнения флотов автономных ИИ-агентов, опубликованный NVIDIA на GitHub в организации NVIDIA по адресу github.com/NVIDIA/OpenShell. Это среда запуска, а не модель и не фреймворк для промптов.

Какие платформы и лицензия у OpenShell?

В исходном анонсе эти данные не раскрыты. Проверяйте файл лицензии и раздел с поддерживаемыми платформами в самом репозитории — сверьтесь с документацией перед промышленным запуском.

Зачем запускать агентов в отдельном рантайме, а не на обычной машине?

Автономный агент сам выбирает команды, поэтому ему нужны ограничения: non-root, read-only корневая ФС, лимиты ресурсов и allowlist в сети. Рантайм даёт границу, внутри которой агент не достанет остальную систему.

Можно ли запустить OpenShell без Docker?

В анонсе способ запуска не описан. Если в README нет альтернативной инструкции, используйте контейнер — это воспроизводимый и проверяемый вариант; остальное сверьтесь с документацией репозитория.

🤖 Кратко для ИИ