zts-comfyui-docker — ComfyUI 임차인 배포 스택 — 소스 분석

대상(보존): 컨테이너 C.40368049(베이스 vastai/comfy_v0.22.0-cuda-12.9-py312/jupyter:latest) 내부 /workspace/zts-comfyui-docker 소스 경량본: src-archives/comfyui-zts.tar.gz (+ 커스텀노드 comfy-zts_depthface_nodes.tar.gz) 근거: 소스 본문 전체 확보(Dockerfile / compose / entrypoint / provisioning / setup.yaml / 커스텀노드 / 배포스크립트 / README / API매뉴얼 / .env). 따라서 본 문서는 거의 전부 확실. 모델 가중치·HF캐시 등 대용량 데이터만 호스트(.54)에 동결. github 출처: https://github.com/LaDMasC/zts-comfyui-docker.git (README 기재). 자체 git 히스토리 포함(.env에 CIVITAI 토큰 실값 → 외부 공유 금지).


한 줄 요약

ComfyUI를 "git으로 형상관리되는 상용 이미지/비디오 생성 백엔드"로 올리는 완성형 레퍼런스. config/setup.yaml 한 파일에 커스텀노드 22종·체크포인트/LoRA/VAE/임베딩 모델 ~80개의 URL만 적으면, provisioning.sh가 노드 clone + 모델 다운로드 + setup.yaml에 없는 항목은 자동 삭제(선언형 동기화) 까지 수행. 로컬 Docker(docker-compose.yml)와 Vast.ai(docker-compose.prod.yml = ai-dock/comfyui 베이스) 양쪽 배포, Multi-GPU 로드밸런서(prompt_id 라우팅), systemd 서비스, cron 자동배포, Cloudflare 터널 외부노출, 자체 커스텀노드 2종(Depth/Human-Parsing)까지 갖춘 임차인 운영 스택. 잔여 자산 중 학습가치 1순위.


1. 무엇을 하는가 (기능)


2. 핵심 설계 — 선언형 프로비저닝(config/setup.yaml + config/provisioning.sh)

이 스택의 정수. setup.yaml = 단일 진실원천(SSOT), provisioning.sh = 그것을 실현하는 idempotent 엔진.

setup.yaml 구조:

provisioning.sh 동작(확실):

  1. .env 로드(HF_TOKEN/CIVITAI_TOKEN) → 게이트 모델·Civitai 다운로드에 토큰 주입.
  2. ComfyUI 경로 자동탐지(/app / /workspace / /opt / $HOME) → 로컬/Vast/ai-dock 모두 호환.
  3. install_custom_node() — 이미 있으면 SKIP, 없으면 git clone --depth 1 + requirements 설치.
  4. download_model() — 이미 있으면 SKIP, HF면 Bearer 토큰, Civitai면 &token= 부착해 wget.
  5. download_hf_snapshot() — huggingface_hub.snapshot_download(allow_patterns).
  6. sync_local_custom_nodes() — repo의 custom_nodes_local/를 runtime custom_nodes/로 복사(매니페스트 기반 추가/삭제 반영, 외부노드와 이름충돌 시 에러로 중단).
  7. 선언형 동기화(SYNC_CLEANUP=true) — ★차별점: setup.yaml에 없는 모델파일·hf_snapshot·커스텀노드를 디스크에서 삭제. 즉 yaml이 곧 상태. 모델을 빼고 싶으면 yaml에서 줄을 지우면 다음 실행에 사라짐.

→ "ComfyUI 환경을 Infrastructure-as-Code로 다룬다"가 이 레포의 본질.


3. 두 가지 배포 경로 (이미지 빌드 전략이 다름)

로컬(docker-compose.yml + Dockerfile) Vast/클라우드(docker-compose.prod.yml)
베이스 자체 빌드: nvidia/cuda:12.1.1-cudnn8 → ComfyUI git clone + torch cu121 + Manager 기성 ghcr.io/ai-dock/comfyui:latest-cuda
entrypoint 자체 docker-entrypoint.sh ai-dock 내장(AUTO_UPDATE/WEB_PASSWORD/PROVISIONING 환경변수로 제어)
영구스토리지 로컬 볼륨 /workspace(Vast 영구) → models/output/input/custom_nodes 마운트
포트 8188 8188(ComfyUI)/8888(Jupyter)/22(SSH)

docker-entrypoint.sh(로컬용) 동작: ① AUTO_UPDATE 시 git reset --hard origin/master로 ComfyUI 본체 갱신 → ② /mnt/models/* 하위폴더와 필수폴더(checkpoints/loras/vae/...)를 심볼릭 링크로 ComfyUI에 연결(데이터/코드 분리) → ③ custom_nodes 볼륨 교체 + local node 동기화 → ④ 공통 pip 패키지 + 각 노드 requirements 설치 → ⑤ provisioning.sh 실행 → ⑥ python main.py.


4. 자체 커스텀노드 — zts_depthface_nodes (임차인 고유 코드)

custom_nodes_local/zts_depthface_nodes/(소스 comfy-zts_depthface_nodes.tar.gz와 동일). 2개 노드 제공, 카테고리 ZTS/DepthFace:

핵심 패턴: 모델을 런타임 다운로드가 아니라 provisioning 단계 hf_snapshots로 미리 받아두고, 노드는 로컬 디렉토리만 읽는다(없으면 친절한 에러로 provisioning 유도). 의존성 diffusers>=0.28 / transformers>=4.42 / fashn-human-parser==0.1.1.


5. Multi-GPU 로드밸런싱 (scripts/setup-multi-gpu.sh)

임대 멀티GPU 인스턴스에서 처리량 극대화:

→ "단일 ComfyUI"가 아니라 여러 GPU에 수평확장한 생성 팜을 구성하는 실전 스크립트. (.54가 4×RTX3090 수냉 노드인 것과 정확히 맞물림.)


6. 운영 자동화 / 외부노출


7. 시크릿 / 주의


8. 학습 포인트 (재사용 가치)

  1. setup.yaml 선언형 모델/노드 관리 + 자동 정리 = ComfyUI를 IaC로 운영하는 그대로 차용 가능한 패턴(우리 GPU 클러스터의 생성 서비스 표준화에 직접 응용).
  2. local custom node 동기화(매니페스트+충돌검출) = 사내 커스텀노드를 git에 두고 안전 배포하는 방법론.
  3. Multi-GPU LB(prompt_id 라우팅) = 4×3090 노드에서 ComfyUI 처리량 4배 내는 검증된 구성.
  4. GitOps 자동배포(auto-deploy-vast) = "레포 push → GPU 노드 자동 갱신" 무인 운영.
  5. 데이터/코드 분리(심볼릭 링크 + /workspace 영구볼륨) = 인스턴스 교체에도 모델 캐시 보존.

→ 이 레포는 우리가 직접 ComfyUI 기반 생성 서비스를 사내 표준으로 올릴 때의 베이스라인 템플릿으로 그대로 쓸 수 있다(시크릿만 교체).


9. 확실 vs 추정