大家好,我是白日梦想家 Nexmoe。近期,我將一套基於 Docker 打包的 ComfyUI 彈性 Serverless 應用進行了開源,該應用具備完整的前後端分離架構以及用戶友好的界面。
在完成 ComfyUI 工作流的開發後,把它部署到生產環境是一件較為棘手的事情。因此,我開源了一套案例,以供大家學習參考。
Demo:https://hadoop.nexmoe.com/
開源地址:https://github.com/nexmoe/serverless-comfyui
項目特點#
- 🐳 完整的 Docker 化部署方案
- 🎨 現代化的前端界面
- 🔌 模塊化的後端架構
- 🛠 簡單的配置和使用方式
架構圖#
Mermaid Loading...
項目結構#
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 顯存以上)
- 足夠的磁碟空間(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 彈性平台#
API 文檔#
項目使用 Bruno 進行 API 測試和文檔管理,相關文件位於 bruno/
目錄。
ComfyUI API 調用示例#
以下是調用 ComfyUI API 的示例代碼(參考 frontend/src/app/api/route.ts
):
async function generateImage(imageUrl: string) {
// 1. 準備 prompt 數據
const promptData = { ...promptob }; // 從 JSON 文件導入基礎 prompt
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('沒有返回有效的圖片數據');
}
}
主要步驟說明:
-
準備 Prompt:
- 從 JSON 文件導入基礎 prompt 配置
- 根據需要修改 prompt 中的參數(如輸入圖片)
-
發送請求:
- 使用 POST 方法
- Content-Type 設置為 application/json
- 請求體為序列化後的 prompt 數據
-
處理響應:
- 檢查響應狀態碼
- 解析返回的 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
注意:
- 確保創建的 bucket 具有適當的訪問權限
- 如果使用 MinIO,endpoint 應該是完整的 URL(例如:http://localhost:9000)
- 使用 AWS S3 時,可以省略 endpoint 配置
贡献指南#
歡迎提交 Issue 和 Pull Request!
許可證#
MIT License