ComfyUI 是我们的图像生成客户用得最多的工作流工具,而我们在工单里见到的部署方式,问题往往如出一辙:SSH 会话一关闭,进程就跟着退出;每次重装系统,模型都得重新下载;任何人只要发现了这个端口,就能访问 Web 界面。本文给出的方案可以一次解决这三个问题,另外还附上了我们在 RTX 4090 和 RTX 5090 套餐上实测的 SDXL 与 FLUX 数据。
目录规划:模型放数据卷,应用交给 systemd 单元
把获取成本高的东西全部放在持久化数据卷上,把重建成本低的东西放在应用目录里。在我们的 GPU 套餐中,数据卷挂载在 /data;重装系统时,系统盘会被清空,而 /data 不会。
/opt/comfy/ # the app, a git checkout, disposable
/data/models/checkpoints/ # SDXL, FLUX and friends: 6 to 24 GB each
/data/models/loras/
/data/models/vae/
/data/output/ # generated images
可以从 ComfyUI 模板安装,也可以在 Ubuntu 24.04 的 CUDA 基础镜像上手动安装:
apt install -y git python3-venv
git clone https://github.com/comfyanonymous/ComfyUI /opt/comfy
python3 -m venv /opt/comfy/venv && /opt/comfy/venv/bin/pip install -U pip
/opt/comfy/venv/bin/pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
/opt/comfy/venv/bin/pip install -r /opt/comfy/requirements.txt
git clone https://github.com/ltdrdata/ComfyUI-Manager /opt/comfy/custom_nodes/ComfyUI-Manager
用 extra_model_paths.yaml 让 ComfyUI 指向数据卷,这样应用目录里就完全不会有模型文件:
cat > /opt/comfy/extra_model_paths.yaml <<'EOF'
data:
base_path: /data/models/
checkpoints: checkpoints/
loras: loras/
vae: vae/
clip: clip/
unet: unet/
EOF
systemd 单元
useradd -r -m -d /opt/comfy -s /usr/sbin/nologin comfy && chown -R comfy /opt/comfy /data
cat > /etc/systemd/system/comfy.service <<'EOF'
[Unit]
Description=ComfyUI
After=network-online.target
[Service]
User=comfy
WorkingDirectory=/opt/comfy
ExecStart=/opt/comfy/venv/bin/python main.py --listen 127.0.0.1 --port 8188 --output-directory /data/output
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload && systemctl enable --now comfy
这个单元里有两处是刻意为之的:它只监听 localhost,并且以非特权用户身份运行。自定义节点可以执行任意 Python 代码;一个被攻破的节点如果跑在 root 进程里,整台服务器就彻底失守了。
不暴露端口的访问方式
两扇门,任选其一。私有的那扇是 Tailscale(下单表单里的附加服务):装好之后,无需开放任何端口,就能从您的任意设备访问 http://server-name:8188;同时把 --listen 改成 Tailscale 的地址。公开的那扇是带密码的 Caddy,它还能顺带提供 HTTPS:
apt install -y caddy
HASH=$(caddy hash-password --plaintext 'a-long-password')
cat > /etc/caddy/Caddyfile <<EOF
comfy.example.com {
basicauth { me $HASH }
reverse_proxy 127.0.0.1:8188
}
EOF
systemctl reload caddy
千万不要把 8188 端口直接对外发布。ComfyUI 没有任何认证机制,它的 API 可以读写文件,而扫描器几个小时之内就能找到暴露在公网上的实例。
两张显卡的实际表现
在我们的套餐上实测,使用默认工作流、20 步、Euler 采样器、批次大小为 1,并且均在预热之后测量:
| 模型 | 分辨率 | RTX 4090 (24 GB) | RTX 5090 (32 GB) |
|---|---|---|---|
| SDXL 1.0 | 1024 × 1024 | 3.9 s | 2.3 s |
| SDXL + Refiner 精修模型 | 1024 × 1024 | 5.6 s | 3.3 s |
| FLUX.1 dev,FP8 | 1024 × 1024 | 14 s | 8 s |
| FLUX.1 schnell,4 步 | 1024 × 1024 | 1.9 s | 1.1 s |
| SDXL,批次大小 8 | 1024 × 1024 | 25 s | 15 s |
5090 整体上大约快 1.7 倍,而 32 GB 显存让 FLUX dev 在同时加载 LoRA 和 ControlNet 时也能从容运行;4090 虽然也能跑,却要频繁地换入换出模型。仅就每美元的 SDXL 吞吐量而言,4090 套餐仍然是更划算的选择。
日常运维
- 更新:
cd /opt/comfy && git pull && venv/bin/pip install -r requirements.txt && systemctl restart comfy。更新前先在控制面板里做一份快照;更新后出问题的,往往是自定义节点,而不是 ComfyUI 本身。 - 重装系统:重新选择模板,重新挂载数据卷,恢复
extra_model_paths.yaml和 systemd 单元;模型始终原地不动。 - 磁盘:批次大小超过 1 时,
/data/output增长很快。用定时器每周执行一次find /data/output -mtime +30 -delete,就能让磁盘占用不至于失控,前提是您已经把想留的图片拷走了。 - 留意显存:生成过程中运行
nvidia-smi。一个只剩 1 GB 余量的工作流,哪天多加一个节点就会失败;netdata 附加服务可以把显存占用随时间绘制成曲线。
按这套方式部署,GPU 服务器扛得住重启、重装,也扛得住您自己的各种折腾,月复一月,您真正需要动的只有工作流本身。
