| #!/bin/bash |
|
|
| |
| |
| |
| |
|
|
| set -e |
| set -o pipefail |
|
|
| |
| |
| |
|
|
| |
| readonly WORKFLOW_URL="https://huggingface.co/adbrasi/testedownload/resolve/main/modo%20balanco3.json" |
|
|
| |
| |
| readonly INSTALL_BASE_DIR="$(pwd)" |
| |
| readonly WORKSPACE_DIR="$INSTALL_BASE_DIR/ComfyUI" |
| |
| readonly WORKFLOW_FILENAME="workflow.json" |
| readonly WORKFLOW_FILE="$INSTALL_BASE_DIR/$WORKFLOW_FILENAME" |
|
|
| |
| |
| |
|
|
| log_info() { |
| echo "INFO: $1" >&2 |
| } |
|
|
| log_warning() { |
| echo "WARNING: $1" >&2 |
| } |
|
|
| log_error() { |
| echo "ERROR: $1" >&2 |
| } |
|
|
| command_exists() { |
| command -v "$1" >/dev/null 2>&1 |
| } |
|
|
| |
| |
| |
|
|
| cleanup_existing_installation() { |
| log_info "Verificando instalações existentes em: $WORKSPACE_DIR" |
| |
| if [ -d "$WORKSPACE_DIR" ]; then |
| log_warning "Diretório existente encontrado: $WORKSPACE_DIR" |
| log_info "Removendo a instalação existente para evitar conflitos..." |
| rm -rf "$WORKSPACE_DIR" |
| log_info "Diretório removido." |
| else |
| log_info "Nenhuma instalação anterior encontrada no local. Continuando..." |
| fi |
| } |
|
|
| |
| |
| |
|
|
| install_comfy_cli() { |
| log_info "Instalando/atualizando comfy-cli..." |
| |
| python3 -m pip install --upgrade comfy-cli || { |
| log_error "Falha ao instalar comfy-cli" |
| exit 1 |
| } |
| |
| |
| if ! command_exists comfy; then |
| if [ -d "$HOME/.local/bin" ] && [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then |
| export PATH="$HOME/.local/bin:$PATH" |
| log_info "Adicionado $HOME/.local/bin ao PATH para esta sessão." |
| fi |
| |
| if ! command_exists comfy; then |
| log_error "Comando 'comfy' não encontrado no PATH após a instalação." |
| log_error "Verifique se '$HOME/.local/bin' está em seu PATH." |
| exit 1 |
| fi |
| fi |
| |
| log_info "comfy-cli version: $(comfy --version 2>/dev/null || echo 'desconhecida')" |
| } |
|
|
| |
| |
| |
|
|
| install_comfyui() { |
| log_info "Instalando ComfyUI em: $WORKSPACE_DIR" |
| |
| |
| comfy --workspace "$WORKSPACE_DIR" --skip-prompt install --nvidia || { |
| log_error "Falha ao instalar ComfyUI" |
| exit 1 |
| } |
| |
| log_info "ComfyUI instalado com sucesso." |
| } |
|
|
| |
| |
| |
|
|
| install_hf_tools() { |
| log_info "Instalando HuggingFace Hub CLI e hf_transfer..." |
| |
| python3 -m pip install -U "huggingface_hub[cli]" || { |
| log_error "Falha ao instalar huggingface_hub[cli]" |
| exit 1 |
| } |
| |
| python3 -m pip install hf_transfer || { |
| log_error "Falha ao instalar hf_transfer" |
| exit 1 |
| } |
| |
| log_info "HuggingFace tools instalados com sucesso." |
| } |
|
|
| |
| |
| |
|
|
| download_workflow() { |
| log_info "Baixando o workflow de: $WORKFLOW_URL" |
| log_info "Salvando como: $WORKFLOW_FILE" |
| |
| local success=false |
| |
| |
| if command_exists wget; then |
| if wget -q --show-progress -O "$WORKFLOW_FILE" "$WORKFLOW_URL"; then |
| success=true |
| fi |
| elif command_exists curl; then |
| if curl -L -o "$WORKFLOW_FILE" "$WORKFLOW_URL"; then |
| success=true |
| fi |
| elif command_exists aria2c; then |
| |
| if aria2c -q -o "$(basename "$WORKFLOW_FILE")" -d "$(dirname "$WORKFLOW_FILE")" "$WORKFLOW_URL"; then |
| success=true |
| fi |
| else |
| log_error "Nenhuma ferramenta de download disponível (wget, curl ou aria2c)." |
| exit 1 |
| fi |
| |
| if ! $success; then |
| log_error "Falha ao baixar o arquivo do workflow." |
| exit 1 |
| fi |
| |
| if [ ! -f "$WORKFLOW_FILE" ]; then |
| log_error "O arquivo do workflow não foi baixado com sucesso." |
| exit 1 |
| fi |
| |
| log_info "Workflow baixado com sucesso." |
| } |
|
|
| |
| |
| |
|
|
| install_workflow_dependencies() { |
| log_info "Instalando dependências do workflow a partir de: $WORKFLOW_FILE" |
| |
| if [ ! -f "$WORKFLOW_FILE" ]; then |
| log_error "Arquivo de workflow não encontrado: $WORKFLOW_FILE" |
| exit 1 |
| fi |
| |
| |
| comfy --workspace "$WORKSPACE_DIR" node install-deps --workflow="$WORKFLOW_FILE" || { |
| log_warning "Algumas dependências do workflow podem ter falhado ao instalar." |
| log_info "Isso pode ser normal. O ComfyUI mostrará os nós ausentes ao iniciar." |
| } |
| |
| log_info "Instalação de dependências do workflow concluída." |
| } |
|
|
| |
| |
| |
|
|
| install_wanvideo_wrapper() { |
| log_info "Instalando custom node ComfyUI-WanVideoWrapper..." |
| |
| local custom_nodes_dir="$WORKSPACE_DIR/custom_nodes" |
| local wrapper_dir="$custom_nodes_dir/ComfyUI-WanVideoWrapper" |
| |
| |
| mkdir -p "$custom_nodes_dir" |
| |
| |
| if [ -d "$wrapper_dir" ]; then |
| log_warning "Diretório ComfyUI-WanVideoWrapper já existe, removendo..." |
| rm -rf "$wrapper_dir" |
| fi |
| |
| cd "$custom_nodes_dir" |
| git clone https://github.com/kijai/ComfyUI-WanVideoWrapper.git || { |
| log_error "Falha ao clonar ComfyUI-WanVideoWrapper" |
| exit 1 |
| } |
| |
| |
| if [ -f "$wrapper_dir/requirements.txt" ]; then |
| log_info "Instalando dependências do ComfyUI-WanVideoWrapper..." |
| python3 -m pip install -r "$wrapper_dir/requirements.txt" || { |
| log_warning "Algumas dependências do WanVideoWrapper podem ter falhado" |
| } |
| fi |
| |
| |
| cd "$INSTALL_BASE_DIR" |
| |
| log_info "ComfyUI-WanVideoWrapper instalado com sucesso." |
| } |
|
|
| |
| |
| |
|
|
| create_model_directories() { |
| log_info "Criando diretórios para modelos..." |
| |
| mkdir -p "$WORKSPACE_DIR/models/diffusion_models" |
| mkdir -p "$WORKSPACE_DIR/models/clip_vision" |
| mkdir -p "$WORKSPACE_DIR/models/vae" |
| mkdir -p "$WORKSPACE_DIR/models/text_encoders" |
| mkdir -p "$WORKSPACE_DIR/models/loras" |
| |
| log_info "Diretórios de modelos criados." |
| } |
|
|
| |
| |
| |
|
|
| install_sageattention() { |
| log_info "Iniciando instalação do SageAttention em background (otimizado)..." |
| |
| ( |
| log_info "Clonando repositório SageAttention..." |
| if [ -d "SageAttention" ]; then |
| rm -rf SageAttention |
| fi |
| |
| git clone https://github.com/thu-ml/SageAttention.git |
| cd SageAttention |
| |
| log_info "Instalando SageAttention (isso pode demorar 5+ minutos)..." |
| python3 setup.py install |
| |
| log_info "SageAttention instalado com sucesso!" |
| |
| |
| touch "$INSTALL_BASE_DIR/.sageattention_ready" |
| |
| ) & |
| |
| local sage_pid=$! |
| log_info "Instalação do SageAttention iniciada em background. PID: $sage_pid" |
| |
| return 0 |
| } |
|
|
| |
| |
| |
|
|
| download_hf_models() { |
| log_info "Iniciando downloads de modelos do HuggingFace em paralelo..." |
| |
| local pids=() |
| |
| |
| local hf_cli_downloads=( |
| "Comfy-Org/Wan_2.1_ComfyUI_repackaged:split_files/diffusion_models/wan2.1_i2v_720p_14B_fp16.safetensors:$WORKSPACE_DIR/models/diffusion_models/" |
| "Comfy-Org/Wan_2.1_ComfyUI_repackaged:split_files/clip_vision/clip_vision_h.safetensors:$WORKSPACE_DIR/models/clip_vision/" |
| "Comfy-Org/Wan_2.1_ComfyUI_repackaged:split_files/vae/wan_2.1_vae.safetensors:$WORKSPACE_DIR/models/vae/" |
| ) |
| |
| |
| local direct_downloads=( |
| "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors:$WORKSPACE_DIR/models/text_encoders/" |
| "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan21_CausVid_14B_T2V_lora_rank32_v2.safetensors:$WORKSPACE_DIR/models/loras/" |
| "https://huggingface.co/Kijai/WanVideo_comfy/resolve/main/Wan21_T2V_14B_lightx2v_cfg_step_distill_lora_rank32.safetensors:$WORKSPACE_DIR/models/loras/" |
| ) |
| |
| |
| for download in "${hf_cli_downloads[@]}"; do |
| IFS=':' read -r repo file dest <<< "$download" |
| log_info "Iniciando download HF: $repo/$file -> $dest" |
| |
| ( |
| cd "$dest" |
| HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download "$repo" "$file" --local-dir . --local-dir-use-symlinks False |
| log_info "Concluído: $repo/$file" |
| ) & |
| |
| pids+=($!) |
| done |
| |
| |
| for download in "${direct_downloads[@]}"; do |
| IFS=':' read -r url dest <<< "$download" |
| log_info "Iniciando download direto: $url -> $dest" |
| |
| ( |
| cd "$dest" |
| if command_exists wget; then |
| wget "$url" --content-disposition |
| elif command_exists curl; then |
| curl -L -O "$url" |
| else |
| log_error "Nenhuma ferramenta de download disponível" |
| exit 1 |
| fi |
| log_info "Concluído download direto: $url" |
| ) & |
| |
| pids+=($!) |
| done |
| |
| log_info "Downloads do HuggingFace iniciados em paralelo. PIDs: ${pids[*]}" |
| return 0 |
| } |
|
|
| |
| |
| |
|
|
| download_civitai_models() { |
| log_info "Iniciando downloads do CivitAI em paralelo..." |
| |
| local civitai_downloads=( |
| "https://civitai.com/api/download/models/1516994?type=Model&format=SafeTensor" |
| ) |
| |
| local pids=() |
| |
| for url in "${civitai_downloads[@]}"; do |
| log_info "Iniciando download: $url" |
| |
| |
| ( |
| cd "$WORKSPACE_DIR/models/loras" |
| wget "$url" --content-disposition |
| log_info "Concluído download do CivitAI: $url" |
| ) & |
| |
| pids+=($!) |
| done |
| |
| log_info "Downloads do CivitAI iniciados. PIDs: ${pids[*]}" |
| return 0 |
| } |
|
|
| |
| |
| |
|
|
| wait_for_downloads() { |
| log_info "Aguardando conclusão dos downloads..." |
| |
| |
| for job in $(jobs -p); do |
| if kill -0 "$job" 2>/dev/null; then |
| log_info "Aguardando processo: $job" |
| wait "$job" |
| fi |
| done |
| |
| log_info "Todos os downloads foram concluídos." |
| } |
|
|
| |
| |
| |
|
|
| wait_for_sageattention() { |
| log_info "Verificando instalação do SageAttention..." |
| |
| |
| while [ ! -f "$INSTALL_BASE_DIR/.sageattention_ready" ]; do |
| log_info "SageAttention ainda instalando... aguardando 30 segundos" |
| sleep 30 |
| done |
| |
| |
| rm -f "$INSTALL_BASE_DIR/.sageattention_ready" |
| |
| log_info "SageAttention está pronto!" |
| } |
|
|
| |
| |
| |
|
|
| launch_comfyui() { |
| log_info "Iniciando ComfyUI na porta 8818 com SageAttention e preview latent2rgb..." |
| log_info "Workspace do ComfyUI: $WORKSPACE_DIR" |
| log_info "Arquivo de workflow disponível em: $WORKFLOW_FILE" |
| log_info "Para usar o workflow, arraste e solte o arquivo '$WORKFLOW_FILENAME' na interface do ComfyUI." |
| log_info "Acesse o ComfyUI em: http://127.0.0.1:8818 (ou o IP da sua máquina)" |
| |
| |
| exec comfy --workspace "$WORKSPACE_DIR" launch -- --fast --listen 0.0.0.0 --port 8818 --use-sage-attention --preview-method latent2rgb |
| } |
|
|
| |
| |
| |
|
|
| main() { |
|
|
| |
| log_info "=================================================" |
| log_info "Iniciando SageAttention em background (processo mais longo - ~5+ minutos)..." |
| log_info "Enquanto isso, continuaremos com as outras instalações..." |
| log_info "=================================================" |
| install_sageattention |
|
|
| |
| log_info "Iniciando instalação dinâmica do ComfyUI..." |
| log_info "Diretório de instalação base: $INSTALL_BASE_DIR" |
| log_info "=================================================" |
| |
| |
| cleanup_existing_installation |
| |
| |
| install_comfy_cli |
| |
| |
| install_hf_tools |
| |
| |
| install_comfyui |
| |
| |
| create_model_directories |
| |
| |
| download_workflow |
| |
| |
| install_workflow_dependencies |
| |
|
|
| |
| |
| install_wanvideo_wrapper |
| |
| |
| log_info "=================================================" |
| log_info "Iniciando downloads paralelos enquanto SageAttention instala..." |
| log_info "=================================================" |
| |
| download_hf_models |
| download_civitai_models |
| |
| |
| wait_for_downloads |
| |
| |
| wait_for_sageattention |
| |
| |
| log_info "=================================================" |
| log_info "Instalação concluída com sucesso!" |
| log_info "=================================================" |
| launch_comfyui |
| } |
|
|
| |
| |
| |
|
|
| |
| trap 'log_error "Script interrompido pelo usuário."; kill $(jobs -p) 2>/dev/null; exit 1' INT TERM |
|
|
| |
| main "$@" |