はじめに

ローカル試験サーバーの実行

ローカルマシンに Werft サーバーを立ち上げ、API キーを取得する

Werft サーバーは API サーバー、scheduler、reconciler、セッションごとに起動する worker コンテナ、PostgreSQL、S3 (SeaweedFS)、サンプルリポジトリを配信する読み取り専用の Git サーバー、egress proxy で構成される。このページではそのすべてを Docker Compose で 1 台のマシンに立ち上げる。モデルはキーなしで動く fake モデルを使うため、Anthropic アカウントは不要である。

立ち上がると、サーバーのアドレスは http://127.0.0.1:3000 になる。SDK と curl の例は、このアドレスとここで取得する API キーでサーバーに接続する。

必要なもの

項目バージョン
Docker Engine28 以上
Docker Compose2.24.6 以上
curl, jq, uuidgen, git任意のバージョン

スタックは 127.0.0.1 にのみポートを開く。3000 (API・Web コンソール)、5432 (PostgreSQL)、4566 (S3)・4567 (LocalStack Secrets Manager)、3001 (読み取り専用の Git サーバー) が空いている必要がある。

docker version --format 'Docker Engine {{.Server.Version}}'
docker compose version
for p in 3000 5432 4566 4567 3001; do
  lsof -nP -iTCP:$p -sTCP:LISTEN >/dev/null 2>&1 && echo "사용 중: $p"
done

ポートが使用中であることを示す 사용 중: の行が出なければ、次に進める。

取得する

git clone https://github.com/JeongJaeSoon/werft.git
cd werft

立ち上げる

scripts/local.sh up --fake-model

初回はイメージをこの checkout からビルドするため、数分から 10 分ほどかかる。準備が終わると、最後の行に次が出力される。

{"status":"ready","checks":{"database":"ok","schema":"ok","config":"ok"}}

--fake-model を付けると、モデル呼び出しは compose 内の fake Messages API が受ける。worker の中では本物の Claude Code が動き、fake はメッセージに書かれたスクリプトどおりに答える (最初のセッションを作る)。オプションなしで scripts/local.sh up を実行すると、実際の Claude を呼び出し、費用がかかる。モデルの key は、コンソールの設定 > エージェント接続 > モデル接続 > 接続を追加で入れるのが基本で、シェルの ANTHROPIC_API_KEY で渡すのは代替手段である。key なしで起動しても fake には切り替わらず、モデル接続がない状態で起動する。

状態を確認する

scripts/local.sh status

api・scheduler・reconciler が running で、末尾に /readyz の応答があればよい。worker コンテナは常駐しない。scheduler がセッションごとに起動して削除する。

API キーを取得する

API=http://127.0.0.1:3000
KEY=$(scripts/local.sh key quickstart \
  --scopes sessions:read,sessions:write,sessions:approve,sessions:control,sessions:recover)
echo "${KEY:0:4}…"
key_id …
csp_…

key_id は stderr に出力されるキーの id である。キー本体は stdout に一度だけ出力される。再び見ることはできないので、変数にだけ保持する。quickstart はキーの owner 名で、このキーで作成したセッションはこの owner のものになる。scope は API キー にある。

SDK には baseUrl でサーバーのアドレス(API)を、apiKey でこのキーを渡す(SDK のインストール)。WERFT_API_KEY="$KEY" のように環境変数で渡してもよい。HTTP API の例は API と KEY を同じターミナルで引き続き使う。

停止する

scripts/local.sh down

scripts/local.sh down はスタックとすべてのデータ (セッション、checkpoint、API キー) を削除する。最初からやり直すには scripts/local.sh reset --fake-model を実行する。

データを残し worker コンテナとネットワークも片付けるには scripts/local.sh down --keep-volumes を実行する。再開は scripts/local.sh up --fake-model。PostgreSQL・S3 のデータは named volume に残る。S3 オブジェクトと暗号化キーは local-s3-data に保存され、Docker/OrbStack を再起動しても checkpoint を読める。

以前の LocalStack から移行するときは、pull 前に古い checkout でバックアップし、pull 後に未使用の新しい project へ復元する。失われたオブジェクトはバックアップなしでは復元できないため、参照を放棄するか明示的に判断する。移行・バックアップ手順を参照する。

うまくいかないとき

症状対処
Docker Engine … is too oldDocker Engine を 28 以上に上げる
127.0.0.1 port(s) … already in use上の lsof ループで、そのポートを使っているプロセスを探す
up が no ANTHROPIC_API_KEY … no model connection を出力し、セッションが接続なし(connection_missing)で拒否されるオプションなしの up は実際の Claude を使い、key なしでも起動する。設定 > エージェント接続 > モデル接続 > 接続を追加で key を入れる。モデルのアカウントなしで動かすには --fake-model を付ける
Docker を再起動した後に API が起動しないS3 volume・暗号化キー・ログを確認する。以前の LocalStack のデータ消失なら移行・バックアップ手順に従う
pull の後、up が has neither an image nor a build context specified または port is already allocated で終わるGit サーバーのサービス名が fake-git に変わった。ポート override ファイルのキーを直し、scripts/local.sh down --keep-volumes の後でもう一度 up する。以前のセッションは CATALOG_MISMATCH で止まるので、新しいセッションを開く

次のステップ

このページ