Grandream

Grandream

公開: 9 min read

Orca ADEをSandboxへ繋ぐ|Docker Sandboxes

Orca ADEをSandboxへ繋ぐ|Docker Sandboxes
AIエージェントの開発をご検討中ですか? AIエージェント開発サービスを見る →

連載「Docker Sandboxesでコーディングエージェントを隔離する」第7回(最終回)/検証日: 2026年8月23日/sbx 0.39.0・Orca 1.4.182

第5回でCodex AppとClaude DesktopからSSHで入れるところまで作りました。最後は、同じSandboxをOrca ADEの実行ホストとして登録します。

ssh sampleapp.sbx -- echo connectedは最初から通っていました。それでもOrcaからは動かず、層の違う2箇所で詰まりましたnode-ptyのビルドでg++が見つからず、その次は「projectは認識しているがsetupされていない」と言われる。どちらもSSHの問題ではありません。

繋ぐまでに層が4つある

remote IDEを繋ぐ作業は、成功条件が段になっています。ここを分けずに触ると、直した場所と直った理由が対応しません。

成功条件

Docker Sandbox

sbx lsに対象がある

OpenSSH

ssh sampleapp.sbx -- echo connectedが通る

Orca relay upload

Orcaが接続先へrelayを配置できる

Orca relay build

relayの依存(native addon含む)をremote側でインストールできる

Orca project host setup

そのホスト上のGit checkoutパスがreadyで登録されている

Agent session

Codex/Claudeのterminalが対象worktreeで起動する

plain SSHが通ることは、上から2段目の合格でしかありません。 今回詰まったのは4段目と5段目で、対処先はそれぞれ別でした。

順番も決まっています。plain SSHを先に証明してからOrcaを触る。逆にすると、Orca側の設定をいくら変えても通らない状態で時間を使います。

sbx daemon status
sbx ls
ssh sampleapp.sbx -- echo connected   # ここまで通してからOrcaへ

Orca側の登録も、接続とproject setupの2段

Orcaの設定は2箇所です。まずConnections(remote host設定)へSSH接続を1つ追加します。

SSH Host: sampleapp.sbx
SSH Port: 空欄
Username: 空欄
Identity File: 空欄

Port・Username・鍵をすべて空欄にできるのは、第5回で書いたとおり認証をdaemonとDocker loginが担うからです。~/.ssh/configにはwildcardのHost *.sbxが入るだけなので、UIの候補一覧にsampleapp.sbxが出てこないことがあります。その場合はhostnameを手入力します。

Codex・Claude・Orcaのすべてを同じsampleapp.sbxへ向けます。第6回で決めたとおりSandboxは1つなので、接続先も1つです。

もう1箇所がproject host setupで、これが後述するエラー3の舞台になります。

詰まり1: node-ptyg++を探して落ちる

Orcaがremote側で実行したのはこれです。

npm install --ignore-scripts=false --omit=dev --no-audit --no-fund \
  'node-pty@1.1.0' '@parcel/watcher@2.5.6'

そして失敗しました。ログの要点だけ抜き出します。

node@22.12.0 | linux | arm64
Rebuilding because .../prebuilds/linux-arm64 does not exist
gyp info spawn make
make: g++: No such file or directory
make: *** [pty.target.mk:117: Release/obj.target/pty/src/unix/pty.o] Error 127

読む順番はこうです。Node.jsは起動していて、headerのdownloadも済み、Pythonとmakeも見つかっている。linux-arm64用のprebuiltバイナリが無いのでソースビルドへfallbackし、その最初のコンパイルでC++コンパイラが無くて止まった。つまりNode.jsやnpmの問題ではなく、OS側のビルドツールチェーンの不足です。

ここが今回いちばん学びのあった点でした。アプリ本体がnative addonを使っていなくても、remote IDE側がterminalやfile watcherのためにC/C++ツールチェーンを要求します。今回の要求元はnode-pty@parcel/watcherで、どちらもアプリの依存ではありません。npm ciが通る環境かどうかでは発見できない要件です。Apple silicon上でもSandbox内はLinux arm64で、この組み合わせのprebuiltが無いことも重なりました。

診断のためなら、Sandbox内で直接入れて確かめられます。

sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential

ただし手で入れた分はSandboxを作り直すと消えるので、恒久対策はKit(第1回)に書くことです。置く位置に注意が必要でした。第1回のinstall処理はNode.jsが期待バージョンなら早期にexit 0しますが、build-essentialはその判定より前に置きます。Node.jsが揃っているだけでは、node-gyp rebuildは通りません。

        apt-get update
        env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
          build-essential ca-certificates curl vim xz-utils

        expected_node="v22.12.0"
        if [ "$(node --version 2>/dev/null || true)" = "$expected_node" ]; then
          exit 0
        fi

入ったかどうかは、sbx execとSSHの両方から見ます。経路が違うので、片方だけ通ることがあります。

sbx exec sampleapp g++ --version
ssh sampleapp.sbx -- g++ --version

余談ですが、同じログにはfind Python using Python version 3.14.xも出ていました。新しいPythonが目に入ると原因に見えますが、実際に落ちたのはその後のg++: No such file or directoryです。versionやwarningより、最後に失敗したコマンドとexit codeを優先します。

詰まり2: project tracked ... but not set upはSSH障害ではない

ツールチェーンを入れたら接続エラーは消え、代わりにOrcaがこう言いました。

project tracked on this host but not set up

紛らわしい表示ですが、接続は成功しています。OrcaはプロジェクトとSSH hostの組み合わせを認識した一方で、そのホスト上のcheckoutパスが未登録という状態です。概念的にはこうなっています。

{
  "projectId": "github:example-org/sampleapp",
  "hostId": "ssh:<ssh-host-id>",
  "path": "",
  "setupState": "not-set-up"
}

pathが空なので、直すのはpathだけです。ここでSSH設定やNode.jsやbuild-essentialを触り直す必要はありません。エラーが指している層にだけ手を入れます。

登録するpathは推測しません。SSH接続直後の初期ディレクトリは/home/agent/workspaceでしたが、ここはGit checkoutではありませんでした。作業先はSandbox内のprivate cloneで、パスはバージョンや作成方法で変わり得ます。

sbx exec sampleapp git rev-parse --show-toplevel
ssh sampleapp.sbx -- git rev-parse --show-toplevel

git rev-parse --show-toplevelが返す場所をsource of truthにします。登録先が満たすべき条件は4つです。

  • .gitが存在する
  • git remote -vが想定のリポジトリを指す
  • 読み書きできるprivate cloneである
  • /run/sandbox/sourceではない

最後の1つは第1回で書いた読み取り専用マウントです。参照元なので登録してはいけません。

OrcaのUIでは、該当プロジェクトのhost setupから次を指定します(表記はバージョンで多少変わります)。

  • Host: sampleapp.sbx
  • Method: Existing folderClone repositoryではない)
  • Path: git rev-parseで確認したprivate cloneの絶対パス
  • Kind: Git

sbx create --cloneがすでにcheckoutを作っているので、Orcaに再cloneさせる必要はありません。保存後はpathが埋まりsetupStatereadyになります。

project setupはSSH host単位です。Sandboxを1つに統合した構成(第6回)では、この登録も1回で済みます。エージェントごとにSandboxを分けていたら、ホストごとに同じ作業を繰り返すことになっていました。

状態はCLIから確認できます。

orca status --json          # runtime.appVersion もここで分かる
orca project list --json
orca project setups --json

Orca 1.4.182のCLI helpにはproject setup-existing-folderがあります。ただし同じhelpに、SSH targetの設定はdesktop clientがSSH connectionを所有するためUIから行うと明記されています。CLIで無理に通そうとしないほうが早いです。これらのJSONをissueや記事へ貼るときは、project ID・host ID・ユーザー名・絶対パスを匿名化します。

Kitの直しはsbx kit addで既存Sandboxへ入ることがある

build-essentialの追加のように、Kitへ後から足したい変更が出てきます。第5回では「Kit変更は作り直し」と書きましたが、mixinの変更内容によっては既存Sandboxへ適用できます。

sbx kit add sampleapp ./.sbx/sampleapp

sbx kit は手元の0.39.0では experimental 表示付きのコマンド群です。挙動が変わり得る前提で使います。

対応範囲外の変更(agent type、workspace mode、port mappingなど)は作り直しです。作り直す前に未pushの変更を確認する手順は第5回のままです。

日常はhostを固定して、agentだけ切り替える

ここまで通ると、普段の操作は2択になります。

作業

Agent

Host

実装

Codex

sampleapp.sbx

レビュー

Claude

sampleapp.sbx

hostは固定で、taskに応じてagentを選ぶだけです。同じprivate cloneなので、未コミット変更もbranchも開発サーバーもそのまま引き継がれます(第6回)。並列で動かすときだけ、Sandbox内でGit worktreeを分け、branch切り替えの前に他sessionの状態を見ます。

環境が壊れたら、Kitとランチャーと Gitから作り直せます。手で入れたものが無い状態を保つ限り、再構築はsetup一発です。

まとめ

第7回の要点です。

  • remote IDEの接続は層になっている。plain SSHが通ることは全体の成功条件ではない
  • remote IDEはterminalやfile watcherのためにC/C++ツールチェーンを要求する。build-essentialはKitへ、しかもNode.jsの早期exit 0より前に置く
  • project tracked ... but not set upはSSH障害ではなくpath未登録。git rev-parse --show-toplevelで実checkoutを特定し、/run/sandbox/sourceは登録しない
  • project setupはSSH host単位。Sandboxを1つにしていれば登録も1回
  • ログはversionやwarningより、最後に失敗したコマンドとexit codeを読む

連載はここまでです。7回を通して繰り返し出てきたのは、境界を1つずつ決めて、壊れた層だけを直すという進め方でした。ホストとSandboxの境界、エージェント同士の境界、credentialの境界、そして接続の層。どれも一度決めて書き残せば、次に同じ場所で迷いません。

連載の構成

  1. clone modeで作る初期設定
  2. 1つのSandboxにCodexとClaudeを同居させる
  3. GH_TOKENで権限を絞る
  4. sentinelが見えても注入は成功していない
  5. Codex AppとClaude Desktopから入る
  6. Sandboxを1つにした判断
  7. Orca ADEをSandboxへ繋ぐ(本記事)

参考資料


本記事はsbx 0.39.0・Orca 1.4.182で2026年8月23日に検証した内容です。Orca固有のproject host setupと「SSH targetはデスクトップUIで設定する」という記述は、version-matchedのCLI helpと実測に基づきます。将来のバージョンではUI名もCLIの対応範囲も変わり得ます。

関連記事

Grandream

Grandream

株式会社グランドリーム

AI・システム開発のプロフェッショナルチームです。AIエージェント・業務自動化・Webシステム開発などを手がけています。

AIエージェント開発のご相談はお気軽に

PoC段階から本番運用まで一貫対応します。

AI開発について相談する

AIエージェント開発サービスの詳細を見る →

どのサービスが合うか30秒で診断する →