git, Docker + плагин Compose, от 8 ГБ ОЗУ и 20 ГБ диска под образы, API-ключ вашей модели, доступ в интернет для клонирования репозиторияgithub.com/NVIDIA/OpenShell, описание — «safe, private runtime for fleets of autonomous AI agents». Детали реализации, лицензия и поддерживаемые платформы в анонсе не раскрыты — сверьтесь с документацией в самом репозитории.
sudo (нужен для установки Docker и правил файрвола).git, docker, docker compose, curl.df -h /), потому что каждый образ агента и его артефакты занимают место.github.com и к эндпоинту модели.Пример: проверка базы перед стартом.
docker --version
git --version
df -h / | tail -1
Ожидаемый вывод — три строки: версия Docker (Docker version 24.x или новее), версия git (git version 2.x), и строка с Avail не меньше 20G.
Зачем: рантайм для автономных агентов изолирует процессы и сеть, а для этого нужен рабочий Docker и запас диска. Без этого следующие шаги упадут на этапе сборки или запуска.
Что сделать: подключитесь к выделенному хосту по 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. Почему это работает: менеджеры зависимостей и контейнеризация всегда оставляют в репозитории один из этих файлов.

Что сделать: соберите образ и опишите политику ограничений — сеть, права, файловая система, лимиты. Это ключевой этап: безопасность даёт не сам 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).
Чек-лист перед тем, как пускать агента в работу:
--user)--read-only)--cap-drop ALL) и запрещён эскалационный запуск (no-new-privileges)--env-file, а не зашиты в образПоследний пункт проверяется правилами файрвола или прокси:
sudo ufw default deny outgoing
sudo ufw allow out 53/udp
sudo ufw allow out 443/tcp to <ip-эндпоинта-модели>
sudo ufw enable
Почему это работает: агент обращается только к DNS и к конкретному адресу модели, любой другой исходящий запрос отбрасывается на уровне ядра, а не внутри приложения.

Что сделать: прогоните три проверки — доступность разрешённого эндпоинта, блокировка запрещённого и запись артефакта.
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.
Проблема. Репозиторий не клонируется
fatal: repository 'https://github.com/NVIDIA/OpenShell.git/' not foundcurl -s https://api.github.com/orgs/NVIDIA/repos?per_page=100 | grep -o '"clone_url": "[^"]*OpenShell[^"]*"'
git clone <полученный-URL>
Проблема. Docker не запускается от текущего пользователя
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sockdocker, у демона другой владелец сокета.sudo usermod -aG docker $USER
newgrp docker
docker ps
Проблема. Агент не может обратиться к модели
curl: (28) Connection timed out after 5001 milliseconds внутри контейнераufw пропускает только разрешённые адреса, а реальный IP эндпоинта из DNS не совпал с тем, что вы внесли в allowlist, либо блокируется исходящий DNS.getent hosts <эндпоинт-модели>
sudo ufw allow out 443/tcp to <полученный-ip>
sudo ufw reload
Вы развернули изолированный хост, склонировали NVIDIA/OpenShell, запустили агента с read-only ФС, сброшенными capabilities и allowlist в исходящей сети. Дальше масштабируйте на флот: по одному контейнеру и одному agent.env на агента, а лицензию и поддерживаемые платформы уточните в репозитории — в анонсе они не раскрывались.
Что такое NVIDIA OpenShell?
Рантайм для безопасного и приватного выполнения флотов автономных ИИ-агентов, опубликованный NVIDIA на GitHub в организации NVIDIA по адресу github.com/NVIDIA/OpenShell. Это среда запуска, а не модель и не фреймворк для промптов.
Какие платформы и лицензия у OpenShell?
В исходном анонсе эти данные не раскрыты. Проверяйте файл лицензии и раздел с поддерживаемыми платформами в самом репозитории — сверьтесь с документацией перед промышленным запуском.
Зачем запускать агентов в отдельном рантайме, а не на обычной машине?
Автономный агент сам выбирает команды, поэтому ему нужны ограничения: non-root, read-only корневая ФС, лимиты ресурсов и allowlist в сети. Рантайм даёт границу, внутри которой агент не достанет остальную систему.
Можно ли запустить OpenShell без Docker?
В анонсе способ запуска не описан. Если в README нет альтернативной инструкции, используйте контейнер — это воспроизводимый и проверяемый вариант; остальное сверьтесь с документацией репозитория.