皆さんこんにちは、私は白日梦想家 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 ライセンス