Как установить OpenHands на VPS через Docker
Инструкция по развертыванию OpenHands на VPS. Узнайте, как безопасно настроить Docker socket и защитить систему от выполнения вредоносного кода через sandbox.
Что такое OpenHands и какой риск нужно учитывать в первую очередь
OpenHands (ранее OpenDevin) — это автономный агент для разработки программного обеспечения. Вы ставите ему задачу на обычном языке, а он планирует работу, пишет код, выполняет команды, считывает вывод и повторяет циклы до завершения задачи. Вы запускаете его на собственном сервере с помощью Docker и подключаете к языковой модели. На VPS он превращается в агента для кодинга, который работает, пока вы отсутствуете.
Один факт определяет всю конфигурацию. OpenHands не просто предлагает код, он запускает его. Для этого контейнер-контроллер монтирует Docker socket хоста по пути /var/run/docker.sock, чтобы иметь возможность создавать песочницы (sandbox) для каждой задачи. Любой процесс, имеющий доступ к Docker socket, может запустить новый контейнер с полным монтированием всей файловой системы хоста. Это означает, что доступ к сокету фактически эквивалентен правам root на машине. Поэтому рассматривайте сервер с OpenHands как систему, на которой выполняется недоверенный код. Все рекомендации по защите ниже основаны на этом принципе.
Что вам потребуется
Вам понадобится VPS с Ubuntu 24.04 и актуальной версией Docker Engine, минимум 4 GB RAM, а также API-ключ для языковой модели (OpenAI, Anthropic или Google) или локальная модель, запущенная через Ollama на том же VPS. OpenHands поддерживает десятки бэкендов моделей, поэтому выбор за вами. Если вы никогда не настраивали контейнеры, основы Docker на VPS объясняют всё, что подразумевается в данном руководстве.
Установка с помощью Docker
OpenHands поставляется в виде двух образов: образа приложения, который вы запускаете, и образа agent-server, который он скачивает для запуска песочницы каждой задачи. Запустите его следующим образом, используя актуальные теги из документации проекта:
docker run -it --rm --pull=always \
-e AGENT_SERVER_IMAGE_REPOSITORY=ghcr.io/openhands/agent-server \
-e AGENT_SERVER_IMAGE_TAG=1.26.0-python \
-e LOG_ALL_EVENTS=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v ~/.openhands:/.openhands \
-p 127.0.0.1:3000:3000 \
--add-host host.docker.internal:host-gateway \
--name openhands \
docker.openhands.dev/openhands/openhands:1.8Две детали сэкономят вам час времени. Образы приложения и agent-server намеренно имеют разные номера версий, поэтому не пытайтесь их синхронизировать: используйте тег agent-server, который указан в документации для вашей версии приложения. Также обратите внимание на -p 127.0.0.1:3000:3000 вместо -p 3000:3000. Это единственное изменение, которое определяет, будет ли Web UI доступен только вам или всему интернету; об этом в следующем разделе.
Изоляция Web UI от публичного интернета
OpenHands предоставляет интерфейс на порту 3000. Этот интерфейс управляет агентом, который запускает код. Публикация интерфейса в интернете дает любому нашедшему удаленный доступ к процессу выполнения команд. Привяжите интерфейс к loopback, как показано в команде запуска выше, и подключайтесь к нему со своего ноутбука через SSH-туннель:
ssh -L 3000:127.0.0.1:3000 you@your-vpsЗатем откройте http://127.0.0.1:3000 на своей локальной машине. Трафик пойдет через ваше существующее SSH-соединение, и в публичном интернете не будет открытых портов. Для более постоянной работы используйте VPN. В любом случае настройте межсетевой экран (firewall) по принципу «запрещено всё, что не разрешено», чтобы ничего не было открыто случайно. Помните, что firewall, настроенный только для IPv4, оставляет тот же порт открытым в IPv6 — это уязвимость IPv6 firewall, на которой многие обжигаются.
Изоляция ключей моделей и учетных данных репозиториев
OpenHands требуется API-ключ для модели и часто токен для клонирования и отправки кода в ваши репозитории. Оба параметра могут тратить деньги и действовать от вашего имени, поэтому обращайтесь с ними как с паролями. Храните их в файле окружения, доступном только нужному аккаунту. Никогда не передавайте их в команде запуска, так как они попадут в историю shell и список процессов, и никогда не храните их в файлах внутри git-репозитория.
Запуск на «одноразовом» сервере
Поскольку контроллер должен иметь доступ к Docker socket, вы не можете полностью изолировать OpenHands от хоста. Единственный эффективный способ минимизации рисков — изоляция путем размещения: запускайте OpenHands на выделенном VPS, на котором нет других важных данных. Не запускайте его на сервере, где также работают ваша база данных или веб-сайт. Сделайте snapshot перед началом работы и восстанавливайтесь из него, а не доверяйте системе, на которой неделю выполнялся код, написанный агентом. Дешевый, одноцелевой и легко заменяемый VPS — лучший вариант для него.
Защита сервера
Остальное — это стандартная гигиена сервера. Здесь это важнее обычного, так как рабочая нагрузка более рискованна. Создайте непривилегированного пользователя-администратора вместо работы под root, следуя принципам запуска сервисов от непривилегированного пользователя. Настройте SSH только для аутентификации по ключам. Затем выполните приведенный ниже чек-лист и сохраните его.
Чтобы понять внутренние процессы, а не просто запускать их, изучите создание собственного AI-агента на VPS; для более простых платформ подойдет self-hosting Dify.
FAQ
Безопасно ли запускать OpenHands на сервере?
Это возможно при соблюдении осторожности, но это рискованнее, чем обычное веб-приложение. OpenHands пишет и запускает код, а его контроллер имеет доступ к Docker socket хоста, что фактически дает права root. Запускайте его на выделенном одноразовом VPS без других ценных данных, держите Web UI на loopback через SSH-туннель или VPN, изолируйте ключи и защитите систему. Не запускайте его рядом с важными сервисами.
Зачем OpenHands нужен Docker socket?
OpenHands запускает каждую задачу в чистом контейнере-песочнице. Он просит Docker daemon хоста создать эти контейнеры, монтируя /var/run/docker.sock в свой контроллер. Это дает контейнеру-контроллеру управление Docker на хосте. Это мощная, но опасная возможность, поэтому к хосту нужно относиться как к системе, выполняющей недоверенный код.
Может ли OpenHands использовать локальную модель вместо платного API?
Да. OpenHands поддерживает локальные модели через Ollama или vLLM. Вы можете запустить его полностью автономно без оплаты за токены и без передачи данных на внешние серверы. Вам потребуется машина с достаточным объемом памяти для подходящей модели кодинга (см. руководство по Ollama).
Стоит ли запускать OpenHands на основном сервере?
Нет. Поскольку агент запускает сгенерированный им код и имеет доступ к Docker socket, держите его на отдельном одноцелевом VPS, который не жалко переустановить. Размещение его на одном сервере с базой данных, сайтом или другими сервисами означает, что ошибка агента или баг в нем могут затронуть данные, к которым у него не должно быть доступа.