adbrasi commited on
Commit
f8f5a0d
·
verified ·
1 Parent(s): c638b48

Update image_Studio.sh

Browse files
Files changed (1) hide show
  1. image_Studio.sh +94 -80
image_Studio.sh CHANGED
@@ -1,23 +1,26 @@
1
  #!/usr/bin/env bash
2
- # setup_comfyui_custom_v2.sh (FIX DL HANG + BLACKWELL)
3
- # Otimizado: timeouts/retries, Civitai headers, estado robusto, Blackwell nightly
 
 
 
4
 
5
  set -euo pipefail
6
 
7
  # --------------------------------
8
- # Modo interativo?
9
  # --------------------------------
10
  if [ ! -t 0 ] || [ ! -t 1 ]; then INTERACTIVE=false; else INTERACTIVE=true; fi
11
 
12
  # --------------------------------
13
- # Cores
14
  # --------------------------------
15
  RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
16
- log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
17
  log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
18
- log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
19
- log_error() { echo -e "${RED}[✗]${NC} $1"; }
20
- log_progress() { echo -e "${CYAN}[→]${NC} $1"; }
21
 
22
  # --------------------------------
23
  # Config
@@ -27,7 +30,7 @@ MODELS_DIR="$COMFY_DIR/models"
27
  COMFY_HOST="${COMFY_HOST:-0.0.0.0}"
28
  COMFY_PORT="${COMFY_PORT:-8818}"
29
 
30
- # Mantemos as keys hardcoded como pedido
31
  CIVITAI_TOKEN="${CIVITAI_TOKEN:-4fcb2834969399006a736ee402b061e5}"
32
  HF_TOKEN="${HF_TOKEN:-}"
33
 
@@ -46,9 +49,9 @@ export HF_TRANSFER_CONCURRENCY=16
46
  export EXT_PARALLEL=4
47
  export PIP_DEFAULT_TIMEOUT=60
48
 
49
- # Rede (timeouts e headers)
50
- DOWNLOAD_TIMEOUT="${DOWNLOAD_TIMEOUT:-900}" # 15min hard cap por artefato
51
- CONNECT_TIMEOUT="${CONNECT_TIMEOUT:-20}" # conexão
52
  RETRY_COUNT="${RETRY_COUNT:-3}"
53
  RETRY_WAIT="${RETRY_WAIT:-3}"
54
  UA="${UA:-Mozilla/5.0 (X11; Linux x86_64) curl/8}"
@@ -57,19 +60,18 @@ CIVITAI_REF="https://civitai.com/"
57
  # --------------------------------
58
  # Estado
59
  # --------------------------------
60
- init_state(){ mkdir -p "$STATE_DIR"; :> "$STATE_FILE"; touch "$COMPLETED_DOWNLOADS" "$COMPLETED_NODES"; }
61
  save_state(){ echo "$1" > "$STATE_FILE"; log_info "Estado salvo: $1"; }
62
  get_state(){ [[ -f "$STATE_FILE" && "$(cat "$STATE_FILE" || echo 0)" =~ ^[0-9]+$ ]] && cat "$STATE_FILE" || echo 0; }
63
  reset_state(){ log_warn "Resetando estado da instalação..."; rm -rf "$STATE_DIR"; init_state; }
64
 
65
- # normaliza "url|type|filename" (trim e remove espaços fantasma)
66
- normalize_entry(){
67
- local url="$1"; local type="$2"; local filename="$3"
68
- url="$(echo -n "$url" | xargs)"; type="$(echo -n "$type" | xargs)"; filename="$(echo -n "${filename:-}" | xargs)"
69
  echo "${url}|${type}|${filename}"
70
  }
71
- mark_download_complete(){ local key="$1"; echo "$key" >> "$COMPLETED_DOWNLOADS"; }
72
- is_download_complete(){ local key="$1"; [[ -f "$COMPLETED_DOWNLOADS" ]] && grep -Fxq "$key" "$COMPLETED_DOWNLOADS"; }
73
  mark_node_complete(){ echo "$1" >> "$COMPLETED_NODES"; }
74
  is_node_complete(){ [[ -f "$COMPLETED_NODES" ]] && grep -Fxq "$1" "$COMPLETED_NODES"; }
75
 
@@ -152,53 +154,46 @@ install_megatools(){
152
  if ! command_exists megadl; then
153
  log_info "Instalando megatools..."
154
  apt-get update -qq && apt-get install -y -qq megatools >/dev/null 2>&1 || true
155
- command_exists megadl && log_success "Megatools OK" || log_warn "Megatools falhou (downloads do Mega podem não funcionar)"
156
  fi
157
  }
158
 
159
  add_civitai_token(){
160
  local url="$1"
161
- if [[ "$url" == *"civitai.com/api/download"* ]] && [[ "$url" != *"token="* ]]; then
162
  echo "${url}&token=${CIVITAI_TOKEN}"
163
  else
164
  echo "$url"
165
  fi
166
  }
167
 
168
- # HuggingFace (CLI) com timeout
169
- download_hf(){
170
  local repo="$1" file_path="$2" target_dir="$3" filename="$4"
171
  [[ -z "$filename" ]] && filename="$(basename "$file_path")"
172
- local target_file="$target_dir/$filename"
173
- if [[ -s "$target_file" && $(stat -c%s "$target_file" 2>/dev/null || echo 0) -gt 1000000 ]]; then
174
- log_success "Arquivo já existe: $filename"; return 0
175
- fi
176
 
177
- log_info "Baixando de HF: $repo/$file_path -> $filename"
178
- local temp_dir; temp_dir="$(mktemp -d)"
179
- local ok=false
180
 
181
  if command_exists hf; then
182
  if timeout "$DOWNLOAD_TIMEOUT" env HF_HUB_ENABLE_HF_TRANSFER=1 hf download "$repo" "$file_path" \
183
- --local-dir "$temp_dir" --local-dir-use-symlinks False >/dev/null 2>&1; then ok=true; fi
184
  fi
185
-
186
- if [[ "$ok" = false && $(command_exists huggingface-cli; echo $?) -eq 0 ]]; then
187
  log_warn "Tentando com huggingface-cli..."
188
  if timeout "$DOWNLOAD_TIMEOUT" env HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download "$repo" "$file_path" \
189
- --local-dir "$temp_dir" --local-dir-use-symlinks False >/dev/null 2>&1; then ok=true; fi
190
  fi
191
 
192
- if "$ok"; then
193
- local f; f="$(find "$temp_dir" -type f \( -name "*.safetensors" -o -name "*.pth" -o -name "*.pt" -o -name "*.bin" -o -name "*.onnx" \) | head -1)"
194
- if [[ -n "$f" ]]; then mv "$f" "$target_file"; rm -rf "$temp_dir"; log_success "HF OK: $filename"; return 0; fi
195
  fi
196
-
197
- rm -rf "$temp_dir"; log_error "HF falhou: $filename"; return 1
198
  }
199
 
200
- # MEGA com timeout
201
- download_mega(){
202
  local url="$1" target_dir="$2"
203
  command_exists megadl || { log_error "megatools não instalado"; return 1; }
204
  url="${url#mega://}"
@@ -207,52 +202,45 @@ download_mega(){
207
  log_error "MEGA falhou/timeout"; return 1
208
  }
209
 
210
- # Detecta nome via cabeçalho
211
- detect_remote_name(){
212
- local url="$1"
213
- local name
214
  name="$(timeout 60 curl -I -sSL -4 -A "$UA" -e "$CIVITAI_REF" "$url" \
215
- | awk -F'filename=' 'BEGIN{IGNORECASE=1}/content-disposition/{gsub(/\"|;|\r/,"",$2); print $2}' | tail -1)"
216
  [[ -z "$name" ]] && name="$(basename "$(echo "$url" | cut -d'?' -f1)")"
217
  echo "$name"
218
  }
219
 
220
- # Baixador genérico (CURL -> WGET -> ARIA2C), todos com timeout & retries
221
- download_file(){
222
- local url="$1" target_dir="$2" filename="$3"
223
  url="$(add_civitai_token "$url")"
224
-
225
- if [[ -z "$filename" ]]; then filename="$(detect_remote_name "$url")"; fi
226
  local out="$target_dir/$filename"
227
 
228
  if [[ -s "$out" && $(stat -c%s "$out" 2>/dev/null || echo 0) -gt 1000000 ]]; then
229
  log_success "Arquivo já existe: $filename"; return 0
230
  fi
231
 
232
- log_info "HTTP: ${filename} (-> $target_dir)"
233
 
234
- # 1) CURL
235
  if command_exists curl; then
236
  if timeout "$DOWNLOAD_TIMEOUT" curl -fL -4 -A "$UA" -e "$CIVITAI_REF" \
237
- --connect-timeout "$CONNECT_TIMEOUT" --retry "$RETRY_COUNT" --retry-delay "$RETRY_WAIT" \
238
- -C - -o "$out" "$url"; then
239
  log_success "CURL OK: $filename"; return 0
240
  else
241
  log_warn "CURL falhou para $filename"
242
  fi
243
  fi
244
 
245
- # 2) WGET
246
  if command_exists wget; then
247
  if timeout "$DOWNLOAD_TIMEOUT" wget -q --show-progress -4 --referer="$CIVITAI_REF" --user-agent="$UA" \
248
- --timeout="$CONNECT_TIMEOUT" --tries="$RETRY_COUNT" -c -O "$out" "$url"; then
249
  log_success "WGET OK: $filename"; return 0
250
  else
251
  log_warn "WGET falhou para $filename"
252
  fi
253
  fi
254
 
255
- # 3) ARIA2C
256
  if command_exists aria2c; then
257
  local aria_opts="-c -s 16 -x 16 -k 1M --file-allocation=none --allow-overwrite=true --auto-file-renaming=false \
258
  --summary-interval=10 --console-log-level=warn --timeout=$CONNECT_TIMEOUT --retry-wait=$RETRY_WAIT --max-tries=$RETRY_COUNT --referer=$CIVITAI_REF --user-agent=$UA"
@@ -267,9 +255,8 @@ download_file(){
267
  return 1
268
  }
269
 
270
- # Processa a lista de downloads com chave normalizada + logs
271
  process_downloads(){
272
- local total="${#DOWNLOAD_FILES[@]}"; local current=0; local failed=0
273
  log_info "Total de downloads: $total"
274
  log_info "Iniciando loop de downloads..."
275
 
@@ -299,12 +286,11 @@ process_downloads(){
299
  if [[ "$url" == mega://* ]]; then
300
  download_mega "$url" "$target_dir" && ok=0
301
  elif [[ "$url" == hf://* ]]; then
302
- url="${url#hf://}"; local repo="${url%%/*/*}"; repo="${url%/*/*}"; # não usado aqui, mantido por compat
303
- local repo2="$(echo "$url" | cut -d'/' -f1-2)"
304
  local file_path="$(echo "$url" | cut -d'/' -f3-)"
305
- download_hf "$repo2" "$file_path" "$target_dir" "$filename" && ok=0
306
  elif [[ "$url" == https://huggingface.co/*/resolve/* ]]; then
307
- # resolve/ direto por HTTP (mais rápido se público)
308
  download_file "$url" "$target_dir" "$filename" && ok=0
309
  else
310
  download_file "$url" "$target_dir" "$filename" && ok=0
@@ -325,18 +311,24 @@ process_downloads(){
325
  return 0
326
  }
327
 
328
- # Git clone/update com pip reqs e timeouts
329
  clone_or_update(){
330
  local url="$1" dest="$2" node_name="$(basename "$dest")"
331
-
332
  if is_node_complete "$url"; then log_success "Node já instalado: $node_name"; return 0; fi
333
 
 
 
 
 
 
 
 
 
334
  if [[ -d "$dest/.git" ]]; then
335
  log_info "Atualizando $node_name..."
336
- timeout 120 git -C "$dest" pull --ff-only >/dev/null 2>&1 || log_warn "Timeout/erro ao atualizar $node_name"
337
  else
338
  log_info "Clonando $node_name..."
339
- timeout 180 git clone --recursive --depth 1 "$url" "$dest" >/dev/null 2>&1 || { log_warn "Falha ao clonar $node_name"; return 0; }
340
  fi
341
 
342
  if [[ -f "$dest/requirements.txt" ]]; then
@@ -379,9 +371,8 @@ show_menu(){
379
  # Main
380
  # --------------------------------
381
  main(){
382
- mkdir -p "$COMFY_DIR" "$MODELS_DIR"; init_state
383
  show_menu
384
-
385
  local s; s="$(get_state)"
386
 
387
  # STEP 1: deps
@@ -402,20 +393,43 @@ main(){
402
  log_success "Ferramentas OK"; save_state "2"
403
  fi
404
 
405
- # STEP 3: ComfyUI
406
  if [[ "$s" -lt "3" ]]; then
407
- log_info "[3/6] Instalando ComfyUI..."
408
- if [[ -f "$COMFY_DIR/main.py" ]]; then log_warn "ComfyUI já existe"; else comfy --skip-prompt install --fast-deps --nvidia || { log_error "ComfyUI não instalou"; exit 1; }; fi
409
- log_success "ComfyUI instalado"; save_state "3"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
410
  fi
411
 
412
- # STEP 4: Blackwell nightly (se 5090/5080)
413
  if [[ "$s" -lt "4" ]]; then
414
  log_info "[4/6] Verificando GPU..."
415
  local gpu_info; gpu_info="$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo "")"
416
  if [[ "$gpu_info" == *"5090"* || "$gpu_info" == *"5080"* ]]; then
417
- log_warn "RTX ${gpu_info:-Blackwell} detectada - aplicando PyTorch nightly (como você pediu)"
418
- # alinhado ao pedido: --pre --upgrade --no-cache-dir + extra-index nightly
419
  python3 -m pip install --pre --upgrade --no-cache-dir torch --extra-index-url https://download.pytorch.org/whl/nightly/cu128
420
  python3 -m pip install --pre --upgrade --no-cache-dir torchvision --extra-index-url https://download.pytorch.org/whl/nightly/cu128
421
  log_success "PyTorch nightly (cu128) pronto"
@@ -425,7 +439,7 @@ main(){
425
  save_state "4"
426
  fi
427
 
428
- # STEP 5: modelos
429
  if [[ "$s" -lt "5" ]]; then
430
  log_info "[5/6] Baixando modelos..."
431
  mkdir -p "$MODELS_DIR"/{loras,upscale_models,checkpoints,ultralytics/bbox}
@@ -449,7 +463,7 @@ main(){
449
 
450
  # Verificação final
451
  log_info "Verificando instalação..."
452
- if [[ -f "$COMFY_DIR/main.py" ]]; then log_success "✓ ComfyUI instalado"; else log_error "✗ ComfyUI não encontrado"; fi
453
 
454
  echo ""; log_info "Modelos instalados:"
455
  for dir in checkpoints loras vae vae_approx text_encoders clip_vision upscale_models ultralytics; do
@@ -480,7 +494,7 @@ main(){
480
  read -t 10 -p "Escolha [1-3] (padrão 1): " final_choice || final_choice="1"
481
  case "$final_choice" in
482
  1|"") log_info "Iniciando ComfyUI..."; cd "$COMFY_DIR"; exec comfy launch -- --listen "$COMFY_HOST" --port "$COMFY_PORT" ;;
483
- 2) reset_state; log_success "Estado resetado. Rode de novo para reinstalar." ;;
484
  3) log_info "Saindo..." ;;
485
  *) cd "$COMFY_DIR"; exec comfy launch -- --listen "$COMFY_HOST" --port "$COMFY_PORT" ;;
486
  esac
 
1
  #!/usr/bin/env bash
2
+ # setup_comfyui_custom_v2.sh
3
+ # FIX: instalar SEM pré-criar $COMFY_DIR (evita falso positivo do comfy-cli)
4
+ # + timeouts/retries em downloads, headers p/ Civitai, estado robusto
5
+ # + Blackwell (5090/5080) com torch/vision nightly via --pre --upgrade --no-cache-dir
6
+ # + comfy-cli mantido para instalar/rodar/instalar nodes
7
 
8
  set -euo pipefail
9
 
10
  # --------------------------------
11
+ # Interatividade
12
  # --------------------------------
13
  if [ ! -t 0 ] || [ ! -t 1 ]; then INTERACTIVE=false; else INTERACTIVE=true; fi
14
 
15
  # --------------------------------
16
+ # Cores/logs
17
  # --------------------------------
18
  RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
19
+ log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
20
  log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
21
+ log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
22
+ log_error() { echo -e "${RED}[✗]${NC} $1"; }
23
+ log_progress(){ echo -e "${CYAN}[→]${NC} $1"; }
24
 
25
  # --------------------------------
26
  # Config
 
30
  COMFY_HOST="${COMFY_HOST:-0.0.0.0}"
31
  COMFY_PORT="${COMFY_PORT:-8818}"
32
 
33
+ # Mantemos as keys hardcoded (pedido do usuário)
34
  CIVITAI_TOKEN="${CIVITAI_TOKEN:-4fcb2834969399006a736ee402b061e5}"
35
  HF_TOKEN="${HF_TOKEN:-}"
36
 
 
49
  export EXT_PARALLEL=4
50
  export PIP_DEFAULT_TIMEOUT=60
51
 
52
+ # Rede
53
+ DOWNLOAD_TIMEOUT="${DOWNLOAD_TIMEOUT:-900}" # 15 min por artefato
54
+ CONNECT_TIMEOUT="${CONNECT_TIMEOUT:-20}"
55
  RETRY_COUNT="${RETRY_COUNT:-3}"
56
  RETRY_WAIT="${RETRY_WAIT:-3}"
57
  UA="${UA:-Mozilla/5.0 (X11; Linux x86_64) curl/8}"
 
60
  # --------------------------------
61
  # Estado
62
  # --------------------------------
63
+ init_state(){ mkdir -p "$STATE_DIR"; touch "$STATE_FILE" "$COMPLETED_DOWNLOADS" "$COMPLETED_NODES"; }
64
  save_state(){ echo "$1" > "$STATE_FILE"; log_info "Estado salvo: $1"; }
65
  get_state(){ [[ -f "$STATE_FILE" && "$(cat "$STATE_FILE" || echo 0)" =~ ^[0-9]+$ ]] && cat "$STATE_FILE" || echo 0; }
66
  reset_state(){ log_warn "Resetando estado da instalação..."; rm -rf "$STATE_DIR"; init_state; }
67
 
68
+ normalize_entry(){ # "url|type|filename"
69
+ local url="$1" type="$2" filename="${3:-}"
70
+ url="$(echo -n "$url" | xargs)"; type="$(echo -n "$type" | xargs)"; filename="$(echo -n "$filename" | xargs)"
 
71
  echo "${url}|${type}|${filename}"
72
  }
73
+ mark_download_complete(){ echo "$1" >> "$COMPLETED_DOWNLOADS"; }
74
+ is_download_complete(){ [[ -f "$COMPLETED_DOWNLOADS" ]] && grep -Fxq "$1" "$COMPLETED_DOWNLOADS"; }
75
  mark_node_complete(){ echo "$1" >> "$COMPLETED_NODES"; }
76
  is_node_complete(){ [[ -f "$COMPLETED_NODES" ]] && grep -Fxq "$1" "$COMPLETED_NODES"; }
77
 
 
154
  if ! command_exists megadl; then
155
  log_info "Instalando megatools..."
156
  apt-get update -qq && apt-get install -y -qq megatools >/dev/null 2>&1 || true
157
+ command_exists megadl && log_success "Megatools OK" || log_warn "Megatools falhou (MEGA pode não funcionar)"
158
  fi
159
  }
160
 
161
  add_civitai_token(){
162
  local url="$1"
163
+ if [[ "$url" == *"civitai.com/api/download"* && "$url" != *"token="* ]]; then
164
  echo "${url}&token=${CIVITAI_TOKEN}"
165
  else
166
  echo "$url"
167
  fi
168
  }
169
 
170
+ download_hf(){ # via hf/huggingface-cli com timeout
 
171
  local repo="$1" file_path="$2" target_dir="$3" filename="$4"
172
  [[ -z "$filename" ]] && filename="$(basename "$file_path")"
173
+ local out="$target_dir/$filename"
174
+ if [[ -s "$out" && $(stat -c%s "$out" 2>/dev/null || echo 0) -gt 1000000 ]]; then log_success "Arquivo já existe: $filename"; return 0; fi
 
 
175
 
176
+ log_info "HF: $repo/$file_path -> $filename"
177
+ local tmp; tmp="$(mktemp -d)"; local ok=false
 
178
 
179
  if command_exists hf; then
180
  if timeout "$DOWNLOAD_TIMEOUT" env HF_HUB_ENABLE_HF_TRANSFER=1 hf download "$repo" "$file_path" \
181
+ --local-dir "$tmp" --local-dir-use-symlinks False >/dev/null 2>&1; then ok=true; fi
182
  fi
183
+ if ! $ok && command_exists huggingface-cli; then
 
184
  log_warn "Tentando com huggingface-cli..."
185
  if timeout "$DOWNLOAD_TIMEOUT" env HF_HUB_ENABLE_HF_TRANSFER=1 huggingface-cli download "$repo" "$file_path" \
186
+ --local-dir "$tmp" --local-dir-use-symlinks False >/dev/null 2>&1; then ok=true; fi
187
  fi
188
 
189
+ if $ok; then
190
+ local f; f="$(find "$tmp" -type f \( -name "*.safetensors" -o -name "*.pth" -o -name "*.pt" -o -name "*.bin" -o -name "*.onnx" \) | head -1)"
191
+ if [[ -n "$f" ]]; then mv "$f" "$out"; rm -rf "$tmp"; log_success "HF OK: $filename"; return 0; fi
192
  fi
193
+ rm -rf "$tmp"; log_error "HF falhou: $filename"; return 1
 
194
  }
195
 
196
+ download_mega(){ # com timeout
 
197
  local url="$1" target_dir="$2"
198
  command_exists megadl || { log_error "megatools não instalado"; return 1; }
199
  url="${url#mega://}"
 
202
  log_error "MEGA falhou/timeout"; return 1
203
  }
204
 
205
+ detect_remote_name(){ # pega filename do cabeçalho
206
+ local url="$1" name
 
 
207
  name="$(timeout 60 curl -I -sSL -4 -A "$UA" -e "$CIVITAI_REF" "$url" \
208
+ | awk -F'filename=' 'BEGIN{IGNORECASE=1}/content-disposition/{gsub(/\"|;|\r/,"",$2); print $2}' | tail -1)"
209
  [[ -z "$name" ]] && name="$(basename "$(echo "$url" | cut -d'?' -f1)")"
210
  echo "$name"
211
  }
212
 
213
+ download_file(){ # CURL -> WGET -> ARIA2C (todos com timeout & retries)
214
+ local url="$1" target_dir="$2" filename="${3:-}"
 
215
  url="$(add_civitai_token "$url")"
216
+ [[ -z "$filename" ]] && filename="$(detect_remote_name "$url")"
 
217
  local out="$target_dir/$filename"
218
 
219
  if [[ -s "$out" && $(stat -c%s "$out" 2>/dev/null || echo 0) -gt 1000000 ]]; then
220
  log_success "Arquivo já existe: $filename"; return 0
221
  fi
222
 
223
+ log_info "HTTP: ${filename} -> $target_dir"
224
 
 
225
  if command_exists curl; then
226
  if timeout "$DOWNLOAD_TIMEOUT" curl -fL -4 -A "$UA" -e "$CIVITAI_REF" \
227
+ --connect-timeout "$CONNECT_TIMEOUT" --retry "$RETRY_COUNT" --retry-delay "$RETRY_WAIT" \
228
+ -C - -o "$out" "$url"; then
229
  log_success "CURL OK: $filename"; return 0
230
  else
231
  log_warn "CURL falhou para $filename"
232
  fi
233
  fi
234
 
 
235
  if command_exists wget; then
236
  if timeout "$DOWNLOAD_TIMEOUT" wget -q --show-progress -4 --referer="$CIVITAI_REF" --user-agent="$UA" \
237
+ --timeout="$CONNECT_TIMEOUT" --tries="$RETRY_COUNT" -c -O "$out" "$url"; then
238
  log_success "WGET OK: $filename"; return 0
239
  else
240
  log_warn "WGET falhou para $filename"
241
  fi
242
  fi
243
 
 
244
  if command_exists aria2c; then
245
  local aria_opts="-c -s 16 -x 16 -k 1M --file-allocation=none --allow-overwrite=true --auto-file-renaming=false \
246
  --summary-interval=10 --console-log-level=warn --timeout=$CONNECT_TIMEOUT --retry-wait=$RETRY_WAIT --max-tries=$RETRY_COUNT --referer=$CIVITAI_REF --user-agent=$UA"
 
255
  return 1
256
  }
257
 
 
258
  process_downloads(){
259
+ local total="${#DOWNLOAD_FILES[@]}" current=0 failed=0
260
  log_info "Total de downloads: $total"
261
  log_info "Iniciando loop de downloads..."
262
 
 
286
  if [[ "$url" == mega://* ]]; then
287
  download_mega "$url" "$target_dir" && ok=0
288
  elif [[ "$url" == hf://* ]]; then
289
+ url="${url#hf://}"
290
+ local repo="$(echo "$url" | cut -d'/' -f1-2)"
291
  local file_path="$(echo "$url" | cut -d'/' -f3-)"
292
+ download_hf "$repo" "$file_path" "$target_dir" "$filename" && ok=0
293
  elif [[ "$url" == https://huggingface.co/*/resolve/* ]]; then
 
294
  download_file "$url" "$target_dir" "$filename" && ok=0
295
  else
296
  download_file "$url" "$target_dir" "$filename" && ok=0
 
311
  return 0
312
  }
313
 
 
314
  clone_or_update(){
315
  local url="$1" dest="$2" node_name="$(basename "$dest")"
 
316
  if is_node_complete "$url"; then log_success "Node já instalado: $node_name"; return 0; fi
317
 
318
+ if [[ -d "$dest/.git" ]]; then
319
+ # sanity: garante que é o repo esperado
320
+ if ! git -C "$dest" remote -v | grep -qiE 'comfy|comfyui|github\.com'; then
321
+ log_warn "$node_name tem git estranho; removendo..."
322
+ rm -rf "$dest"
323
+ fi
324
+ fi
325
+
326
  if [[ -d "$dest/.git" ]]; then
327
  log_info "Atualizando $node_name..."
328
+ timeout 180 git -C "$dest" pull --ff-only >/dev/null 2>&1 || log_warn "Timeout/erro ao atualizar $node_name"
329
  else
330
  log_info "Clonando $node_name..."
331
+ timeout 300 git clone --recursive --depth 1 "$url" "$dest" >/dev/null 2>&1 || { log_warn "Falha ao clonar $node_name"; return 0; }
332
  fi
333
 
334
  if [[ -f "$dest/requirements.txt" ]]; then
 
371
  # Main
372
  # --------------------------------
373
  main(){
374
+ init_state
375
  show_menu
 
376
  local s; s="$(get_state)"
377
 
378
  # STEP 1: deps
 
393
  log_success "Ferramentas OK"; save_state "2"
394
  fi
395
 
396
+ # STEP 3: ComfyUI via comfy-cli (sem pré-criar $COMFY_DIR)
397
  if [[ "$s" -lt "3" ]]; then
398
+ log_info "[3/6] Instalando ComfyUI (comfy-cli)..."
399
+
400
+ if [[ -d "$COMFY_DIR" ]]; then
401
+ if [[ -d "$COMFY_DIR/.git" || -f "$COMFY_DIR/main.py" ]]; then
402
+ log_warn "ComfyUI já parece instalado em $COMFY_DIR"
403
+ else
404
+ log_warn "Diretório $COMFY_DIR existe porém não é ComfyUI válido. Removendo..."
405
+ rm -rf "$COMFY_DIR"
406
+ fi
407
+ fi
408
+
409
+ # git sanity: se existir git mas não for o repo esperado, remove
410
+ if [[ -d "$COMFY_DIR/.git" ]]; then
411
+ if ! git -C "$COMFY_DIR" remote -v 2>/dev/null | grep -qi 'comfyanonymous/ComfyUI'; then
412
+ log_warn "Git em $COMFY_DIR não aponta para comfyanonymous/ComfyUI. Removendo..."
413
+ rm -rf "$COMFY_DIR"
414
+ fi
415
+ fi
416
+
417
+ if [[ ! -f "$COMFY_DIR/main.py" ]]; then
418
+ comfy --skip-prompt install --nvidia --fast-deps --path "$COMFY_DIR" || {
419
+ log_error "ComfyUI não instalou (comfy-cli erro)"; exit 1; }
420
+ fi
421
+
422
+ [[ -f "$COMFY_DIR/main.py" ]] || { log_error "ComfyUI não encontrado após instalar"; exit 1; }
423
+ log_success "ComfyUI instalado em: $COMFY_DIR"
424
+ save_state "3"
425
  fi
426
 
427
+ # STEP 4: Blackwell nightly (5090/5080)
428
  if [[ "$s" -lt "4" ]]; then
429
  log_info "[4/6] Verificando GPU..."
430
  local gpu_info; gpu_info="$(nvidia-smi --query-gpu=name --format=csv,noheader 2>/dev/null || echo "")"
431
  if [[ "$gpu_info" == *"5090"* || "$gpu_info" == *"5080"* ]]; then
432
+ log_warn "RTX ${gpu_info:-Blackwell} detectada - aplicando PyTorch nightly (pedido do usuário)"
 
433
  python3 -m pip install --pre --upgrade --no-cache-dir torch --extra-index-url https://download.pytorch.org/whl/nightly/cu128
434
  python3 -m pip install --pre --upgrade --no-cache-dir torchvision --extra-index-url https://download.pytorch.org/whl/nightly/cu128
435
  log_success "PyTorch nightly (cu128) pronto"
 
439
  save_state "4"
440
  fi
441
 
442
+ # STEP 5: modelos (só agora criamos $MODELS_DIR)
443
  if [[ "$s" -lt "5" ]]; then
444
  log_info "[5/6] Baixando modelos..."
445
  mkdir -p "$MODELS_DIR"/{loras,upscale_models,checkpoints,ultralytics/bbox}
 
463
 
464
  # Verificação final
465
  log_info "Verificando instalação..."
466
+ [[ -f "$COMFY_DIR/main.py" ]] && log_success "✓ ComfyUI instalado" || log_error "✗ ComfyUI não encontrado"
467
 
468
  echo ""; log_info "Modelos instalados:"
469
  for dir in checkpoints loras vae vae_approx text_encoders clip_vision upscale_models ultralytics; do
 
494
  read -t 10 -p "Escolha [1-3] (padrão 1): " final_choice || final_choice="1"
495
  case "$final_choice" in
496
  1|"") log_info "Iniciando ComfyUI..."; cd "$COMFY_DIR"; exec comfy launch -- --listen "$COMFY_HOST" --port "$COMFY_PORT" ;;
497
+ 2) reset_state; log_success "Estado resetado. Rode o script novamente para reinstalar." ;;
498
  3) log_info "Saindo..." ;;
499
  *) cd "$COMFY_DIR"; exec comfy launch -- --listen "$COMFY_HOST" --port "$COMFY_PORT" ;;
500
  esac