Nexmoe

Nexmoe

一个开发者。关于勇敢与热爱,互联网/创造/赛博朋克
twitter
github

ComfyUI 如何部署 Docker 鏡像到生產環境

大家好,我是白日梦想家 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)用於存儲模型

快速開始#

後端本地測試#

  1. 進入後端 Dockerfile 目錄
cd backend
  1. 下載模型文件

請參考:https://gongjiyun.com/docs/tutorials/comfyui.html#%E4%B8%8B%E8%BD%BD%E6%A8%A1%E5%9E%8B%E5%92%8C%E6%89%A9%E5%B1%95

  1. 構建 Docker 映像
docker build -t gongji/comfyui:0.1 .
  1. 運行 Docker 容器
docker run -it --rm --gpus all -p 3000:3000 -p 8188:8188 --name comfyui gongji/comfyui:0.1

容器啟動後可以訪問:

前端本地測試#

  1. 進入前端目錄
cd frontend
  1. 配置環境變量
cp .env.example .env
# 編輯 .env 文件配置必要的環境變量
  1. 安裝依賴並啟動
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. 準備 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('沒有返回有效的圖片數據');
    }
}

主要步驟說明:

  1. 準備 Prompt

    • 從 JSON 文件導入基礎 prompt 配置
    • 根據需要修改 prompt 中的參數(如輸入圖片)
  2. 發送請求

    • 使用 POST 方法
    • Content-Type 設置為 application/json
    • 請求體為序列化後的 prompt 數據
  3. 處理響應

    • 檢查響應狀態碼
    • 解析返回的 JSON 數據
    • 提取生成的圖片(base64 格式)
  4. 錯誤處理

    • 記錄錯誤日誌
    • 拋出適當的錯誤信息

環境變量配置#

在使用 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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。