Как развернуть OpenHands на VPS через Docker
Узнайте, как безопасно установить OpenHands на удаленный сервер. Разбираем настройку Docker, ограничение прав доступа к сокету и защиту Web UI для предотвращения взлома.
Что такое OpenHands и главный риск, который нужно осознать
OpenHands, ранее известный как OpenDevin, — это автономный агент для разработки программного обеспечения. Вы даете ему задачу на обычном языке, и он планирует работу, пишет код, выполняет команды, считывает вывод и повторяет итерации до завершения задачи. Вы запускаете его на собственном сервере с помощью Docker и подключаете к языковой модели. На VPS он превращается в агента-программиста, который работает, пока вас нет.
Один факт должен определять всю вашу настройку. OpenHands не просто предлагает код, он его исполняет. Для этого контейнер контроллера монтирует сокет Docker хоста по пути /var/run/docker.sock, чтобы иметь возможность создавать изолированные контейнеры для каждой задачи. Любой процесс, имеющий доступ к сокету Docker, может запустить новый контейнер, который смонтирует всю файловую систему вашего хоста, что фактически равносильно получению прав root на машине. Поэтому относитесь к серверу с OpenHands как к системе, исполняющей недоверенный код, поскольку именно этим он и занимается. Все приведенные ниже рекомендации по обеспечению безопасности следуют из этого факта.
Что вам потребуется
Вам потребуется VPS под управлением Ubuntu 24.04 с актуальной версией Docker Engine, минимум 4 GB оперативной памяти и 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. Это единственное изменение определяет разницу между веб-интерфейсом, доступным только вам, и интерфейсом, доступным всему интернету, о чем пойдет речь в следующем разделе.
Ограничьте доступ к веб-интерфейсу из публичной сети
OpenHands предоставляет интерфейс через порт 3000. Этот интерфейс управляет агентом, который выполняет код, поэтому публикация его в Интернете дает любому пользователю удаленный доступ к процессу, исполняющему команды. Привяжите его к loopback-интерфейсу, как это сделано в команде запуска выше, и подключайтесь к нему со своего ноутбука через SSH-туннель:
ssh -L 3000:127.0.0.1:3000 you@your-vpsЗатем откройте http://127.0.0.1:3000 на своем компьютере. Трафик будет передаваться через существующую SSH-сессию, и никакой новый сервис не будет ожидать подключений из публичной сети. Не каждому агенту вообще нужен порт: сессии Claude Code на одном VPS обмениваются сообщениями через терминал, поэтому единственное, что вы открываете — это сам SSH. Эту привычку использовать loopback и туннелирование стоит применять к любой панели управления агентами, которую вы хостите; доступ к интерфейсу сканирования open-kritt через туннель работает точно так же, только через порт 5173. Для более постоянной настройки используйте VPN. В любом случае, установите межсетевой экран с политикой default-deny перед сервером, чтобы ничего не было открыто случайно. Помните, что межсетевой экран, настроенный только для IPv4, оставляет тот же порт открытым для IPv6 — это проблема IPv6 firewall gap, на которой попадаются многие администраторы.
Изоляция ключа модели и учетных данных репозитория
Для работы OpenHands требуется API-ключ модели, а также часто токен для клонирования и отправки изменений в репозитории. Оба этих ключа позволяют совершать финансовые операции и действовать от вашего имени, поэтому обращайтесь с ними как с паролями. Храните их в файле переменных окружения, доступном для чтения только соответствующей учетной записи. Никогда не передавайте их непосредственно в команде запуска, так как они попадут в историю командной оболочки и список процессов, и никогда не сохраняйте их в файлах внутри git-репозитория. Если вы храните оригиналы в собственном менеджере паролей, обеспечьте безопасность и этого сервера. Слабыми местами хранилища являются административный токен и файл резервной копии, а не сами зашифрованные данные, что подробно описано в руководстве по защите Vaultwarden.
Запуск на одноразовом сервере
Так как контроллер должен иметь доступ к Docker socket, вы не можете полностью изолировать OpenHands от хостовой системы. Единственный честный способ защиты — изоляция через размещение: запускайте OpenHands на выделенном VPS, на котором нет других важных данных, а не на сервере, где работают ваша база данных или веб-сайт. Сделайте snapshot перед началом работы и восстанавливайтесь из него, вместо того чтобы доверять серверу, на котором неделю выполнялся код, написанный агентом. Дешёвый, одноразовый, узкоспециализированный VPS — лучшее место для этого. Размещение — единственный рычаг управления, который OpenHands предоставляет в данном случае. Если вы хотите дополнительно контролировать действия агента до того, как он запросит подтверждение, режимы разрешений Claude Code показывают, как выглядит этот второй уровень защиты на сервере, за которым никто не следит.
Укрепление безопасности сервера
Остальные действия относятся к стандартной гигиене администрирования серверов. В данном случае это критически важно, так как рабочая нагрузка несет повышенные риски. Создайте непривилегированного пользователя с правами администратора вместо работы под root, следуя руководству запуск сервисов от имени непривилегированного пользователя. Переведите SSH на аутентификацию только по ключам. Затем выполните приведенный ниже контрольный список и сохраните его в доступном месте для последующего использования.
Чтобы понять принципы работы компонентов, а не просто запустить их, ознакомьтесь с созданием собственного AI-агента на VPS; для платформы с низким порогом вхождения изучите самостоятельный хостинг Dify.
FAQ
Безопасно ли запускать OpenHands на сервере?
Это возможно при соблюдении мер предосторожности, но такой подход более рискован, чем использование обычного веб-приложения. OpenHands пишет и исполняет код, а его контроллер имеет доступ к Docker socket хоста, что фактически равносильно правам root на машине. Запускайте его на выделенном одноразовом VPS, где нет других ценных данных. Держите веб-интерфейс доступным только через loopback за SSH-туннелем или VPN, изолируйте ключи и обеспечьте безопасность системы. Не запускайте его рядом с важными сервисами.
Зачем OpenHands нужен Docker socket?
OpenHands выполняет каждую задачу в отдельном изолированном контейнере. Для этого он обращается к Docker daemon хоста с просьбой создать такие контейнеры, монтируя /var/run/docker.sock в свой контроллер. Это дает контейнеру контроллера управление Docker на хосте, что является мощной, но рискованной возможностью. Поэтому сам хост должен рассматриваться как среда, где исполняется недоверенный код.
Может ли OpenHands использовать локальную модель вместо платного API?
Да. OpenHands поддерживает локальные модели, работающие через Ollama или vLLM. Вы можете запустить его полностью автономно, без оплаты за токены и без передачи данных за пределы вашего сервера. Вам потребуется машина с достаточным объемом оперативной памяти для работы производительной модели программирования — требования к ресурсам аналогичны тем, что описаны в руководстве по Ollama.
Стоит ли запускать OpenHands на основном сервере?
Нет. Поскольку OpenHands исполняет код, созданный агентом, и имеет доступ к Docker socket, размещайте его на отдельном VPS узкого назначения, который вы готовы переустановить в любой момент. Совместное размещение с базой данных, веб-сайтом или другими сервисами означает, что ошибка агента или баг в нем могут привести к доступу к ресурсам, которые не должны были быть затронуты.