Skip to content

comfyui

comfyui 2.0 的版本后,添加了 overlay 做环境的持久化,避免升级后或者安装一些节点后导致环境坏掉的情况下可以回退到之前的版本上.

Overlay 运行层用法

镜像默认通过 lzc-comfy-overlay run 启动 ComfyUI。它会把镜像内的只读代码和 venv 同步到持久化运行层,再从持久化运行层启动服务:

  • 镜像代码目录:/opt/ComfyUI
  • 镜像 venv:/opt/venv
  • 运行时代码链接:/opt/ComfyUI-user
  • 运行时 venv 链接:/opt/venv-user
  • 默认数据根目录:/lzc-comfy-data
  • overlay 状态目录:/lzc-comfy-data/overlay

启动时会优先使用 OverlayFS,并挂载:

text
/lzc-comfy-data/overlay/merged/app
/lzc-comfy-data/overlay/merged/venv

如果当前容器或数据盘不支持 OverlayFS,脚本会自动降级为普通持久化 rsync 运行模式。降级模式可以继续启动 ComfyUI,但不提供快照和回滚能力。

用户数据目录会迁移并链接到:

text
/lzc-comfy-data/overlay/userdata/user
/lzc-comfy-data/overlay/userdata/output
/lzc-comfy-data/overlay/userdata/input
/lzc-comfy-data/overlay/userdata/models

这些目录不会被镜像升级覆盖。lzc-comfyui.ignore 只应排除根目录的 /user/***/output/***/input/***/models/***/temp/***,不要使用未锚定的 input/models/ 这类规则,否则会误排除 ComfyUI 源码里的同名子目录。

常用命令:

bash
# 准备 overlay 挂载和升级同步,不启动 ComfyUI
lzc-comfy-overlay boot

# 完整启动流程,镜像 CMD 默认使用这个命令
lzc-comfy-overlay run

# 查看数据根目录、当前镜像版本、挂载状态和待处理回滚
lzc-comfy-overlay status

# 手动创建快照
lzc-comfy-overlay snapshot --reason before-manager-update

# 查看快照列表
lzc-comfy-overlay list

# 标记回滚目标,重启 app 容器后生效
lzc-comfy-overlay rollback <snapshot-id>

# 清理过期自动快照
lzc-comfy-overlay cleanup

升级流程由 lzc-version 控制。设备端记录的上次镜像版本在:

text
/lzc-comfy-data/overlay/control/last-image-version

当新镜像内的 /opt/ComfyUI/lzc-version 和记录值不一致,或设置了 COMFYUI_FORCE_UPDATE=1,启动时会同步镜像内的 ComfyUI 与 venv。同步前会创建 pre-image-upgrade-* 快照;升级后服务需要在 300 秒内通过 http://localhost:8188/api/manager/version 健康检查。健康检查失败时,脚本会自动回滚到升级前快照并再次启动。

可用环境变量:

  • LZC_COMFY_DATA_DIR:覆盖默认数据根目录 /lzc-comfy-data
  • COMFYUI_FORCE_UPDATE=1:强制重新从镜像同步运行层。
  • COMFYUI_DISABLE_UPDATE=1:已有运行层和 venv 可用时跳过镜像同步。

自动快照包括启动快照、每日快照和升级前快照。自动快照最多保留最近 5 个;超过 7 天的旧自动快照会在 cleanup 时清理。手动快照不会被自动清理。

Q:如果遇到 ksampler 不支持 sm87 cuda 指令?

A:这个其实是 segeatention 库中没有适配 sm87 指令,通过更改 /opt/venv/lib/python3.12/site-packages/sageattention/core.py 和 sm89 同样的逻辑即可。

添加代理

在算力舱的 /ssd/lzc-ai-agent/services/cloud.lazycat.aipod.comfyui 目录下创建一个 compose.override.yml

yml
services:
  app:
    environment:
      - https_proxy=http://代理ip:代理端口

注意: 如果不要将代理 ip 写成 127.0.0.1,在容器内部是访问不到这个地址的.