皆さんこんにちは、私は白日梦想家 Nexmoe です。最近、Docker を基にした ComfyUI の弾性 Serverless アプリをオープンソース化しました。このアプリは、完全なフロントエンドとバックエンドの分離アーキテクチャとユーザーフレンドリーなインターフェースを備えています。
ComfyUI のワークフローの開発を完了した後、それを本番環境にデプロイするのは難しい作業です。そこで、皆さんが学ぶための参考として一つのケーススタディをオープンソース化しました。
デモ:https://hadoop.nexmoe.com/
オープンソースアドレス:https://github.com/nexmoe/serverless-comfyui
プロジェクトの特徴#
- 🐳 完全な Docker 化デプロイメントソリューション
- 🎨 モダンなフロントエンドインターフェース
- 🔌 モジュール化されたバックエンドアーキテクチャ
- 🛠 簡単な設定と使用方法
アーキテクチャ図#
プロジェクト構造#
comfy-docker/
├── frontend/           # Next.jsフロントエンドプロジェクト
│   ├── src/           # ソースコード
│   └── .env          # 環境設定
├── backend/           # ComfyUIバックエンド
│   ├── checkpoints/   # モデルチェックポイント
│   ├── controlnet/    # ControlNetモデル
│   ├── custom_nodes/  # カスタムノード
│   └── loras/        # LoRAモデル
└── bruno/            # APIテストファイル
frontend / ディレクトリ構造は以下の通りで、モデルとカスタムノードは自分でダウンロードしてインストールする必要があります。
.
├── Dockerfile
├── checkpoints
│   └── dreamshaperXL_sfwV2TurboDPMSDE.safetensors
├── controlnet
│   ├── sai_xl_canny_256lora.safetensors
│   └── sai_xl_depth_256lora.safetensors
├── custom_nodes
│   ├── ComfyUI-Custom-Scripts
│   ├── ComfyUI-WD14-Tagger
│   ├── ComfyUI_Comfyroll_CustomNodes
│   ├── comfyui-art-venture
│   └── comfyui_controlnet_aux
├── docker-compose.yml
├── loras
│   └── StudioGhibli.Redmond-StdGBRRedmAF-StudioGhibli.safetensors
├── provisioning.sh  // カスタムスクリプト
└── sanhua.json  // ワークフロー
環境要件#
- Docker & Docker Compose
- NVIDIA GPU(現在のデモワークフローには 12G 以上の VRAM が必要)
- モデルを保存するための十分なディスクスペース(100G〜200G)
クイックスタート#
バックエンドのローカルテスト#
- バックエンドの Dockerfile ディレクトリに移動
cd backend
- モデルファイルをダウンロード
- Docker イメージをビルド
docker build -t gongji/comfyui:0.1 .
- Docker コンテナを実行
docker run -it --rm --gpus all -p 3000:3000 -p 8188:8188 --name comfyui gongji/comfyui:0.1
コンテナが起動した後、以下にアクセスできます:
- ComfyUI インターフェース:http://localhost:8188
- API インターフェース:http://localhost:3000/docs
フロントエンドのローカルテスト#
- フロントエンドディレクトリに移動
cd frontend
- 環境変数を設定
cp .env.example .env
# .envファイルを編集して必要な環境変数を設定
- 依存関係をインストールして起動
pnpm install
pnpm dev
ComfyUI Docker を Serverless 弾性プラットフォームにデプロイ#
共績科技の ComfyUI デプロイメントドキュメントを参照してください。
API ドキュメント#
プロジェクトは Bruno を使用して API テストとドキュメント管理を行っており、関連ファイルはbruno/ディレクトリにあります。
ComfyUI API 呼び出しの例#
以下は ComfyUI API を呼び出すためのサンプルコードです(frontend/src/app/api/route.tsを参照):
async function generateImage(imageUrl: string) {
    // 1. プロンプトデータを準備
    const promptData = { ...promptob };  // JSONファイルから基本プロンプトをインポート
    promptData.prompt["30"].inputs.image = imageUrl;  // 入力画像を変更
    // 2. リクエストオプションを設定
    const url = `${process.env.GONGJI_ENDPOINT}/prompt`;
    const options = {
        method: 'POST',
        headers: { 'content-type': 'application/json' },
        body: JSON.stringify(promptData)
    };
    // 3. リクエストを送信
    const response = await fetch(url, options);
    const data = await response.json();
    // 4. エラーハンドリング
    if (response.status !== 200) {
        throw new Error(response.statusText);
    }
    // 5. 返された画像データを処理
    if (data.images && data.images.length > 0) {
        return data.images[0];  // base64形式の画像データを返す
    } else {
        throw new Error('有効な画像データが返されませんでした');
    }
}
主要なステップの説明:
- 
プロンプトの準備: - JSON ファイルから基本プロンプト設定をインポート
- 必要に応じてプロンプト内のパラメータ(入力画像など)を変更
 
- 
リクエストの送信: - POST メソッドを使用
- Content-Type を application/json に設定
- リクエストボディはシリアライズされたプロンプトデータ
 
- 
レスポンスの処理: - レスポンスのステータスコードを確認
- 返された JSON データを解析
- 生成された画像(base64 形式)を抽出
 
- 
エラーハンドリング: - エラーログを記録
- 適切なエラーメッセージをスロー
 
環境変数の設定#
API を使用する前に、以下の環境変数を設定してください:
GONGJI_ENDPOINT=your-comfyui-api-endpoint  # ComfyUI APIエンドポイント
S3 設定の説明#
プロジェクトの画像アップロード機能には S3 ストレージサービスの設定が必要です。AWS S3 または他の S3 プロトコルに互換性のあるオブジェクトストレージサービス(MinIO など)を使用できます。
frontend/.envファイルに以下の環境変数を設定してください:
S3_ENDPOINT=your-s3-endpoint
S3_ACCESS_KEY=your-access-key
S3_SECRET_KEY=your-secret-key
S3_BUCKET=your-bucket-name
S3_REGION=your-region
注意:
- 作成したバケットが適切なアクセス権限を持っていることを確認してください
- MinIO を使用する場合、エンドポイントは完全な URL である必要があります(例:http://localhost:9000)
- AWS S3 を使用する場合、エンドポイントの設定は省略できます
貢献ガイドライン#
Issue や Pull Request の提出を歓迎します!
ライセンス#
MIT ライセンス