FROM docker.io/library/python:3.13-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
    git libgl1 libglib2.0-0 libsm6 libxext6 libgomp1 \
    && rm -rf /var/lib/apt/lists/*

ENV GIT_TERMINAL_PROMPT=0

WORKDIR /app

RUN git clone --depth 1 https://github.com/comfyanonymous/ComfyUI . \
    && pip install --no-cache-dir torch torchvision torchaudio \
       --index-url https://download.pytorch.org/whl/cpu \
    && pip install --no-cache-dir -r requirements.txt

RUN cd /app/custom_nodes \
    && git clone --depth 1 https://github.com/city96/ComfyUI-GGUF \
    && pip install --no-cache-dir -r ComfyUI-GGUF/requirements.txt

RUN cd /app/custom_nodes \
    && git clone --depth 1 https://github.com/XLabs-AI/x-flux-comfyui \
    && pip install --no-cache-dir -r x-flux-comfyui/requirements.txt

# Fix: xflux DoubleStreamBlock.forward must accept attn_mask kwarg passed by ComfyUI
RUN python3 -c "
path = '/app/custom_nodes/x-flux-comfyui/xflux/src/flux/modules/layers.py'
with open(path) as f: c = f.read()
old = '    def forward(self, img: Tensor, txt: Tensor, vec: Tensor, pe: Tensor) -> tuple[Tensor, Tensor]:\n      return self.processor(self, img, txt, vec, pe)'
new = '    def forward(self, img: Tensor, txt: Tensor, vec: Tensor, pe: Tensor, attn_mask=None, transformer_options={}, **kwargs):\n      return self.processor(self, img, txt, vec, pe)'
assert old in c, 'Pattern not found!'
with open(path, 'w') as f: f.write(c.replace(old, new))
print('Patch applied')
"

RUN useradd -u 1000 -m comfyui && chown -R 1000:1000 /app

USER 1000
EXPOSE 8188
CMD ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188", "--cpu"]
