OpenHandsをVPSにセルフホストする方法と注意点
OpenHandsをVPS上のDockerで構築する手順を解説します。Docker socketをマウントするため、root権限と同等のリスクがある点に注意が必要です。セキュリティを確保するために、Web UIのアクセス制限と環境変数の管理を徹底し、安全なAIエージェント環境を構築しましょう。
OpenHandsの概要と、最初に理解すべき唯一のリスク
OpenHands(旧OpenDevin)は、自律型のソフトウェアエンジニアリングエージェントです。自然言語でタスクを指示すると、作業の計画、コードの記述、コマンドの実行、出力の読み取りを行い、タスクが完了するまで反復処理を行います。Dockerを使用して自身のサーバー上で実行し、言語モデルを指定します。VPS上で実行すれば、離れている間も作業を続けるコーディングエージェントになります。
設定において最も重要な事実があります。OpenHandsは単にコードを提案するだけでなく、実際に実行します。そのため、コントローラーコンテナは各タスクのサンドボックスコンテナを生成するために、ホストのDocker socketを /var/run/docker.sock にマウントします。Docker socketにアクセスできるものは、ホストのファイルシステム全体をマウントした新しいコンテナを開始できます。つまり、socketへのアクセスは実質的にそのマシンのroot権限と同等です。OpenHandsを実行するマシンは、信頼できないコードを実行するサーバーとして扱ってください。以下に示すすべてのセキュリティ対策は、この事実に基づいています。
必要なもの
Ubuntu 24.04を搭載したVPS、最新のDocker Engine、少なくとも4 GBのRAM、および言語モデルのAPIキー(OpenAI、Anthropic、またはGoogle)、あるいは 同じVPS上のOllama によるローカルモデルが必要です。OpenHandsは数十種類のモデルバックエンドをサポートしています。VPSでの Dockerの基本 を理解していることを前提としています。
Dockerによるインストール
OpenHandsは2つのイメージとして提供されます。実行するアプリケーションイメージと、各タスクのサンドボックスを実行するためにプルされる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混乱を防ぐための2つの注意点があります。アプリケーションイメージとagent-serverイメージは意図的に異なるバージョン番号を持っています。これらを一致させようとしないでください。ドキュメントでアプリケーションのバージョンとペアになっているagent-serverのタグを使用してください。また、-p 3000:3000 ではなく -p 127.0.0.1:3000:3000 であることに注意してください。この1文字の違いにより、自分だけがアクセスできるWeb UIになるか、インターネット全体からアクセス可能になるかが決まります。これについては次のセクションで説明します。
Web UIをパブリックインターネットから隔離する
OpenHandsはポート3000でインターフェースを提供します。このインターフェースはコードを実行するエージェントを制御するため、インターネットに公開すると、発見した誰にでもコマンドを実行するプロセスへのリモートパスを与えることになります。上記の実行コマンドのようにループバックにバインドし、SSHトンネルを介してノートPCからアクセスしてください。
ssh -L 3000:127.0.0.1:3000 you@your-vpsその後、自身のマシンで http://127.0.0.1:3000 を開きます。トラフィックは既存のSSHセッションを経由するため、パブリックインターネット上に新しいリスナーは現れません。より永続的な設定にするには、代わりにVPNの背後に配置してください。いずれにせよ、誤って公開されないよう、マシンにデフォルト拒否(default-deny)のファイアウォールを設置してください。また、IPv4のみをカバーするファイアウォールはIPv6でも同じポートを開放したままにするため、これは多くの人が陥る IPv6ファイアウォールの隙間 となります。
モデルのAPIキーとリポジトリの認証情報を隔離する
OpenHandsにはモデル用のAPIキーと、リポジトリへのクローン・プッシュ用のトークンが必要です。これらは費用を発生させ、ユーザーとして動作できるため、パスワードと同様に扱ってください。これらは適切なアカウントのみが読み取れる環境変数ファイルに保存してください。シェル履歴やプロセスリストに残る実行コマンド内や、gitリポジトリ内のファイルには絶対に記述しないでください。
再構築可能なマシンで実行する
コントローラーがDocker socketを保持する必要があるため、OpenHandsをホストから完全にサンドボックス化することはできません。現実的な対策は、配置による隔離です。データベースやウェブサイトを動かしているサーバーではなく、他に重要なデータを持たない専用のVPSでOpenHandsを実行してください。開始前にスナップショットを作成し、エージェントが作成したコードを1週間実行し続けたマシンを信頼するのではなく、そのスナップショットから再構築してください。安価で使い捨て可能な、単一目的のVPSが最適な環境です。
マシンの要塞化(Hardening)
残りは標準的なサーバーの衛生管理ですが、ワークロードのリスクが高いため、通常よりも重要です。非特権ユーザーでのサービス実行 に従い、rootではなく非特権の管理者ユーザーを作成してください。SSHは鍵認証のみに設定してください。その後、以下のチェックリストを実行し、後で見返せる場所に保存してください。
単に実行するだけでなく、仕組みを理解するには VPSでの独自のAIエージェントの構築 を参照してください。コードをあまり書かずに利用したい場合は、Difyのセルフホスティング の方が導入が容易です。
FAQ
OpenHandsをサーバーで実行するのは安全ですか?
注意を払えば可能ですが、コードを書き込み実行すること、およびコントローラーが実質的なroot権限を持つホストのDocker socketを保持していることから、通常のWebアプリよりもリスクが高いです。価値のあるデータを持たない専用の使い捨てVPSで実行し、Web UIはSSHトンネルまたはVPN経由のループバックに留め、キーを隔離し、マシンを要塞化してください。重要なサービスと同じ場所に実行しないでください。
なぜOpenHandsはDocker socketを必要とするのですか?
OpenHandsは各タスクを新しいサンドボックスコンテナ内で実行します。そのため、/var/run/docker.sock をコントローラーにマウントすることで、ホストのDockerデーモンにコンテナの作成を要求します。これにより、コントローラーコンテナはホスト上のDockerを制御できるようになります。これは強力かつ危険なため、ホスト自体を信頼できないコードを実行する環境として扱う必要があります。
有料APIの代わりにローカルモデルを使用できますか?
はい。OpenHandsはOllamaまたはvLLMによって提供されるローカルモデルをサポートしています。そのため、トークンごとのコストをかけず、データをサーバー外に出すことなく、完全にセルフホストで実行できます。実行には、高性能なコーディングモデルを動かすのに十分なメモリを持つマシンが必要です。これはOllamaのガイドで説明されているメモリ容量の問題と同じです。
メインのサーバーでOpenHandsを実行すべきですか?
いいえ。エージェントが作成したコードを実行し、Docker socketを保持するため、再構築を厭わない別の単一目的のVPSで実行してください。データベース、ウェブサイト、またはその他のサービスと同じ場所に配置すると、エージェントのミスやバグが、本来触れるべきでないリソースにまで到達する可能性があります。