adbrasi commited on
Commit
c259fcb
·
verified ·
1 Parent(s): 7fae681

Upload comfyui_setup_script.sh

Browse files
Files changed (1) hide show
  1. comfyui_setup_script.sh +378 -0
comfyui_setup_script.sh ADDED
@@ -0,0 +1,378 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # =============================================================================
4
+ # ComfyUI Professional Setup Script
5
+ # =============================================================================
6
+ # Autor: Setup automatizado para RunPod/VastAI
7
+ # Versão: 1.0
8
+ # Descrição: Instala e configura ComfyUI com todas as dependências necessárias
9
+ # =============================================================================
10
+
11
+ set -euo pipefail # Exit on error, undefined vars, pipe failures
12
+
13
+ # Cores para output
14
+ readonly RED='\033[0;31m'
15
+ readonly GREEN='\033[0;32m'
16
+ readonly YELLOW='\033[1;33m'
17
+ readonly BLUE='\033[0;34m'
18
+ readonly MAGENTA='\033[0;35m'
19
+ readonly CYAN='\033[0;36m'
20
+ readonly WHITE='\033[1;37m'
21
+ readonly NC='\033[0m' # No Color
22
+
23
+ # Configurações
24
+ readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
25
+ readonly LOG_FILE="${SCRIPT_DIR}/setup.log"
26
+ readonly COMFY_DIR="/root/comfy"
27
+ readonly TOKEN="0b698de03658fb8df2eeef90bad3ab9a"
28
+ readonly LISTEN_PORT="8818"
29
+
30
+ # URLs dos arquivos
31
+ declare -A DOWNLOADS=(
32
+ ["checkpoint"]="https://civitai.com/api/download/models/1761560?type=Model&format=SafeTensor&size=pruned&fp=fp16&token=${TOKEN}"
33
+ ["lora1"]="https://civitai.com/api/download/models/1426079?type=Model&format=SafeTensor&token=${TOKEN}"
34
+ ["lora2"]="https://civitai.com/api/download/models/1193082?type=Model&format=SafeTensor&token=${TOKEN}"
35
+ ["snapshot"]="https://huggingface.co/adbrasi/testedownload/resolve/main/snapshotBRABEX.json"
36
+ )
37
+
38
+ declare -A DOWNLOAD_PATHS=(
39
+ ["checkpoint"]="${COMFY_DIR}/ComfyUI/models/checkpoints"
40
+ ["lora1"]="${COMFY_DIR}/ComfyUI/models/loras"
41
+ ["lora2"]="${COMFY_DIR}/ComfyUI/models/loras"
42
+ ["snapshot"]="${COMFY_DIR}/"
43
+ )
44
+
45
+ # =============================================================================
46
+ # FUNÇÕES UTILITÁRIAS
47
+ # =============================================================================
48
+
49
+ log() {
50
+ local level="$1"
51
+ shift
52
+ local message="$*"
53
+ local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
54
+
55
+ case "$level" in
56
+ "INFO") echo -e "${CYAN}[INFO]${NC} ${message}" | tee -a "$LOG_FILE" ;;
57
+ "WARN") echo -e "${YELLOW}[WARN]${NC} ${message}" | tee -a "$LOG_FILE" ;;
58
+ "ERROR") echo -e "${RED}[ERROR]${NC} ${message}" | tee -a "$LOG_FILE" ;;
59
+ "SUCCESS") echo -e "${GREEN}[SUCCESS]${NC} ${message}" | tee -a "$LOG_FILE" ;;
60
+ "STEP") echo -e "${MAGENTA}[STEP]${NC} ${WHITE}${message}${NC}" | tee -a "$LOG_FILE" ;;
61
+ esac
62
+
63
+ echo "[$timestamp] [$level] $message" >> "$LOG_FILE"
64
+ }
65
+
66
+ print_banner() {
67
+ echo -e "${CYAN}"
68
+ cat << 'EOF'
69
+ ╔══════════════════════════════════════════════════════════════╗
70
+ ║ ComfyUI Setup Script ║
71
+ ║ Professional Installation ║
72
+ ╚══════════════════════════════════════════════════════════════╝
73
+ EOF
74
+ echo -e "${NC}"
75
+ }
76
+
77
+ check_dependencies() {
78
+ log "STEP" "Verificando dependências do sistema..."
79
+
80
+ local deps=("curl" "wget" "python3" "pip")
81
+ local missing_deps=()
82
+
83
+ for dep in "${deps[@]}"; do
84
+ if ! command -v "$dep" &> /dev/null; then
85
+ missing_deps+=("$dep")
86
+ fi
87
+ done
88
+
89
+ if [[ ${#missing_deps[@]} -ne 0 ]]; then
90
+ log "ERROR" "Dependências faltando: ${missing_deps[*]}"
91
+ return 1
92
+ fi
93
+
94
+ log "SUCCESS" "Todas as dependências básicas estão disponíveis"
95
+ }
96
+
97
+ install_system_packages() {
98
+ log "STEP" "Instalando pacotes do sistema..."
99
+
100
+ if command -v apt-get &> /dev/null; then
101
+ apt-get update -qq
102
+ apt-get install -y -qq aria2 wget curl
103
+ log "SUCCESS" "Pacotes do sistema instalados com sucesso"
104
+ else
105
+ log "WARN" "apt-get não encontrado, pulando instalação de pacotes do sistema"
106
+ fi
107
+ }
108
+
109
+ install_comfy_cli() {
110
+ log "STEP" "Instalando comfy-cli..."
111
+
112
+ pip install --quiet --upgrade pip
113
+ pip install --quiet comfy-cli
114
+
115
+ if ! command -v comfy &> /dev/null; then
116
+ log "ERROR" "Falha na instalação do comfy-cli"
117
+ return 1
118
+ fi
119
+
120
+ log "SUCCESS" "comfy-cli instalado com sucesso"
121
+ }
122
+
123
+ install_comfyui() {
124
+ log "STEP" "Instalando ComfyUI com suporte NVIDIA..."
125
+
126
+ comfy --skip-prompt install --nvidia
127
+
128
+ if [[ ! -d "$COMFY_DIR" ]]; then
129
+ log "ERROR" "Diretório do ComfyUI não foi criado"
130
+ return 1
131
+ fi
132
+
133
+ log "SUCCESS" "ComfyUI instalado com sucesso"
134
+ }
135
+
136
+ install_custom_nodes() {
137
+ log "STEP" "Instalando nós customizados..."
138
+
139
+ local nodes=(
140
+ "https://github.com/Cezarsaint/custom_prompt_manager"
141
+ "https://github.com/adbrasi/pakreatorio"
142
+ )
143
+
144
+ for node in "${nodes[@]}"; do
145
+ log "INFO" "Instalando nó: $(basename "$node")"
146
+ if comfy node install "$node"; then
147
+ log "SUCCESS" "Nó $(basename "$node") instalado com sucesso"
148
+ else
149
+ log "WARN" "Falha ao instalar nó: $(basename "$node")"
150
+ fi
151
+ done
152
+ }
153
+
154
+ create_directories() {
155
+ log "STEP" "Criando estrutura de diretórios..."
156
+
157
+ local dirs=(
158
+ "${COMFY_DIR}/ComfyUI/models/checkpoints"
159
+ "${COMFY_DIR}/ComfyUI/models/loras"
160
+ )
161
+
162
+ for dir in "${dirs[@]}"; do
163
+ mkdir -p "$dir"
164
+ log "INFO" "Diretório criado: $dir"
165
+ done
166
+ }
167
+
168
+ download_files() {
169
+ log "STEP" "Iniciando downloads paralelos dos modelos..."
170
+
171
+ local pids=()
172
+ local download_success=true
173
+
174
+ # Função para download individual
175
+ download_file() {
176
+ local name="$1"
177
+ local url="$2"
178
+ local path="$3"
179
+
180
+ log "INFO" "Baixando $name..."
181
+
182
+ if [[ "$name" == "snapshot" ]]; then
183
+ # Usar wget para o snapshot
184
+ if wget --quiet --show-progress --progress=bar:force:noscroll \
185
+ --timeout=30 --tries=3 \
186
+ "$url" -P "$path"; then
187
+ log "SUCCESS" "Download concluído: $name"
188
+ return 0
189
+ else
190
+ log "ERROR" "Falha no download: $name"
191
+ return 1
192
+ fi
193
+ else
194
+ # Usar aria2c para modelos grandes
195
+ if aria2c --console-log-level=warn \
196
+ --summary-interval=10 \
197
+ --download-result=hide \
198
+ -c -s 16 -x 16 -k 1M \
199
+ --timeout=60 --retry-wait=5 --max-tries=3 \
200
+ -d "$path" "$url"; then
201
+ log "SUCCESS" "Download concluído: $name"
202
+ return 0
203
+ else
204
+ log "ERROR" "Falha no download: $name"
205
+ return 1
206
+ fi
207
+ fi
208
+ }
209
+
210
+ # Iniciar downloads em paralelo
211
+ for name in "${!DOWNLOADS[@]}"; do
212
+ download_file "$name" "${DOWNLOADS[$name]}" "${DOWNLOAD_PATHS[$name]}" &
213
+ pids+=($!)
214
+ done
215
+
216
+ # Aguardar conclusão de todos os downloads
217
+ for pid in "${pids[@]}"; do
218
+ if ! wait "$pid"; then
219
+ download_success=false
220
+ fi
221
+ done
222
+
223
+ if [[ "$download_success" == true ]]; then
224
+ log "SUCCESS" "Todos os downloads concluídos com sucesso"
225
+ else
226
+ log "WARN" "Alguns downloads falharam, mas continuando..."
227
+ fi
228
+ }
229
+
230
+ restore_snapshot() {
231
+ log "STEP" "Restaurando snapshot..."
232
+
233
+ local snapshot_file="${COMFY_DIR}/snapshotBRABEX.json"
234
+
235
+ if [[ -f "$snapshot_file" ]]; then
236
+ if comfy node restore-snapshot "$snapshot_file"; then
237
+ log "SUCCESS" "Snapshot restaurado com sucesso"
238
+ else
239
+ log "WARN" "Falha ao restaurar snapshot"
240
+ fi
241
+ else
242
+ log "WARN" "Arquivo de snapshot não encontrado"
243
+ fi
244
+ }
245
+
246
+ create_launch_script() {
247
+ log "STEP" "Criando script de inicialização..."
248
+
249
+ local launch_script="${SCRIPT_DIR}/launch-comfyui.sh"
250
+
251
+ cat > "$launch_script" << EOF
252
+ #!/bin/bash
253
+ # Script de inicialização do ComfyUI
254
+ # Gerado automaticamente em $(date)
255
+
256
+ cd "$COMFY_DIR" || exit 1
257
+
258
+ echo "Iniciando ComfyUI..."
259
+ echo "Acesse: http://localhost:${LISTEN_PORT}"
260
+ echo "Ou use o endereço público do seu RunPod/VastAI na porta ${LISTEN_PORT}"
261
+ echo ""
262
+
263
+ comfy launch -- --fast --listen 0.0.0.0 --port ${LISTEN_PORT}
264
+ EOF
265
+
266
+ chmod +x "$launch_script"
267
+ log "SUCCESS" "Script de inicialização criado: $launch_script"
268
+ }
269
+
270
+ cleanup() {
271
+ log "INFO" "Limpando arquivos temporários..."
272
+
273
+ # Limpar cache do pip
274
+ pip cache purge 2>/dev/null || true
275
+
276
+ # Limpar logs antigos (manter apenas os últimos 5)
277
+ find "$SCRIPT_DIR" -name "setup.log.*" -type f | head -n -5 | xargs rm -f 2>/dev/null || true
278
+
279
+ log "SUCCESS" "Limpeza concluída"
280
+ }
281
+
282
+ show_summary() {
283
+ echo -e "\n${GREEN}╔══════════════════════════════════════════════════════════════╗${NC}"
284
+ echo -e "${GREEN}║ INSTALAÇÃO CONCLUÍDA ║${NC}"
285
+ echo -e "${GREEN}╚══════════════════════════════════════════════════════════════╝${NC}"
286
+ echo -e "\n${CYAN}Para iniciar o ComfyUI:${NC}"
287
+ echo -e "${WHITE} ./launch-comfyui.sh${NC}"
288
+ echo -e "\n${CYAN}Ou execute manualmente:${NC}"
289
+ echo -e "${WHITE} cd $COMFY_DIR && comfy launch -- --fast --listen 0.0.0.0 --port $LISTEN_PORT${NC}"
290
+ echo -e "\n${CYAN}Logs da instalação:${NC}"
291
+ echo -e "${WHITE} $LOG_FILE${NC}"
292
+ echo -e "\n${YELLOW}Acesse ComfyUI em:${NC}"
293
+ echo -e "${WHITE} http://localhost:$LISTEN_PORT${NC}"
294
+ echo -e "${WHITE} ou use o endereço público do seu RunPod/VastAI na porta $LISTEN_PORT${NC}\n"
295
+ }
296
+
297
+ # =============================================================================
298
+ # FUNÇÃO PRINCIPAL
299
+ # =============================================================================
300
+
301
+ main() {
302
+ local start_time=$(date +%s)
303
+
304
+ # Configurar arquivo de log
305
+ exec > >(tee -a "$LOG_FILE")
306
+ exec 2>&1
307
+
308
+ print_banner
309
+ log "INFO" "Iniciando instalação do ComfyUI..."
310
+ log "INFO" "Log da instalação: $LOG_FILE"
311
+
312
+ # Verificar se já existe uma instalação
313
+ if [[ -d "$COMFY_DIR" ]] && [[ -f "${COMFY_DIR}/ComfyUI/main.py" ]]; then
314
+ log "WARN" "ComfyUI já parece estar instalado em $COMFY_DIR"
315
+ read -p "Deseja continuar mesmo assim? (y/N): " -n 1 -r
316
+ echo
317
+ if [[ ! $REPLY =~ ^[Yy]$ ]]; then
318
+ log "INFO" "Instalação cancelada pelo usuário"
319
+ exit 0
320
+ fi
321
+ fi
322
+
323
+ # Executar etapas da instalação
324
+ local steps=(
325
+ "check_dependencies"
326
+ "install_system_packages"
327
+ "install_comfy_cli"
328
+ "install_comfyui"
329
+ "create_directories"
330
+ "install_custom_nodes"
331
+ "download_files"
332
+ "restore_snapshot"
333
+ "create_launch_script"
334
+ "cleanup"
335
+ )
336
+
337
+ local current_step=1
338
+ local total_steps=${#steps[@]}
339
+
340
+ for step in "${steps[@]}"; do
341
+ echo -e "\n${BLUE}[$current_step/$total_steps]${NC} Executando: $step"
342
+
343
+ if $step; then
344
+ log "SUCCESS" "Etapa concluída: $step"
345
+ else
346
+ log "ERROR" "Falha na etapa: $step"
347
+ log "ERROR" "Instalação interrompida"
348
+ exit 1
349
+ fi
350
+
351
+ ((current_step++))
352
+ done
353
+
354
+ local end_time=$(date +%s)
355
+ local duration=$((end_time - start_time))
356
+
357
+ log "SUCCESS" "Instalação concluída em ${duration}s"
358
+ show_summary
359
+ }
360
+
361
+ # =============================================================================
362
+ # TRATAMENTO DE SINAIS
363
+ # =============================================================================
364
+
365
+ trap 'log "ERROR" "Script interrompido pelo usuário"; exit 1' INT TERM
366
+
367
+ # =============================================================================
368
+ # EXECUÇÃO
369
+ # =============================================================================
370
+
371
+ # Verificar se está sendo executado como root (recomendado para RunPod/VastAI)
372
+ if [[ $EUID -ne 0 ]]; then
373
+ log "WARN" "Script não está sendo executado como root"
374
+ log "WARN" "Algumas operações podem falhar"
375
+ fi
376
+
377
+ # Executar função principal
378
+ main "$@"