adbrasi commited on
Commit
8472f61
·
verified ·
1 Parent(s): 54de20e

Upload WANcomfyui_installer_fixed.sh

Browse files
Files changed (1) hide show
  1. WANcomfyui_installer_fixed.sh +662 -0
WANcomfyui_installer_fixed.sh ADDED
@@ -0,0 +1,662 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # ============================================================================
4
+ # Instalador Dinâmico para ComfyUI com Wan 2.2
5
+ # Instala o ComfyUI e suas dependências no diretório atual.
6
+ # Versão: 2.0 - Corrigida e Otimizada
7
+ # ============================================================================
8
+
9
+ set -e
10
+ set -o pipefail
11
+
12
+ # ============================================================================
13
+ # CONFIGURAÇÕES GLOBAIS
14
+ # ============================================================================
15
+
16
+ # URL do workflow a ser baixado
17
+ readonly WORKFLOW_URL="https://huggingface.co/adbrasi/akarris_trainer/resolve/main/Wan_GenerationBase.json"
18
+
19
+ # --- Caminhos Dinâmicos ---
20
+ readonly INSTALL_BASE_DIR="$(pwd)"
21
+ readonly WORKSPACE_DIR="$INSTALL_BASE_DIR/ComfyUI"
22
+ readonly WORKFLOW_FILENAME="workflow.json"
23
+ readonly WORKFLOW_FILE="$INSTALL_BASE_DIR/$WORKFLOW_FILENAME"
24
+
25
+ # Arquivo de log
26
+ readonly LOG_FILE="$INSTALL_BASE_DIR/install.log"
27
+
28
+ # ============================================================================
29
+ # FUNÇÕES DE UTILIDADE
30
+ # ============================================================================
31
+
32
+ log_info() {
33
+ local msg="[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1"
34
+ echo "$msg" | tee -a "$LOG_FILE" >&2
35
+ }
36
+
37
+ log_warning() {
38
+ local msg="[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1"
39
+ echo "$msg" | tee -a "$LOG_FILE" >&2
40
+ }
41
+
42
+ log_error() {
43
+ local msg="[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1"
44
+ echo "$msg" | tee -a "$LOG_FILE" >&2
45
+ }
46
+
47
+ command_exists() {
48
+ command -v "$1" >/dev/null 2>&1
49
+ }
50
+
51
+ # ============================================================================
52
+ # VERIFICAÇÃO DE REQUISITOS
53
+ # ============================================================================
54
+
55
+ check_requirements() {
56
+ log_info "Verificando requisitos do sistema..."
57
+
58
+ local missing_deps=()
59
+
60
+ if ! command_exists python3; then
61
+ missing_deps+=("python3")
62
+ fi
63
+
64
+ if ! command_exists git; then
65
+ missing_deps+=("git")
66
+ fi
67
+
68
+ if ! command_exists gcc; then
69
+ missing_deps+=("gcc/build-essential")
70
+ fi
71
+
72
+ if ! command_exists nvcc; then
73
+ log_warning "CUDA toolkit (nvcc) não encontrado. A compilação do SageAttention pode falhar."
74
+ fi
75
+
76
+ if [ ${#missing_deps[@]} -gt 0 ]; then
77
+ log_error "Dependências faltando: ${missing_deps[*]}"
78
+ log_error "Por favor, instale as dependências faltando e execute o script novamente."
79
+ exit 1
80
+ fi
81
+
82
+ # Verifica versão do Python
83
+ local python_version=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
84
+ log_info "Python version: $python_version"
85
+
86
+ if ! python3 -c 'import sys; exit(0 if sys.version_info >= (3,8) else 1)'; then
87
+ log_error "Python 3.8 ou superior é necessário"
88
+ exit 1
89
+ fi
90
+
91
+ log_info "Todos os requisitos básicos estão presentes."
92
+ }
93
+
94
+ # ============================================================================
95
+ # FUNÇÃO DE LIMPEZA
96
+ # ============================================================================
97
+
98
+ cleanup_existing_installation() {
99
+ log_info "Verificando instalações existentes em: $WORKSPACE_DIR"
100
+
101
+ if [ -d "$WORKSPACE_DIR" ]; then
102
+ log_warning "Diretório existente encontrado: $WORKSPACE_DIR"
103
+ read -p "Deseja remover a instalação existente? (s/n): " -n 1 -r
104
+ echo
105
+ if [[ $REPLY =~ ^[Ss]$ ]]; then
106
+ log_info "Removendo a instalação existente..."
107
+ rm -rf "$WORKSPACE_DIR"
108
+ log_info "Diretório removido."
109
+ else
110
+ log_error "Instalação cancelada pelo usuário."
111
+ exit 1
112
+ fi
113
+ else
114
+ log_info "Nenhuma instalação anterior encontrada no local."
115
+ fi
116
+ }
117
+
118
+ # ============================================================================
119
+ # INSTALAÇÃO DO COMFY-CLI
120
+ # ============================================================================
121
+
122
+ install_comfy_cli() {
123
+ log_info "Instalando/atualizando comfy-cli..."
124
+
125
+ python3 -m pip install --upgrade pip
126
+ python3 -m pip install --upgrade comfy-cli || {
127
+ log_error "Falha ao instalar comfy-cli"
128
+ return 1
129
+ }
130
+
131
+ # Adiciona ~/.local/bin ao PATH se necessário
132
+ if [ -d "$HOME/.local/bin" ] && [[ ":$PATH:" != *":$HOME/.local/bin:"* ]]; then
133
+ export PATH="$HOME/.local/bin:$PATH"
134
+ log_info "Adicionado $HOME/.local/bin ao PATH para esta sessão."
135
+ fi
136
+
137
+ if ! command_exists comfy; then
138
+ log_error "Comando 'comfy' não encontrado no PATH após a instalação."
139
+ log_error "Tente executar: export PATH=\"\$HOME/.local/bin:\$PATH\""
140
+ return 1
141
+ fi
142
+
143
+ log_info "comfy-cli instalado: $(comfy --version 2>/dev/null || echo 'versão desconhecida')"
144
+ return 0
145
+ }
146
+
147
+ # ============================================================================
148
+ # INSTALAÇÃO DO COMFYUI
149
+ # ============================================================================
150
+
151
+ install_comfyui() {
152
+ log_info "Instalando ComfyUI em: $WORKSPACE_DIR"
153
+
154
+ # Instala ComfyUI com suporte NVIDIA
155
+ if ! comfy --workspace "$WORKSPACE_DIR" --skip-prompt install --nvidia; then
156
+ log_error "Falha ao instalar ComfyUI"
157
+ return 1
158
+ fi
159
+
160
+ log_info "ComfyUI instalado com sucesso."
161
+ return 0
162
+ }
163
+
164
+ # ============================================================================
165
+ # INSTALAÇÃO DO HUGGINGFACE HUB E HF_TRANSFER
166
+ # ============================================================================
167
+
168
+ install_hf_tools() {
169
+ log_info "Instalando HuggingFace Hub CLI e hf_transfer..."
170
+
171
+ python3 -m pip install -U "huggingface_hub[cli]" hf_transfer || {
172
+ log_error "Falha ao instalar ferramentas HuggingFace"
173
+ return 1
174
+ }
175
+
176
+ # Habilita o hf_transfer para downloads mais rápidos
177
+ export HF_HUB_ENABLE_HF_TRANSFER=1
178
+
179
+ log_info "HuggingFace tools instalados com sucesso."
180
+ return 0
181
+ }
182
+
183
+ # ============================================================================
184
+ # INSTALAÇÃO DO SAGEATTENTION 2.2.0 (COMPILAÇÃO OTIMIZADA)
185
+ # ============================================================================
186
+
187
+ install_sageattention() {
188
+ log_info "Instalando SageAttention 2.2.0 com 2++ (compilação otimizada)..."
189
+
190
+ local sage_dir="$INSTALL_BASE_DIR/SageAttention"
191
+
192
+ # Remove instalação anterior se existir
193
+ if [ -d "$sage_dir" ]; then
194
+ log_info "Removendo instalação anterior do SageAttention..."
195
+ rm -rf "$sage_dir"
196
+ fi
197
+
198
+ # Instala dependências necessárias
199
+ log_info "Instalando dependências do SageAttention (Triton e utilidades)..."
200
+ python3 -m pip install 'triton>=3.0.0,<3.1.0' packaging ninja || {
201
+ log_error "Falha ao instalar dependências do SageAttention"
202
+ return 1
203
+ }
204
+
205
+ # Clona o repositório
206
+ log_info "Clonando repositório SageAttention..."
207
+ if ! git clone https://github.com/thu-ml/SageAttention.git "$sage_dir"; then
208
+ log_error "Falha ao clonar repositório SageAttention"
209
+ return 1
210
+ fi
211
+
212
+ cd "$sage_dir"
213
+
214
+ # Configura variáveis de ambiente para compilação otimizada
215
+ log_info "Configurando ambiente de compilação otimizada..."
216
+ export EXT_PARALLEL=4
217
+ export NVCC_APPEND_FLAGS="--threads 8"
218
+ export MAX_JOBS=32
219
+ export TORCH_CUDA_ARCH_LIST="8.9" # Ada architecture
220
+
221
+ # Detecta automaticamente outras arquiteturas CUDA se disponível
222
+ if command_exists nvidia-smi; then
223
+ local cuda_capability=$(nvidia-smi --query-gpu=compute_cap --format=csv,noheader | head -n1 | tr -d '.')
224
+ if [ -n "$cuda_capability" ]; then
225
+ log_info "Detectada capacidade CUDA: $cuda_capability"
226
+ # Adiciona a arquitetura detectada se não for Ada
227
+ if [ "$cuda_capability" != "89" ]; then
228
+ export TORCH_CUDA_ARCH_LIST="$TORCH_CUDA_ARCH_LIST;${cuda_capability:0:1}.${cuda_capability:1}"
229
+ log_info "TORCH_CUDA_ARCH_LIST configurado para: $TORCH_CUDA_ARCH_LIST"
230
+ fi
231
+ fi
232
+ fi
233
+
234
+ # Compila e instala
235
+ log_info "Compilando SageAttention (isso pode demorar 5-10 minutos)..."
236
+ if ! python3 setup.py install >> "$LOG_FILE" 2>&1; then
237
+ log_error "Falha ao compilar SageAttention. Verifique $LOG_FILE para detalhes."
238
+ cd "$INSTALL_BASE_DIR"
239
+ return 1
240
+ fi
241
+
242
+ cd "$INSTALL_BASE_DIR"
243
+ log_info "SageAttention 2.2.0 instalado com sucesso!"
244
+ return 0
245
+ }
246
+
247
+ # ============================================================================
248
+ # FUNÇÃO DE DOWNLOAD COM RETRY E VERIFICAÇÃO
249
+ # ============================================================================
250
+
251
+ download_file_with_retry() {
252
+ local url="$1"
253
+ local dest_dir="$2"
254
+ local filename="${3:-}"
255
+ local max_retries=3
256
+ local retry_count=0
257
+
258
+ # Remove parâmetros de query do nome do arquivo se não foi especificado
259
+ if [ -z "$filename" ]; then
260
+ filename=$(basename "${url%%\?*}")
261
+ fi
262
+
263
+ local dest_file="$dest_dir/$filename"
264
+
265
+ # Cria o diretório de destino se não existir
266
+ mkdir -p "$dest_dir"
267
+
268
+ while [ $retry_count -lt $max_retries ]; do
269
+ log_info "Baixando: $filename (tentativa $((retry_count + 1))/$max_retries)"
270
+
271
+ # Usa huggingface-cli se disponível (mais confiável para HF)
272
+ if command_exists huggingface-cli && [[ "$url" == *"huggingface.co"* ]]; then
273
+ # Extrai repo e filename do URL do HuggingFace
274
+ local hf_path=$(echo "$url" | sed -n 's|.*huggingface.co/\([^/]*/[^/]*\)/resolve/main/\(.*\)\?.*|\1 \2|p')
275
+ if [ -n "$hf_path" ]; then
276
+ local repo=$(echo "$hf_path" | cut -d' ' -f1)
277
+ local file_path=$(echo "$hf_path" | cut -d' ' -f2)
278
+
279
+ export HF_HUB_ENABLE_HF_TRANSFER=1
280
+ if huggingface-cli download "$repo" "$file_path" --local-dir "$dest_dir" --local-dir-use-symlinks False >> "$LOG_FILE" 2>&1; then
281
+ # Move o arquivo para o nome correto se necessário
282
+ if [ -f "$dest_dir/$file_path" ] && [ "$file_path" != "$filename" ]; then
283
+ mv "$dest_dir/$file_path" "$dest_file"
284
+ fi
285
+ log_info "Download concluído: $filename"
286
+ return 0
287
+ fi
288
+ fi
289
+ fi
290
+
291
+ # Fallback para wget/curl
292
+ if command_exists wget; then
293
+ if wget -c -O "$dest_file" "$url" >> "$LOG_FILE" 2>&1; then
294
+ log_info "Download concluído: $filename"
295
+ return 0
296
+ fi
297
+ elif command_exists curl; then
298
+ if curl -L -C - -o "$dest_file" "$url" >> "$LOG_FILE" 2>&1; then
299
+ log_info "Download concluído: $filename"
300
+ return 0
301
+ fi
302
+ else
303
+ log_error "Nenhuma ferramenta de download (wget/curl) encontrada."
304
+ return 1
305
+ fi
306
+
307
+ retry_count=$((retry_count + 1))
308
+ if [ $retry_count -lt $max_retries ]; then
309
+ log_warning "Download falhou. Tentando novamente em 5 segundos..."
310
+ sleep 5
311
+ fi
312
+ done
313
+
314
+ log_error "Falha ao baixar $filename após $max_retries tentativas"
315
+ return 1
316
+ }
317
+
318
+ # ============================================================================
319
+ # DOWNLOAD DO WORKFLOW
320
+ # ============================================================================
321
+
322
+ download_workflow() {
323
+ log_info "Baixando o workflow..."
324
+
325
+ if download_file_with_retry "$WORKFLOW_URL" "$INSTALL_BASE_DIR" "$WORKFLOW_FILENAME"; then
326
+ if [ -f "$WORKFLOW_FILE" ]; then
327
+ log_info "Workflow baixado com sucesso."
328
+ return 0
329
+ fi
330
+ fi
331
+
332
+ log_error "Falha ao baixar o arquivo do workflow."
333
+ return 1
334
+ }
335
+
336
+ # ============================================================================
337
+ # DOWNLOAD DE MODELOS WAN 2.2
338
+ # ============================================================================
339
+
340
+ download_models() {
341
+ log_info "Iniciando download dos modelos Wan 2.2..."
342
+
343
+ # Criação de diretórios
344
+ local dirs=(
345
+ "$WORKSPACE_DIR/models/diffusion_models"
346
+ "$WORKSPACE_DIR/models/loras"
347
+ "$WORKSPACE_DIR/models/text_encoders"
348
+ "$WORKSPACE_DIR/models/vae"
349
+ "$WORKSPACE_DIR/models/clip_vision"
350
+ )
351
+
352
+ for dir in "${dirs[@]}"; do
353
+ mkdir -p "$dir"
354
+ done
355
+
356
+ # Lista de modelos Wan 2.2
357
+ local models=(
358
+ # Diffusion Models
359
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors:$WORKSPACE_DIR/models/diffusion_models:wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors"
360
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/diffusion_models/wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors:$WORKSPACE_DIR/models/diffusion_models:wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors"
361
+
362
+ # LoRAs
363
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors:$WORKSPACE_DIR/models/loras:wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors"
364
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors:$WORKSPACE_DIR/models/loras:wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors"
365
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors:$WORKSPACE_DIR/models/loras:wan2.2_t2v_lightx2v_4steps_lora_v1.1_high_noise.safetensors"
366
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/loras/wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors:$WORKSPACE_DIR/models/loras:wan2.2_t2v_lightx2v_4steps_lora_v1.1_low_noise.safetensors"
367
+
368
+ # Text Encoders
369
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp16.safetensors:$WORKSPACE_DIR/models/text_encoders:umt5_xxl_fp16.safetensors"
370
+ "https://huggingface.co/Comfy-Org/Wan_2.2_ComfyUI_Repackaged/resolve/main/split_files/text_encoders/umt5_xxl_fp8_e4m3fn_scaled.safetensors:$WORKSPACE_DIR/models/text_encoders:umt5_xxl_fp8_e4m3fn_scaled.safetensors"
371
+
372
+ # VAE (mantido do original)
373
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/vae/wan_2.1_vae.safetensors:$WORKSPACE_DIR/models/vae:wan_2.1_vae.safetensors"
374
+
375
+ # CLIP Vision (mantido do original)
376
+ "https://huggingface.co/Comfy-Org/Wan_2.1_ComfyUI_repackaged/resolve/main/split_files/clip_vision/clip_vision_h.safetensors:$WORKSPACE_DIR/models/clip_vision:clip_vision_h.safetensors"
377
+ )
378
+
379
+ local failed_downloads=()
380
+
381
+ # Download sequencial com progresso
382
+ local total=${#models[@]}
383
+ local current=0
384
+
385
+ for model_info in "${models[@]}"; do
386
+ IFS=':' read -r url dest_dir filename <<< "$model_info"
387
+ current=$((current + 1))
388
+
389
+ log_info "[$current/$total] Baixando modelo: $filename"
390
+
391
+ if ! download_file_with_retry "$url" "$dest_dir" "$filename"; then
392
+ failed_downloads+=("$filename")
393
+ log_warning "Falha ao baixar: $filename. Continuando com outros downloads..."
394
+ fi
395
+ done
396
+
397
+ if [ ${#failed_downloads[@]} -gt 0 ]; then
398
+ log_warning "Os seguintes modelos falharam ao baixar:"
399
+ for model in "${failed_downloads[@]}"; do
400
+ log_warning " - $model"
401
+ done
402
+ log_warning "Você pode tentar baixá-los manualmente mais tarde."
403
+ else
404
+ log_info "Todos os modelos foram baixados com sucesso!"
405
+ fi
406
+
407
+ return 0
408
+ }
409
+
410
+ # ============================================================================
411
+ # INSTALAÇÃO DE CUSTOM NODES E DEPENDÊNCIAS
412
+ # ============================================================================
413
+
414
+ install_custom_nodes_and_deps() {
415
+ log_info "Instalando custom nodes e dependências..."
416
+
417
+ # Instala dependências do workflow se existir
418
+ if [ -f "$WORKFLOW_FILE" ]; then
419
+ log_info "Instalando dependências do workflow..."
420
+ comfy --workspace "$WORKSPACE_DIR" node install-deps --workflow="$WORKFLOW_FILE" >> "$LOG_FILE" 2>&1 || {
421
+ log_warning "Algumas dependências do workflow podem ter falhado ao instalar."
422
+ }
423
+ fi
424
+
425
+ # Lista de custom nodes
426
+ local custom_nodes=(
427
+ "https://github.com/LAOGOU-666/Comfyui-Memory_Cleanup"
428
+ "https://github.com/Suzie1/ComfyUI_Comfyroll_CustomNodes"
429
+ "https://github.com/kijai/ComfyUI-KJNodes"
430
+ "https://github.com/kijai/ComfyUI-WanVideoWrapper.git"
431
+ )
432
+
433
+ local failed_nodes=()
434
+
435
+ for node_url in "${custom_nodes[@]}"; do
436
+ log_info "Instalando custom node: $(basename "$node_url" .git)"
437
+ if ! comfy --workspace "$WORKSPACE_DIR" node install "$node_url" >> "$LOG_FILE" 2>&1; then
438
+ failed_nodes+=("$node_url")
439
+ log_warning "Falha ao instalar: $(basename "$node_url" .git)"
440
+ fi
441
+ done
442
+
443
+ if [ ${#failed_nodes[@]} -gt 0 ]; then
444
+ log_warning "Os seguintes custom nodes falharam:"
445
+ for node in "${failed_nodes[@]}"; do
446
+ log_warning " - $node"
447
+ done
448
+ else
449
+ log_info "Todos os custom nodes foram instalados com sucesso!"
450
+ fi
451
+
452
+ return 0
453
+ }
454
+
455
+ # ============================================================================
456
+ # VERIFICAÇÃO FINAL DA INSTALAÇÃO
457
+ # ============================================================================
458
+
459
+ verify_installation() {
460
+ log_info "Verificando a instalação..."
461
+
462
+ local issues=()
463
+
464
+ # Verifica ComfyUI
465
+ if [ ! -d "$WORKSPACE_DIR" ]; then
466
+ issues+=("Diretório ComfyUI não encontrado")
467
+ fi
468
+
469
+ # Verifica workflow
470
+ if [ ! -f "$WORKFLOW_FILE" ]; then
471
+ issues+=("Arquivo de workflow não encontrado")
472
+ fi
473
+
474
+ # Verifica pelo menos um modelo
475
+ if [ -z "$(ls -A "$WORKSPACE_DIR/models/diffusion_models" 2>/dev/null)" ]; then
476
+ issues+=("Nenhum modelo de difusão encontrado")
477
+ fi
478
+
479
+ # Verifica SageAttention
480
+ if ! python3 -c "import sageattention" 2>/dev/null; then
481
+ log_warning "SageAttention não está instalado (opcional)"
482
+ fi
483
+
484
+ if [ ${#issues[@]} -gt 0 ]; then
485
+ log_error "Problemas encontrados na instalação:"
486
+ for issue in "${issues[@]}"; do
487
+ log_error " - $issue"
488
+ done
489
+ return 1
490
+ fi
491
+
492
+ log_info "Instalação verificada com sucesso!"
493
+ return 0
494
+ }
495
+
496
+ # ============================================================================
497
+ # INICIAR O COMFYUI
498
+ # ============================================================================
499
+
500
+ launch_comfyui() {
501
+ log_info "================================================="
502
+ log_info "Instalação concluída com sucesso!"
503
+ log_info "================================================="
504
+ log_info ""
505
+ log_info "Iniciando ComfyUI..."
506
+ log_info " Porta: 8818"
507
+ log_info " Workspace: $WORKSPACE_DIR"
508
+ log_info " Workflow: $WORKFLOW_FILE"
509
+ log_info ""
510
+ log_info "Para usar o workflow:"
511
+ log_info " 1. Acesse http://127.0.0.1:8818 no seu navegador"
512
+ log_info " 2. Arraste e solte o arquivo '$WORKFLOW_FILENAME' na interface"
513
+ log_info ""
514
+ log_info "Pressione Ctrl+C para parar o servidor"
515
+ log_info "================================================="
516
+
517
+ # Verifica se o SageAttention está instalado
518
+ local sage_args=""
519
+ if python3 -c "import sageattention" 2>/dev/null; then
520
+ sage_args="--use-sage-attention"
521
+ log_info "SageAttention habilitado!"
522
+ fi
523
+
524
+ # Inicia o ComfyUI
525
+ exec comfy --workspace "$WORKSPACE_DIR" launch -- \
526
+ --fast \
527
+ --listen 0.0.0.0 \
528
+ --port 8818 \
529
+ $sage_args \
530
+ --preview-method latent2rgb
531
+ }
532
+
533
+ # ============================================================================
534
+ # FUNÇÃO PRINCIPAL
535
+ # ============================================================================
536
+
537
+ main() {
538
+ # Inicializa log
539
+ echo "=== Instalação ComfyUI iniciada em $(date) ===" > "$LOG_FILE"
540
+
541
+ log_info "================================================="
542
+ log_info "Instalador ComfyUI com Wan 2.2"
543
+ log_info "================================================="
544
+
545
+ # Etapa 1: Verificar requisitos
546
+ check_requirements || exit 1
547
+
548
+ # Etapa 2: Limpar instalação existente
549
+ cleanup_existing_installation
550
+
551
+ # Etapa 3: Instalar comfy-cli
552
+ install_comfy_cli || exit 1
553
+
554
+ # Etapa 4: Instalar ferramentas HuggingFace
555
+ install_hf_tools || exit 1
556
+
557
+ # Etapa 5: Instalar ComfyUI
558
+ install_comfyui || exit 1
559
+
560
+ # Etapa 6: Baixar workflow
561
+ download_workflow || log_warning "Workflow não foi baixado"
562
+
563
+ # Etapa 7: Instalar custom nodes
564
+ install_custom_nodes_and_deps
565
+
566
+ # Etapa 8: PROCESSOS PARALELOS - SageAttention e Downloads de Modelos
567
+ log_info "================================================="
568
+ log_info "Iniciando processos paralelos:"
569
+ log_info " 1. Instalação do SageAttention (5-10 minutos)"
570
+ log_info " 2. Download dos modelos Wan 2.2 (vários GB)"
571
+ log_info "================================================="
572
+
573
+ # Inicia instalação do SageAttention em background
574
+ log_info "Iniciando instalação do SageAttention em background..."
575
+ install_sageattention &
576
+ local sage_pid=$!
577
+
578
+ # Inicia downloads dos modelos em background
579
+ log_info "Iniciando downloads dos modelos em background..."
580
+ download_models &
581
+ local models_pid=$!
582
+
583
+ # Monitor de progresso
584
+ log_info "Aguardando conclusão dos processos paralelos..."
585
+ log_info "Você pode monitorar o progresso em: $LOG_FILE"
586
+
587
+ local both_done=false
588
+ local sage_done=false
589
+ local models_done=false
590
+
591
+ while [ "$both_done" = false ]; do
592
+ # Verifica SageAttention
593
+ if [ "$sage_done" = false ]; then
594
+ if ! ps -p $sage_pid > /dev/null 2>&1; then
595
+ wait $sage_pid
596
+ local sage_exit=$?
597
+ sage_done=true
598
+ if [ $sage_exit -eq 0 ]; then
599
+ log_info "✓ SageAttention instalado com sucesso!"
600
+ else
601
+ log_warning "⚠ SageAttention pode não ter sido instalado corretamente"
602
+ fi
603
+ fi
604
+ fi
605
+
606
+ # Verifica Downloads
607
+ if [ "$models_done" = false ]; then
608
+ if ! ps -p $models_pid > /dev/null 2>&1; then
609
+ wait $models_pid
610
+ local models_exit=$?
611
+ models_done=true
612
+ if [ $models_exit -eq 0 ]; then
613
+ log_info "✓ Downloads dos modelos concluídos!"
614
+ else
615
+ log_warning "⚠ Alguns modelos podem não ter sido baixados"
616
+ fi
617
+ fi
618
+ fi
619
+
620
+ # Verifica se ambos terminaram
621
+ if [ "$sage_done" = true ] && [ "$models_done" = true ]; then
622
+ both_done=true
623
+ else
624
+ # Mostra status a cada 30 segundos
625
+ sleep 30
626
+ if [ "$sage_done" = false ] && ps -p $sage_pid > /dev/null 2>&1; then
627
+ log_info "... SageAttention ainda compilando..."
628
+ fi
629
+ if [ "$models_done" = false ] && ps -p $models_pid > /dev/null 2>&1; then
630
+ log_info "... Downloads ainda em progresso..."
631
+ fi
632
+ fi
633
+ done
634
+
635
+ log_info "Todos os processos paralelos foram concluídos!"
636
+
637
+ # Etapa 9: Verificar instalação
638
+ verify_installation || {
639
+ log_error "A instalação teve problemas. Verifique o log em: $LOG_FILE"
640
+ exit 1
641
+ }
642
+
643
+ # Etapa 10: Iniciar ComfyUI
644
+ launch_comfyui
645
+ }
646
+
647
+ # ============================================================================
648
+ # TRATAMENTO DE SINAIS E EXECUÇÃO
649
+ # ============================================================================
650
+
651
+ cleanup_on_exit() {
652
+ log_info "Interrompendo instalação..."
653
+ # Mata processos filhos
654
+ jobs -p | xargs -r kill 2>/dev/null
655
+ exit 1
656
+ }
657
+
658
+ # Captura sinais de interrupção
659
+ trap cleanup_on_exit INT TERM
660
+
661
+ # Executa o script principal
662
+ main "$@"