開始

Crabbox の仕組み

Crabbox の仕組み

初めて使う方、全体像を知りたい方、変更前に責任範囲を確認したい方のための説明です。

#概要

Crabbox はエージェントと人にオンデマンドマシンを提供します。ローカルで編集し、Linux、macOS、ネイティブ Windows、WSL2 の別マシンでテストやビルドを動かせます。共有フリートでは次が協力します。

  • CLI(cmd/crabbox、internal/cli):取得、変更済みツリーの同期、実行、出力、解放。
  • コーディネーター(worker/src):認証情報、リース状態、期限、清掃、使用量、費用制限。Cloudflare Workers + Durable Object または Node.js + PostgreSQL + pg-boss で稼働します。

ランナーはブローカーのシークレットを保持しません。セットアップ、依存関係、仕事はリポジトリの責任です。コーディネーターは記録・ログ・テレメトリーを保持しますが、画像などの成果物は解放前に取得・公開してください。直接プロバイダーはコーディネーター不要です。

#構成要素

┌──────────────────────┐   HTTPS / JSON   ┌───────────────────────────┐
│ your machine         │ ───────────────► │ coordinator runtime       │
│ crabbox CLI          │  bearer + owner  │ Cloudflare + Durable Obj. │
│ repo checkout        │                  │ or Node.js + PostgreSQL   │
│ per-lease SSH key    │                  │ provider creds + state    │
└──────────┬───────────┘                  └────────────┬──────────────┘
           │                                         │ provider API
           │                                         ▼
           │                          ┌──────────────────────────────┐
           │ SSH (primary + fallback) │ managed cloud or sandbox     │
           └────────── rsync ────────►│ runner host                   │
                                      │ /work/crabbox/<lease>/<repo> │
                                      └──────────────────────────────┘

通常の CLI は HTTPS で取得後、SSH/rsync でランナーへ直接接続します。通常の実行でランナーからコーディネーターへの呼び出しはなく、実行経路は一方向です。コーディネーターはリースを管理し、チェックアウト転送や実行はしません。CLI は別途メタデータ、プレビュー、ログ、結果を送信し、ポータルの対話ブリッジも経由します。非公開 AWS ワークスペースは SSH データプレーンのない独立した SSM-only API です。

長時間処理は認証済み /v1/control WebSocket でイベント購読とハートビートを送り、遅延の大きい回線でのポーリングを減らせます。HTTPS が正規の保存先兼互換フォールバックなので古い組み合わせも動作します。

#責任範囲

層担当
CLI設定・フラグ、リース専用 SSH 鍵、準備確認、Git/rsync、指紋・整合性確認、コマンド・出力、制御 WebSocket と HTTP 代替、解放
Broker認証・ID、直列化した状態、認証情報、作成削除、期限、照会、記録・ログ・イベント・テレメトリー、使用量・上限
Provider計算資源。アダプターが Hetzner、AWS EC2、Azure VM、GCP などを作成削除
Runner永続的責務なし。Linux の SSH/Git/rsync/作業ルート、他 OS の個別初期化、既存の静的 SSH。プロジェクトのランタイムはリポジトリで準備

#crabbox run の動作

通常のブローカー付き SSH 実行は 5 段階です。直接プロバイダーはローカルでライフサイクルを管理し、委譲型は通信・実行を所有します。

1. 計画。フラグ → 環境 → リポジトリ → ユーザー → 既定の順に設定を読みます。cbx_ と 12 桁の 16 進数の一時 ID、および <user-config>/crabbox/testboxes/<lease>/id_ed25519 に鍵を作ります(AWS/Azure Windows は RSA)。

2. 取得。クラス、プロバイダー、対象、TTL、アイドル期限、slug、機能、公開鍵を POST /v1/leases へ送ります。コーディネーターが認証・変更直列化・同時数と月額制限・実価格取得・最大 TTL 費用予約を行い、地域や市場の代替を使って作成します。ホスト、ユーザー、ポート、作業ルート、期限、確定 ID、slug を返します。ID が変われば CLI の鍵ディレクトリも移します。

3. 同期。SSH と準備プローブを待ち、origin/ベース参照から Git を準備します。指紋一致なら省略。不一致なら POSIX は rsync(Linux は /work/crabbox/<lease>/<repo>)、ネイティブ Windows はマニフェスト tar で転送し、整合性チェックと対応する基準履歴の準備を行います。

4. 実行。裏でハートビートを送り、SSH 実行の stdout/stderr を返します。ブローカーには段階別イベントを記録します。

5. 解放。新規リースは --keep がなければ解放、明示的な --id 再利用は保持します。--stop-after で上書き可能です。プロバイダーが清掃し予約費用を戻します。新規・非保持で SSH 準備前に失敗した場合、crabbox run は一度だけ交換します。保持・明示再利用でコマンドを重複しません。

#ウォームマシンと再利用

crabbox warmup は同じ作成処理で、実行せず待機させます。slug/ID で明示再利用します。

crabbox warmup --profile project-check --slug blue-lobster
crabbox run --id blue-lobster -- pnpm test:changed
crabbox ssh --id blue-lobster
crabbox stop blue-lobster

各リースには cbx_… ID と slug があり、自動 slug は blue-lobster-1f3a9c2b のような 8 桁指紋付きです。--slug で指定し、多くは --id で両方使えます。ハートビートが lastTouchedAt とアイドル期限を更新します。放置すると永続スケジューラーが解放します。

#ブローカー経由と直接接続

通常はブローカー経由です。

CLI -> coordinator (Cloudflare or Node/PostgreSQL) -> provider API
CLI -> runner over SSH/rsync

共有インフラに適し、シークレットはローカルに渡さず清掃・費用・使用量を集中管理します。hetzner、aws、azure、daytona、gcp で、CRABBOX_COORDINATOR または config set-broker の URL があるときのみ有効です。

未設定なら直接接続します。

CLI -> provider API
CLI -> runner over SSH/rsync

AWS SDK の認証チェーンや Hetzner token などローカル認証が必要です。中央履歴とブローカー心拍はありません。ブローカー診断や、サンドボックス・静的 SSH・ローカルコンテナーなど直接専用アダプターに使います。

broker.mode: registered は直接経路を維持し、所有者別メタデータと心拍だけをミラーします。ポータル一覧、任意共有、アウトバウンド WebVNC を追加し、鍵や清掃権限は移しません。解放は既定でメタデータ削除のみ。明示的に結び付けたアダプターはユーザー確認でワークスペースを削除できます。登録は管理対象のクォータ・費用・イメージ・プール・保守に入りません。

静的 SSH(provider: ssh)は URL があっても直接です。macOS と WSL2 は POSIX rsync、ネイティブ Windows は PowerShell/tar を使います。

#認証と ID

ユーザーは署名済み GitHub token、信頼する自動化は共有 bearer token を使います。Cloudflare Access を追加でき、Node は指定したリバースプロキシ CIDR の ID ヘッダーだけ信頼します。

Authorization: Bearer <token>
X-Crabbox-Owner: <email>
X-Crabbox-Org: <org>

crabbox login の所有者は不変の github:<numeric-id>。共有 token は CRABBOX_OWNER、Git メール環境、git config user.email から選び、CRABBOX_ORG が組織です。未検証 Access ヘッダーは無視し、検証済み JWT のメールだけを使います。セキュリティを参照してください。

#同期モデル

クリーンなチェックアウトは不要で、ローカルを基準にします。

  • origin/ベース参照から Git を準備;
  • 変更ファイルを rsync、任意のチェックサム;
  • 指紋で不要な同期を省略;
  • 大きなディレクトリを設定で除外;
  • 追跡ファイルの大量削除を警戒;
  • 変更テスト向けに基準履歴を準備。

エージェントも人もローカル編集・遠隔実行です。crabbox sync-plan で読み取り専用プレビューできます。

#費用と使用量

リースには 2 種類の金額があります。

estimatedUSD   elapsed runtime cost so far
reservedUSD    worst-case TTL cost reserved before provisioning

時間単価の優先順位:

1. CRABBOX_COST_RATES_JSON   explicit override
2. provider live pricing     e.g. EC2 spot history, Hetzner server-type prices
3. built-in fallback rates   last-resort defaults

Hetzner の換算は CRABBOX_EUR_TO_USD。CRABBOX_MAX_* は全体・所有者・組織の同時数と月額ドル上限で、超過は HTTP 429 です。crabbox usage は GET /v1/usage をユーザー・組織・プロバイダー・タイプ別に表示します。

#障害と清掃

クラッシュ、切断、cloud-init 失敗、部分成功、再試行、プロセスより長く残るマシンを前提にします。

  • フリート判断を直列化;
  • 可能な限り冪等な作成;
  • Crabbox タグ;
  • 繰り返して安全な解放;
  • Durable Object アラームまたは pg-boss と定期照合で期限清掃;
  • 直接清掃は保守的;
  • ブローカー清掃はブローカー所有。

コーディネーター設定時、crabbox cleanup は資源清掃を拒否します。その責任はコーディネーターにあります。

#次に読む