FleetFlow(KDLベースのコンテナオーケストレーションツール)を効果的に使用するためのガイド
This skill inherits all available tools. When active, it can use any tool Claude has access to.
FleetFlowをプロジェクトで効果的に活用するための包括的なガイドです。
fleetflow / flow / ffFleetFlowは、KDL(KDL Document Language)をベースにした超シンプルなコンテナオーケストレーションツールです。
コンセプト: 「宣言だけで、開発も本番も」
| 特徴 | 説明 |
|---|---|
| 超シンプル | Docker Composeと同等以下の記述量 |
| 可読性 | YAMLより読みやすいKDL構文 |
| ステージ管理 | local/dev/staging/prod を統一管理 |
| OrbStack連携 | macOSローカル開発に最適化 |
| Dockerビルド | Dockerfileからのビルドをサポート |
| イメージプッシュ | ビルド後のレジストリプッシュを自動化 |
| サービスマージ | 複数ファイルでの設定オーバーライド |
| 再起動ポリシー | ホスト再起動時のコンテナ自動復旧 |
| 依存サービス待機 | Exponential Backoffで堅牢な起動順序制御 |
| クラウド対応 | さくらのクラウド、Cloudflareなど複数プロバイダー |
| DNS自動管理 | Cloudflare DNSとの自動連携 |
| CI/CDデプロイ | deployコマンドによる自動デプロイ |
| セルフアップデート | 最新バージョンへの自動更新 |
cargo install --git https://github.com/chronista-club/fleetflow
// flow.kdl
project "myapp"
stage "local" {
service "db"
}
service "db" {
image "postgres:16" // image は必須
ports {
port 5432 5432
}
env {
POSTGRES_PASSWORD "postgres"
}
}
fleetflow up local # 起動
fleetflow ps # 状態確認
fleetflow logs # ログ表示
fleetflow down local # 停止・削除
| コマンド | 説明 |
|---|---|
up <stage> | ステージを起動 |
down <stage> | ステージを停止・削除 |
deploy <stage> --pull --yes | CI/CD向けデプロイ(強制再作成) |
ps [--all] | コンテナ一覧 |
logs [--follow] [service] | ログ表示 |
start <stage> [service] | 停止中のサービスを起動 |
stop <stage> [service] | サービスを停止(コンテナ保持) |
restart <stage> [service] | サービスを再起動 |
build <stage> [-n service] | イメージをビルド |
build <stage> --push [--tag <tag>] | ビルド&レジストリへプッシュ |
validate | 設定を検証 |
cloud up --stage <stage> | クラウド環境を構築 |
cloud down --stage <stage> | クラウド環境を削除 |
self-update | FleetFlow自体を最新版に更新 |
version | バージョン表示 |
project "name" // プロジェクト名(必須)
stage "local" { // ステージ定義
service "db"
service "web"
}
service "db" { // サービス定義
image "postgres:16" // 必須
restart "unless-stopped" // 再起動ポリシー
depends_on "other" // 依存サービス
wait_for { ... } // 依存サービス待機設定
ports { ... }
env { ... }
volumes { ... }
build { ... } // Dockerビルド設定
healthcheck { ... } // ヘルスチェック設定
}
// クラウドインフラ(オプション)
providers {
sakura-cloud { zone "tk1a" }
cloudflare { account-id env="CF_ACCOUNT_ID" }
}
server "app-server" { // クラウドサーバー定義
provider "sakura-cloud"
plan core=4 memory=4
}
v0.2.4以降、imageフィールドは必須です。省略するとエラーになります:
// 正しい定義
service "db" {
image "postgres:16"
}
// エラー: imageが必須
service "db" {
version "16" // これだけではダメ
}
// Error: サービス 'db' に image が指定されていません
複数ファイルで同じサービスを定義すると、設定がマージされます:
// flow.kdl(ベース設定)
service "api" {
image "myapp:latest"
ports { port 8080 3000 }
env { NODE_ENV "production" }
}
// flow.local.kdl(ローカルオーバーライド)
service "api" {
env { DATABASE_URL "localhost:5432" }
}
// 結果:
// - image: "myapp:latest" (保持)
// - ports: [8080:3000] (保持)
// - env: { NODE_ENV: "production", DATABASE_URL: "localhost:5432" } (マージ)
マージルール:
| フィールドタイプ | ルール |
|---|---|
Option<T> | 後の定義がSomeなら上書き、Noneなら保持 |
Vec<T> | 後の定義が空でなければ上書き、空なら保持 |
HashMap<K, V> | 両方をマージ(後の定義が優先) |
規約ベースの自動検出と明示的指定の両方に対応:
// 規約ベース: ./services/api/Dockerfile を自動検出
service "api" {
image "myapp/api:latest"
build_args {
NODE_VERSION "20"
}
}
// 明示的指定
service "worker" {
image "myapp/worker:latest"
dockerfile "./backend/worker/Dockerfile"
context "./backend"
target "production" // マルチステージビルド
}
ビルドしたイメージをレジストリにプッシュ:
# ビルドのみ
fleetflow build local -n api
# ビルド&プッシュ
fleetflow build local -n api --push
# タグを指定してビルド&プッシュ
fleetflow build local -n api --push --tag v1.0.0
認証方式:
~/.docker/config.json から認証情報を取得DOCKER_CONFIG でパスをカスタマイズ可能対応レジストリ:
タグ解決の優先順位:
--tag CLIオプションimage フィールドのタグlatest複数のクラウドプロバイダーをKDLで宣言的に管理:
providers {
sakura-cloud { zone "tk1a" }
cloudflare { account-id env="CF_ACCOUNT_ID" }
}
stage "dev" {
server "app-server" {
provider "sakura-cloud"
plan core=4 memory=4
disk size=100 os="ubuntu-24.04"
dns_aliases "app" "api" // DNSエイリアス
}
}
ホスト再起動後にコンテナを自動復旧させる:
service "db" {
image "postgres:16"
restart "unless-stopped" // ホスト再起動後も自動起動
}
対応する値:
| 値 | 説明 |
|---|---|
no | 再起動しない(デフォルト) |
always | 常に再起動 |
on-failure | 異常終了時のみ再起動 |
unless-stopped | 明示的に停止されない限り再起動(推奨) |
K8sのReadiness Probeコンセプトを取り入れた、依存サービスの準備完了待機機能:
service "api" {
image "myapp/api:latest"
depends_on "db" "redis"
wait_for {
max_retries 23 // 最大リトライ回数(デフォルト: 23)
initial_delay 1000 // 初回待機時間ms(デフォルト: 1000)
max_delay 30000 // 最大待機時間ms(デフォルト: 30000)
multiplier 2.0 // 待機時間の増加倍率(デフォルト: 2.0)
}
}
待機時間の計算(Exponential Backoff):
delay = initial_delay * multiplier^attempt
max_delayで上限を設定。デフォルト設定では1秒→2秒→4秒→8秒→...→30秒(上限)で待機。
デフォルト設定での動作:
wait_forのみ指定でデフォルト値が適用される// デフォルト設定を使用
service "api" {
depends_on "db"
wait_for // 全てデフォルト値で待機
}
cloud up/cloud down時にDNSレコードを自動管理:
{service}-{stage}.{domain} のAレコードを自動追加dns_aliasesでCNAMEエイリアスも自動作成必要な環境変数:
CLOUDFLARE_API_TOKEN: Cloudflare APIトークンCLOUDFLARE_ZONE_ID: ドメインのZone IDCI/CDパイプラインからの自動デプロイに最適化されたコマンド:
# 基本的な使い方
fleetflow deploy prod --pull --yes
# GitHub Actionsから
ssh user@vps "cd /app && fleetflow deploy prod --pull --yes"
オプション:
| オプション | 説明 |
|---|---|
--pull | 最新イメージを強制的にダウンロード |
--yes | 確認なしで実行(CI向け) |
--stage | ステージ名を指定 |
デプロイフロー:
GHCRなどのコンテナレジストリを使わず、サーバー上で直接ビルドするパターン:
# サーバーにSSH接続
ssh user@server
cd /opt/myapp
# 最新コードを取得
git pull
# または特定コミットに移動
git checkout <commit-hash>
# ビルド&起動
FLOW_STAGE=prod fleetflow up --build
メリット:
ユースケース:
設定例(imageなしでbuildのみ):
service "api" {
build {
context "."
dockerfile "apps/api/Dockerfile"
}
ports { port 3000 3000 }
}
fleetflow up実行時に自動的にバージョンチェックを行い、新しいバージョンがあれば通知します:
# 手動でアップデート
fleetflow self-update
# upコマンド時に自動チェック
fleetflow up local # 新バージョンがあれば通知
FleetFlowは以下の命名規則でコンテナを作成します:
{project}-{stage}-{service}
例: myapp-local-db
OrbStackでは {project}-{stage} でグループ化されます。
fleetflow/
├── crates/
│ ├── fleetflow-cli/ # CLI
│ ├── fleetflow-atom/ # KDLパーサー
│ ├── fleetflow-container/ # コンテナ操作
│ ├── fleetflow-build/ # Dockerビルド
│ ├── fleetflow-cloud/ # クラウド抽象化
│ ├── fleetflow-cloud-sakura/ # さくらクラウド
│ └── fleetflow-cloud-cloudflare/ # Cloudflare
├── spec/ # 仕様書
├── design/ # 設計書
└── guides/ # 利用ガイド
このスキルは以下の場合に参照してください:
flow.kdl 設定ファイルを作成・編集する際FleetFlow - シンプルに、統一的に、環境を構築する。