| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| FROM python:3.11-slim-bookworm |
|
|
| |
| |
| |
| ENV DEBIAN_FRONTEND=noninteractive \ |
| PYTHONUNBUFFERED=1 \ |
| PYTHONDONTWRITEBYTECODE=1 \ |
| PIP_NO_CACHE_DIR=1 \ |
| PIP_DISABLE_PIP_VERSION_CHECK=1 \ |
| COMFYUI_PATH=/app/ComfyUI \ |
| COMFYUI_PORT=7860 \ |
| PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \ |
| HF_HOME=/data/comfyui/.cache/huggingface |
|
|
| |
| |
| |
| RUN apt-get update && apt-get install -y --no-install-recommends \ |
| git \ |
| git-lfs \ |
| wget \ |
| curl \ |
| libgl1 \ |
| libglib2.0-0 \ |
| libsm6 \ |
| libxext6 \ |
| libxrender1 \ |
| libgomp1 \ |
| ffmpeg \ |
| procps \ |
| && apt-get clean \ |
| && rm -rf /var/lib/apt/lists/* |
|
|
| |
| |
| |
| RUN mkdir -p /app/cache/huggingface && \ |
| chmod -R 777 /app |
|
|
| WORKDIR /app |
|
|
| |
| |
| |
| |
| |
| RUN pip install --upgrade pip && \ |
| pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu |
| |
| |
| |
| |
| RUN git clone --depth 1 https://github.com/Comfy-Org/ComfyUI.git ${COMFYUI_PATH} |
|
|
| WORKDIR ${COMFYUI_PATH} |
|
|
| |
| |
| |
| RUN pip install -r requirements.txt |
|
|
| |
| |
| |
| RUN git clone --depth 1 https://github.com/Comfy-Org/ComfyUI-Manager.git custom_nodes/ComfyUI-Manager |
| |
| |
| |
| |
| RUN pip install \ |
| aiohttp \ |
| requests \ |
| tqdm \ |
| Pillow \ |
| numpy \ |
| scipy \ |
| opencv-python-headless \ |
| huggingface-hub \ |
| safetensors \ |
| accelerate \ |
| pyyaml |
| |
| |
| |
| |
| RUN mkdir -p \ |
| models/checkpoints \ |
| models/clip \ |
| models/clip_vision \ |
| models/controlnet \ |
| models/diffusers \ |
| models/embeddings \ |
| models/gligen \ |
| models/hypernetworks \ |
| models/loras \ |
| models/photomaker \ |
| models/style_models \ |
| models/unet \ |
| models/upscale_models \ |
| models/vae \ |
| models/vae_approx \ |
| models/configs \ |
| input \ |
| output \ |
| temp \ |
| user \ |
| && chmod -R 777 /app |
| |
| |
| |
| |
| EXPOSE 7860 |
| |
| |
| |
| |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=120s --retries=5 \ |
| CMD curl -f http://localhost:${COMFYUI_PORT}/ || exit 1 |
|
|
| |
| |
| |
| |
| CMD ["bash", "-c", "\ |
| set -e && \ |
| echo '============================================' && \ |
| echo ' ComfyUI for Hugging Face Spaces' && \ |
| echo ' Starting up...' && \ |
| echo '============================================' && \ |
| PERSISTENT_DIR=/data/comfyui && \ |
| if [ -d /data ] && [ -w /data ]; then \ |
| echo '[INFO] Persistent storage detected at /data' && \ |
| echo '[INFO] Setting up persistent directories...' && \ |
| mkdir -p ${PERSISTENT_DIR}/models/checkpoints && \ |
| mkdir -p ${PERSISTENT_DIR}/models/clip && \ |
| mkdir -p ${PERSISTENT_DIR}/models/clip_vision && \ |
| mkdir -p ${PERSISTENT_DIR}/models/controlnet && \ |
| mkdir -p ${PERSISTENT_DIR}/models/diffusers && \ |
| mkdir -p ${PERSISTENT_DIR}/models/embeddings && \ |
| mkdir -p ${PERSISTENT_DIR}/models/gligen && \ |
| mkdir -p ${PERSISTENT_DIR}/models/hypernetworks && \ |
| mkdir -p ${PERSISTENT_DIR}/models/loras && \ |
| mkdir -p ${PERSISTENT_DIR}/models/photomaker && \ |
| mkdir -p ${PERSISTENT_DIR}/models/style_models && \ |
| mkdir -p ${PERSISTENT_DIR}/models/unet && \ |
| mkdir -p ${PERSISTENT_DIR}/models/upscale_models && \ |
| mkdir -p ${PERSISTENT_DIR}/models/vae && \ |
| mkdir -p ${PERSISTENT_DIR}/models/vae_approx && \ |
| mkdir -p ${PERSISTENT_DIR}/models/configs && \ |
| mkdir -p ${PERSISTENT_DIR}/custom_nodes && \ |
| mkdir -p ${PERSISTENT_DIR}/output && \ |
| mkdir -p ${PERSISTENT_DIR}/input && \ |
| mkdir -p ${PERSISTENT_DIR}/user && \ |
| mkdir -p ${PERSISTENT_DIR}/temp && \ |
| mkdir -p ${PERSISTENT_DIR}/.cache/huggingface && \ |
| if [ -d ${COMFYUI_PATH}/models ] && [ ! -L ${COMFYUI_PATH}/models ]; then \ |
| echo '[INFO] Migrating built-in models to persistent storage...' && \ |
| cp -rn ${COMFYUI_PATH}/models/* ${PERSISTENT_DIR}/models/ 2>/dev/null || true && \ |
| rm -rf ${COMFYUI_PATH}/models; \ |
| fi && \ |
| if [ -d ${COMFYUI_PATH}/custom_nodes ] && [ ! -L ${COMFYUI_PATH}/custom_nodes ]; then \ |
| echo '[INFO] Migrating custom nodes to persistent storage...' && \ |
| cp -rn ${COMFYUI_PATH}/custom_nodes/* ${PERSISTENT_DIR}/custom_nodes/ 2>/dev/null || true && \ |
| rm -rf ${COMFYUI_PATH}/custom_nodes; \ |
| fi && \ |
| if [ -d ${COMFYUI_PATH}/output ] && [ ! -L ${COMFYUI_PATH}/output ]; then \ |
| cp -rn ${COMFYUI_PATH}/output/* ${PERSISTENT_DIR}/output/ 2>/dev/null || true && \ |
| rm -rf ${COMFYUI_PATH}/output; \ |
| fi && \ |
| if [ -d ${COMFYUI_PATH}/input ] && [ ! -L ${COMFYUI_PATH}/input ]; then \ |
| cp -rn ${COMFYUI_PATH}/input/* ${PERSISTENT_DIR}/input/ 2>/dev/null || true && \ |
| rm -rf ${COMFYUI_PATH}/input; \ |
| fi && \ |
| if [ -d ${COMFYUI_PATH}/user ] && [ ! -L ${COMFYUI_PATH}/user ]; then \ |
| cp -rn ${COMFYUI_PATH}/user/* ${PERSISTENT_DIR}/user/ 2>/dev/null || true && \ |
| rm -rf ${COMFYUI_PATH}/user; \ |
| fi && \ |
| ln -sfn ${PERSISTENT_DIR}/models ${COMFYUI_PATH}/models && \ |
| ln -sfn ${PERSISTENT_DIR}/custom_nodes ${COMFYUI_PATH}/custom_nodes && \ |
| ln -sfn ${PERSISTENT_DIR}/output ${COMFYUI_PATH}/output && \ |
| ln -sfn ${PERSISTENT_DIR}/input ${COMFYUI_PATH}/input && \ |
| ln -sfn ${PERSISTENT_DIR}/user ${COMFYUI_PATH}/user && \ |
| ln -sfn ${PERSISTENT_DIR}/temp ${COMFYUI_PATH}/temp && \ |
| export HF_HOME=${PERSISTENT_DIR}/.cache/huggingface && \ |
| echo '[INFO] Persistent storage setup complete!' && \ |
| echo '[INFO] Models: ${PERSISTENT_DIR}/models/' && \ |
| echo '[INFO] Custom nodes: ${PERSISTENT_DIR}/custom_nodes/' && \ |
| echo '[INFO] Outputs: ${PERSISTENT_DIR}/output/'; \ |
| else \ |
| echo '[WARNING] ==================================================' && \ |
| echo '[WARNING] Persistent storage (/data) is NOT available!' && \ |
| echo '[WARNING] All models and data will be LOST on restart.' && \ |
| echo '[WARNING] Enable persistent storage in your Space settings.' && \ |
| echo '[WARNING] =================================================='; \ |
| fi && \ |
| MANAGER_DIR=${COMFYUI_PATH}/custom_nodes/ComfyUI-Manager && \ |
| if [ ! -d ${MANAGER_DIR} ] || [ -z \"$(ls -A ${MANAGER_DIR} 2>/dev/null)\" ]; then \ |
| echo '[INFO] ComfyUI-Manager not found, installing...' && \ |
| rm -rf ${MANAGER_DIR} && \ |
| git clone --depth 1 https://github.com/Comfy-Org/ComfyUI-Manager.git ${MANAGER_DIR}; \ |
| fi && \ |
| EXTRA_ARGS='' && \ |
| if command -v nvidia-smi > /dev/null 2>&1 && nvidia-smi > /dev/null 2>&1; then \ |
| echo '[INFO] NVIDIA GPU detected! Running in GPU mode.' && \ |
| EXTRA_ARGS='--cuda-malloc'; \ |
| else \ |
| echo '[INFO] No GPU detected. Running in CPU mode.' && \ |
| EXTRA_ARGS='--cpu'; \ |
| fi && \ |
| chmod -R 777 ${COMFYUI_PATH} 2>/dev/null || true && \ |
| chmod -R 777 /data 2>/dev/null || true && \ |
| echo '============================================' && \ |
| echo ' ComfyUI starting on port ${COMFYUI_PORT}' && \ |
| echo '============================================' && \ |
| cd ${COMFYUI_PATH} && \ |
| exec python main.py \ |
| --listen 0.0.0.0 \ |
| --port ${COMFYUI_PORT} \ |
| --enable-cors-header \ |
| --preview-method auto \ |
| ${EXTRA_ARGS} \ |
| "] |
|
|