#!/bin/bash # Script de Deploy para produção # Uso: ./deploy.sh [ambiente] # Exemplo: ./deploy.sh production set -e # Para em caso de erro echo "🚀 Iniciando deploy..." # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Função para imprimir mensagens coloridas print_success() { echo -e "${GREEN}✓ $1${NC}" } print_error() { echo -e "${RED}✗ $1${NC}" } print_warning() { echo -e "${YELLOW}⚠ $1${NC}" } # Detectar o dono do diretório para rodar comandos como ele DIR_OWNER=$(stat -c '%U' .) PROJECT_DIR=$(pwd) run_as_owner() { su - "$DIR_OWNER" -c "cd $PROJECT_DIR && source ~/.bashrc 2>/dev/null; source ~/.profile 2>/dev/null; export NVM_DIR=\"\$HOME/.nvm\"; [ -s \"\$NVM_DIR/nvm.sh\" ] && . \"\$NVM_DIR/nvm.sh\"; $1" } # Verificar se está rodando como root if [ "$EUID" -ne 0 ]; then print_warning "Este script precisa de sudo para configurar o nginx" SUDO="sudo" else SUDO="" fi # 1. Atualizar código (se estiver em git) echo "" echo "📦 Atualizando código..." if [ -d ".git" ]; then run_as_owner "git pull" print_success "Código atualizado" else print_warning "Não é um repositório git, pulando atualização" fi # 2. Instalar dependências limpas echo "" echo "📥 Instalando dependências com npm ci..." if [ -f "package-lock.json" ]; then run_as_owner "rm -rf node_modules && npm ci" print_success "Dependências instaladas" else print_warning "package-lock.json não encontrado, usando npm install" run_as_owner "npm install" fi # 3. Configurar nginx para uploads maiores echo "" echo "🌐 Configurando nginx..." NGINX_CONF="/etc/nginx/sites-available/inglescomideiasvivas" NGINX_BACKUP="/tmp/nginx_inglescomideiasvivas.backup" # Verificar se o arquivo de configuração existe if [ -f "$NGINX_CONF" ]; then # Fazer backup $SUDO cp "$NGINX_CONF" "$NGINX_BACKUP" # Verificar se client_max_body_size já existe if $SUDO grep -q "client_max_body_size" "$NGINX_CONF"; then print_warning "client_max_body_size já configurado, atualizando para 500M..." $SUDO sed -i 's/client_max_body_size .*/client_max_body_size 500M;/' "$NGINX_CONF" else # Adicionar client_max_body_size após client_body_timeout ou no bloco server $SUDO sed -i '/server {/a \ client_max_body_size 500M;' "$NGINX_CONF" print_success "client_max_body_size 500M adicionado ao nginx" fi # Testar configuração do nginx echo "Testando configuração do nginx..." if $SUDO nginx -t 2>&1 | grep -q "successful"; then print_success "Configuração do nginx válida" $SUDO systemctl reload nginx print_success "Nginx recarregado" else print_error "Configuração do nginx inválida!" echo "Restorando backup..." $SUDO cp "$NGINX_BACKUP" "$NGINX_CONF" $SUDO nginx -t exit 1 fi else print_warning "Arquivo de configuração do nginx não encontrado em $NGINX_CONF" echo "Você pode precisar configurar manualmente:" echo " sudo nano $NGINX_CONF" echo "Adicione 'client_max_body_size 500M;' no bloco server" fi # 4. Limpar cache do Next.js e rebuild echo "" echo "🔨 Limpar cache e rebuild..." run_as_owner "rm -rf .next .next.cache" print_success "Cache limpo" echo "Building..." run_as_owner "npm run build" print_success "Build concluído" # 5. Reiniciar PM2 echo "" echo "🔄 Reiniciando aplicação com PM2..." # Verificar se o app existe no PM2 if run_as_owner "pm2 list" | grep -q "iciv"; then run_as_owner "pm2 delete iciv" print_success "App antigo removido" fi run_as_owner "pm2 start ecosystem.config.js" run_as_owner "pm2 save" print_success "Aplicação reiniciada" # 6. Mostrar status echo "" echo "📊 Status da aplicação:" run_as_owner "pm2 list" echo "" echo "🎉 Deploy concluído com sucesso!" echo "" echo "Logs em tempo real:" echo " pm2 logs iciv" echo "" echo "Para verificar logs de erro:" echo " pm2 logs iciv --err"