-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
466 lines (393 loc) · 12.4 KB
/
install.sh
File metadata and controls
466 lines (393 loc) · 12.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
#!/bin/bash
# Script de Instalação do PetCare Analytics
# Compatível com Linux, macOS e Windows (WSL)
set -e # Parar execução em caso de erro
# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Função para imprimir mensagens coloridas
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCESSO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[AVISO]${NC} $1"
}
print_error() {
echo -e "${RED}[ERRO]${NC} $1"
}
# Função para verificar se comando existe
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Função para detectar sistema operacional
detect_os() {
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
OS="linux"
if command_exists apt-get; then
DISTRO="ubuntu"
elif command_exists yum; then
DISTRO="centos"
elif command_exists pacman; then
DISTRO="arch"
else
DISTRO="unknown"
fi
elif [[ "$OSTYPE" == "darwin"* ]]; then
OS="macos"
DISTRO="macos"
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
OS="windows"
DISTRO="windows"
else
OS="unknown"
DISTRO="unknown"
fi
}
# Função para verificar versão mínima do Python
check_python_version() {
if command_exists python3; then
PYTHON_CMD="python3"
elif command_exists python; then
PYTHON_CMD="python"
else
print_error "Python não encontrado. Instale Python 3.8 ou superior."
exit 1
fi
PYTHON_VERSION=$($PYTHON_CMD --version 2>&1 | cut -d' ' -f2)
PYTHON_MAJOR=$(echo $PYTHON_VERSION | cut -d'.' -f1)
PYTHON_MINOR=$(echo $PYTHON_VERSION | cut -d'.' -f2)
if [ "$PYTHON_MAJOR" -lt "3" ] || ([ "$PYTHON_MAJOR" -eq "3" ] && [ "$PYTHON_MINOR" -lt "8" ]); then
print_error "Python 3.8 ou superior é necessário. Versão atual: $PYTHON_VERSION"
exit 1
fi
print_success "Python $PYTHON_VERSION encontrado"
}
# Função para instalar Python no Ubuntu/Debian
install_python_ubuntu() {
print_status "Instalando Python 3.9 no Ubuntu/Debian..."
sudo apt update
sudo apt install -y python3.9 python3.9-pip python3.9-venv python3.9-dev
sudo apt install -y build-essential libssl-dev libffi-dev
# Criar links simbólicos se necessário
if ! command_exists python3; then
sudo ln -sf /usr/bin/python3.9 /usr/bin/python3
fi
}
# Função para instalar Python no CentOS/RHEL
install_python_centos() {
print_status "Instalando Python 3.9 no CentOS/RHEL..."
sudo yum groupinstall -y "Development Tools"
sudo yum install -y python39 python39-pip python39-devel
sudo yum install -y openssl-devel libffi-devel
}
# Função para instalar Python no macOS
install_python_macos() {
if command_exists brew; then
print_status "Instalando Python via Homebrew..."
brew install python@3.9
brew install pkg-config
else
print_warning "Homebrew não encontrado. Instale manualmente:"
print_warning "1. Acesse https://www.python.org/downloads/"
print_warning "2. Baixe Python 3.9 ou superior"
print_warning "3. Execute este script novamente"
exit 1
fi
}
# Função para instalar dependências do sistema
install_system_dependencies() {
print_status "Instalando dependências do sistema..."
case $DISTRO in
"ubuntu")
sudo apt update
sudo apt install -y git curl wget unzip
sudo apt install -y libpq-dev # Para psycopg2
sudo apt install -y libjpeg-dev zlib1g-dev # Para Pillow
;;
"centos")
sudo yum update -y
sudo yum install -y git curl wget unzip
sudo yum install -y postgresql-devel # Para psycopg2
sudo yum install -y libjpeg-turbo-devel zlib-devel # Para Pillow
;;
"macos")
if command_exists brew; then
brew install git curl wget
brew install postgresql # Para psycopg2
brew install jpeg # Para Pillow
fi
;;
*)
print_warning "Sistema não reconhecido. Instale manualmente: git, curl, wget"
;;
esac
}
# Função para criar ambiente virtual
create_virtual_environment() {
print_status "Criando ambiente virtual Python..."
if [ -d "venv" ]; then
print_warning "Ambiente virtual já existe. Removendo..."
rm -rf venv
fi
$PYTHON_CMD -m venv venv
# Ativar ambiente virtual
if [[ "$OS" == "windows" ]]; then
source venv/Scripts/activate
else
source venv/bin/activate
fi
print_success "Ambiente virtual criado e ativado"
}
# Função para atualizar pip
upgrade_pip() {
print_status "Atualizando pip..."
python -m pip install --upgrade pip setuptools wheel
print_success "pip atualizado"
}
# Função para instalar dependências Python
install_python_dependencies() {
print_status "Instalando dependências Python..."
if [ ! -f "requirements.txt" ]; then
print_error "Arquivo requirements.txt não encontrado!"
exit 1
fi
# Instalar dependências com retry em caso de falha
MAX_RETRIES=3
RETRY_COUNT=0
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
if pip install -r requirements.txt; then
print_success "Dependências instaladas com sucesso"
break
else
RETRY_COUNT=$((RETRY_COUNT + 1))
print_warning "Tentativa $RETRY_COUNT de $MAX_RETRIES falhou. Tentando novamente..."
sleep 2
fi
done
if [ $RETRY_COUNT -eq $MAX_RETRIES ]; then
print_error "Falha ao instalar dependências após $MAX_RETRIES tentativas"
exit 1
fi
}
# Função para configurar variáveis de ambiente
setup_environment_variables() {
print_status "Configurando variáveis de ambiente..."
if [ ! -f ".env" ]; then
if [ -f ".env.example" ]; then
cp .env.example .env
print_success "Arquivo .env criado a partir do exemplo"
else
# Criar arquivo .env básico
cat > .env << EOF
# Configurações do Supabase
SUPABASE_URL=sua_url_do_supabase
SUPABASE_ANON_KEY=sua_chave_anonima
# Configurações de Email (opcional)
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
SMTP_USERNAME=seu_email@gmail.com
SMTP_PASSWORD=sua_senha_de_app
# Configurações do Sistema
DEBUG_MODE=true
SESSION_TIMEOUT=3600
MAX_UPLOAD_SIZE=10485760
# APIs Externas (opcional)
GOOGLE_MAPS_API_KEY=sua_chave_do_google_maps
OPENAI_API_KEY=sua_chave_do_openai
EOF
print_success "Arquivo .env básico criado"
fi
print_warning "IMPORTANTE: Configure suas credenciais no arquivo .env"
print_warning "Edite o arquivo .env com suas credenciais do Supabase"
else
print_success "Arquivo .env já existe"
fi
}
# Função para verificar conectividade com Supabase
test_supabase_connection() {
print_status "Testando conectividade com Supabase..."
python3 -c "
import os
from dotenv import load_dotenv
load_dotenv()
url = os.getenv('SUPABASE_URL')
key = os.getenv('SUPABASE_ANON_KEY')
if not url or not key or 'sua_' in url or 'sua_' in key:
print('❌ Credenciais do Supabase não configuradas no .env')
exit(1)
try:
from supabase import create_client
client = create_client(url, key)
# Teste simples de conectividade
result = client.table('users_analytics').select('id').limit(1).execute()
print('✅ Conexão com Supabase estabelecida')
except Exception as e:
print(f'⚠️ Aviso: Erro na conexão com Supabase: {e}')
print('Verifique suas credenciais no arquivo .env')
" 2>/dev/null || print_warning "Configure as credenciais do Supabase no arquivo .env"
}
# Função para criar estrutura de diretórios
create_directory_structure() {
print_status "Criando estrutura de diretórios..."
mkdir -p assets
mkdir -p data
mkdir -p models
mkdir -p exports
mkdir -p logs
mkdir -p tests
mkdir -p scripts
mkdir -p config
print_success "Estrutura de diretórios criada"
}
# Função para configurar scripts auxiliares
setup_scripts() {
print_status "Configurando scripts auxiliares..."
# Script para executar a aplicação
cat > run.sh << 'EOF'
#!/bin/bash
# Script para executar o PetCare Analytics
# Ativar ambiente virtual
if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
source venv/Scripts/activate
else
source venv/bin/activate
fi
# Verificar se o .env existe
if [ ! -f ".env" ]; then
echo "❌ Arquivo .env não encontrado!"
echo "Configure suas credenciais primeiro"
exit 1
fi
# Executar aplicação
echo "🚀 Iniciando PetCare Analytics..."
streamlit run app.py --server.port 8501 --server.address 0.0.0.0
EOF
chmod +x run.sh
# Script de desenvolvimento
cat > dev.sh << 'EOF'
#!/bin/bash
# Script para desenvolvimento
# Ativar ambiente virtual
if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
source venv/Scripts/activate
else
source venv/bin/activate
fi
# Executar em modo debug
echo "🔧 Iniciando em modo desenvolvimento..."
export DEBUG_MODE=true
streamlit run app.py --server.runOnSave true --server.port 8501
EOF
chmod +x dev.sh
print_success "Scripts auxiliares criados"
}
# Função para verificar instalação
verify_installation() {
print_status "Verificando instalação..."
# Verificar se Python funciona
if ! python -c "import streamlit, pandas, numpy, plotly, supabase" 2>/dev/null; then
print_error "Algumas dependências não foram instaladas corretamente"
return 1
fi
# Verificar se arquivos principais existem
if [ ! -f "app.py" ]; then
print_error "Arquivo principal app.py não encontrado"
return 1
fi
if [ ! -f "config/database.py" ]; then
print_error "Arquivo de configuração database.py não encontrado"
return 1
fi
print_success "Verificação concluída com sucesso"
return 0
}
# Função para exibir informações finais
show_final_instructions() {
echo
echo "🎉 Instalação concluída com sucesso!"
echo
echo "📋 Próximos passos:"
echo
echo "1. Configure suas credenciais no arquivo .env:"
echo " nano .env"
echo
echo "2. Para executar a aplicação:"
echo " ./run.sh"
echo " ou"
echo " chmod +x run.sh && ./run.sh"
echo
echo "3. Para desenvolvimento:"
echo " ./dev.sh"
echo
echo "4. Acesse a aplicação em:"
echo " http://localhost:8501"
echo
echo "📚 Documentação adicional:"
echo " - README.md - Instruções gerais"
echo " - requisitos.md - Requisitos do sistema"
echo " - git-build-commit.md - Guia de desenvolvimento"
echo
print_success "PetCare Analytics pronto para uso!"
}
# Função principal
main() {
echo "🐾 Instalação do PetCare Analytics 🐾"
echo "===================================="
echo
# Detectar sistema operacional
detect_os
print_status "Sistema detectado: $OS ($DISTRO)"
# Verificar Python
if ! check_python_version; then
case $DISTRO in
"ubuntu")
install_python_ubuntu
;;
"centos")
install_python_centos
;;
"macos")
install_python_macos
;;
*)
print_error "Sistema não suportado para instalação automática do Python"
print_error "Instale Python 3.8+ manualmente e execute este script novamente"
exit 1
;;
esac
check_python_version
fi
# Instalar dependências do sistema
install_system_dependencies
# Criar ambiente virtual
create_virtual_environment
# Atualizar pip
upgrade_pip
# Instalar dependências Python
install_python_dependencies
# Configurar ambiente
setup_environment_variables
# Criar estrutura de diretórios
create_directory_structure
# Configurar scripts
setup_scripts
# Testar conexão (opcional)
test_supabase_connection
# Verificar instalação
if verify_installation; then
show_final_instructions
else
print_error "Instalação incompleta. Verifique os erros acima."
exit 1
fi
}
# Verificar se está sendo executado como script principal
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi