在持久化环境里从零部署 ComfyUI:踩坑记录与可移植启动脚本

本文介绍在系统盘重启重置、数据目录持久化的Linux机器上部署ComfyUI的方法,涵盖Conda环境建在持久化目录、git克隆TLS报错解决、Python 3.12版本适配、依赖安装技巧,以及可移植启动脚本和systemd开机自启配置,核心思路是不依赖被重置的系统shell配置,重启后可直接运行。

作者:zhuge··预计阅读 19 分钟·7 阅读·0 评论
在持久化环境里从零部署 ComfyUI:踩坑记录与可移植启动脚本

目标:在一台系统盘重启会被重置、但数据目录持久化的 Linux 机器上,用 Conda 把 ComfyUI 装到指定目录,配合两个常用插件(Crystools、Manager),并写一个重启后直接能跑的启动脚本。


一、背景与问题

环境特点:

  • 系统重启后,/root/.bashrc 等 shell 配置会被重置,conda init 写入的初始化代码会丢失。
  • 但 /root/private_data/... 这类目录是持久化的,代码和 Conda 环境放在这里不会丢。
  • 系统自带 Python 3.10,而 ComfyUI 最新依赖要求 Python ≥ 3.11(推荐 3.12/3.13)。

因此整个部署要围绕两个原则:

  1. Conda 环境必须建在持久化目录,不要用默认的 envs 位置。
  2. 启动脚本自己加载 conda 初始化,不依赖被重置的 .bashrc。

二、第一步:把 Conda 环境建到指定目录

Conda 默认把环境放在自己的 envs 文件夹里。要放到指定位置,用 --prefix(或 -p)参数,后面跟完整路径:

conda create --prefix /root/private_data/apprepo/model/venv python=3.12 -y

创建完成后,激活这个环境不能再用环境名,而要用完整路径:

conda activate /root/private_data/apprepo/model/venv

如果提示 invalid choice: 'activate',说明当前 shell 还没加载 conda 的 shell 函数。执行 source /opt/conda/etc/profile.d/conda.sh 即可,不需要依赖 conda init。


三、第二步:克隆 ComfyUI 与两个插件

3.1 克隆 ComfyUI 时遇到的 TLS 报错

直接 git clone https://github.com/Comfy-Org/ComfyUI 时遇到:

error: RPC failed; curl 56 GnuTLS recv error (-9): Error decoding the received TLS packet.
fatal: early EOF
fatal: fetch-pack: invalid index-pack output

这是 HTTPS 传输较大数据包时连接被中断导致的。有效的解决顺序:

  1. 浅克隆(最省事,先拿到能用的代码):
    git clone --depth 1 https://github.com/Comfy-Org/ComfyUI.git
    
  2. 改用 SSH(绕过 HTTPS 的中间设备干扰):
    git clone git@github.com:Comfy-Org/ComfyUI.git
    
  3. 必须用 HTTPS 时,调整 Git 配置:
    git config --global http.postBuffer 1048576000
    git config --global http.lowSpeedLimit 0
    git config --global http.lowSpeedTime 999999
    git config --global http.version HTTP/1.1
    

3.2 克隆两个常用插件

进入 ComfyUI 的 custom_nodes 目录:

cd /root/private_data/apprepo/model/ComfyUI/custom_nodes

git clone https://github.com/crystian/ComfyUI-Crystools.git
git clone https://github.com/ltdrdata/ComfyUI-Manager.git
  • ComfyUI-Crystools:提供资源监控(CPU/GPU/内存/显存)、进度条、元数据查看等实用工具。
  • ComfyUI-Manager:节点与模型的管理器,可安装/更新自定义节点、缺失节点自动提示等。

如果插件克隆也遇到 TLS 报错,同样可以加 --depth 1 浅克隆。


四、第三步:安装依赖时踩的 Python 版本坑

4.1 现象

在 Python 3.10 下安装依赖,pip 报:

ERROR: Ignored the following versions that require a different python version: ... Requires-Python >=3.11 ...
ERROR: Could not find a version that satisfies the requirement comfyui-workflow-templates-media-assets-02==0.1.17 (from comfyui-workflow-templates) (from versions: none)
ERROR: No matching distribution found for comfyui-workflow-templates-media-assets-02==0.1.17

4.2 原因

  • ComfyUI 最新依赖大量要求 Python >=3.11 或 >=3.12,Python 3.10 会被 pip 直接跳过。
  • 日志里的 (from versions: none) 往往还叠加了国内镜像源同步不完整的问题:镜像里没有 comfyui-workflow-templates-media-assets-02 这个包。

4.3 解决

  1. 确认环境已经是 Python 3.12:
    python --version
    
  2. 临时切到官方源安装,绕过镜像同步问题:
    cd /root/private_data/apprepo/model/ComfyUI
    python -m pip install -r requirements.txt -i https://pypi.org/simple/
    
    官方源慢时可换腾讯云或中科大镜像:
    python -m pip install -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple/
    
  3. 仍失败时清缓存并强制重装模板包:
    python -m pip cache purge
    python -m pip install --force-reinstall comfyui-workflow-templates -i https://pypi.org/simple/
    

关键习惯:用 python -m pip 而不是裸 pip,确保装进当前 Conda 环境。


五、第四步:可移植的启动脚本

系统重启会重置 .bashrc,所以脚本不能依赖 conda init 写入的内容,而要自己 source conda 的初始化脚本。

最终脚本(放在持久化目录,例如 /root/private_data/apprepo/model/run_comfyui.sh):

#!/bin/bash

# ============================================
# 启动ComfyUI
# ============================================
cd ./ComfyUI
OMP_NUM_THREADS=10
export OMP_NUM_THREADS=10
#export HF_ENDPOINT=https://hf-mirror.com

# 定义 Conda 环境(使用 --prefix 创建的持久化环境)
CONDA_ENV_PREFIX="/root/private_data/apprepo/model/venv"

# 加载 conda 的初始化脚本,让 conda activate 可用
source /opt/conda/etc/profile.d/conda.sh
conda activate "$CONDA_ENV_PREFIX"

# 定义运行命令
COMMAND="python main.py --listen 0.0.0.0 --port 8188"

# 无限循环以保持程序运行
while true; do
    echo "Starting the application..."
    $COMMAND
    EXIT_CODE=$?

    # 检查退出代码,如果不是正常退出(比如退出代码为0),则等待一段时间后重启
    if [ $EXIT_CODE -ne 0 ]; then
        echo "Application exited with code $EXIT_CODE. Restarting in 5 seconds..."
        sleep 5
    else
        echo "Application exited normally."
        break
    fi
done

使用:

chmod +x run_comfyui.sh
./run_comfyui.sh

要点说明:

  • source /opt/conda/etc/profile.d/conda.sh 是脚本能在非交互式 shell 里使用 conda activate 的关键。
  • 环境用 --prefix 创建,激活时也必须用绝对路径。
  • cd ./ComfyUI 是相对路径,要求脚本从 model 目录执行;想更通用可改成 cd "$(dirname "$0")/ComfyUI"。
  • 无限循环 + 退出码判断:非 0 退出 5 秒后自动重启,正常退出则结束。

六、可选:开机自启动(systemd)

如果希望机器启动后自动拉起 ComfyUI,可以交给 systemd:

sudo nano /etc/systemd/system/comfyui.service
[Unit]
Description=ComfyUI Service
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/private_data/apprepo/model
ExecStart=/root/private_data/apprepo/model/run_comfyui.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable comfyui.service
sudo systemctl start comfyui.service

注意 systemd 里不要依赖相对路径,用 WorkingDirectory 固定工作目录,ExecStart 用绝对路径。


七、总结

问题根因解决
git clone TLS 报错HTTPS 传输大包被中断浅克隆 / 改用 SSH / 调大 http.postBuffer
conda activate 无效shell 未加载 conda 函数source /opt/conda/etc/profile.d/conda.sh
pip 找不到依赖Python 3.10 过低 + 镜像同步不全用 Python 3.12,临时切官方源
重启后环境失效.bashrc 被重置环境建在持久化目录,脚本自行 source conda
插件安装—克隆到 custom_nodes 下,浅克隆兜底

核心思路一句话:环境放持久化目录,脚本自己初始化 Conda,不依赖系统 shell 配置。 这样无论重启多少次,跑一下脚本就能继续用,不需要重新安装。

相关文章

评论

加载中...