arcadia-suite-sv/scripts/deploy.sh

372 lines
9.1 KiB
Bash

#!/bin/bash
# ===========================================
# Script de Deploy - Arcádia Suite
# ===========================================
# Uso: ./scripts/deploy.sh [opção]
# Opções:
# install - Instalação inicial completa
# update - Atualizar aplicação existente
# backup - Fazer backup do banco de dados
# restart - Reiniciar todos os serviços
# status - Ver status dos serviços
# logs - Ver logs em tempo real
# ===========================================
set -e
# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Diretório da aplicação
APP_DIR="/var/www/arcadia"
BACKUP_DIR="/var/backups/arcadia"
# Funções auxiliares
print_header() {
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} $1${NC}"
echo -e "${BLUE}========================================${NC}"
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_warning() {
echo -e "${YELLOW}$1${NC}"
}
print_error() {
echo -e "${RED}$1${NC}"
}
# Verificar se está rodando como root
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "Este script precisa ser executado como root (sudo)"
exit 1
fi
}
# Instalação inicial
install() {
print_header "Instalação Inicial - Arcádia Suite"
echo ""
print_warning "Este script vai instalar:"
echo " - Node.js 20"
echo " - Python 3.11"
echo " - PostgreSQL"
echo " - Nginx"
echo " - PM2"
echo " - Certbot"
echo ""
read -p "Continuar? (s/n) " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Ss]$ ]]; then
exit 1
fi
# Atualizar sistema
print_header "Atualizando Sistema"
apt update && apt upgrade -y
apt install -y curl wget git build-essential software-properties-common
print_success "Sistema atualizado"
# Node.js
print_header "Instalando Node.js 20"
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
print_success "Node.js $(node --version) instalado"
# Python
print_header "Instalando Python 3.11"
add-apt-repository ppa:deadsnakes/ppa -y
apt update
apt install -y python3.11 python3.11-venv python3.11-dev python3-pip
print_success "Python $(python3.11 --version) instalado"
# PostgreSQL
print_header "Instalando PostgreSQL"
apt install -y postgresql postgresql-contrib
systemctl enable postgresql
systemctl start postgresql
print_success "PostgreSQL instalado"
# Nginx
print_header "Instalando Nginx"
apt install -y nginx
systemctl enable nginx
systemctl start nginx
print_success "Nginx instalado"
# PM2
print_header "Instalando PM2"
npm install -g pm2
print_success "PM2 instalado"
# Certbot
print_header "Instalando Certbot"
apt install -y certbot python3-certbot-nginx
print_success "Certbot instalado"
# Criar diretórios
mkdir -p $APP_DIR
mkdir -p $BACKUP_DIR
print_header "Instalação Concluída!"
echo ""
echo "Próximos passos:"
echo " 1. Clone seu repositório em $APP_DIR"
echo " 2. Configure o arquivo .env"
echo " 3. Execute: ./scripts/deploy.sh update"
echo ""
}
# Atualizar aplicação
update() {
print_header "Atualizando Aplicação"
cd $APP_DIR
# Backup antes de atualizar
print_warning "Fazendo backup do banco de dados..."
backup_db
# Puxar atualizações
echo "Puxando atualizações do Git..."
git pull origin main || git pull origin master
print_success "Código atualizado"
# Instalar dependências Node
echo "Instalando dependências Node.js..."
npm install
print_success "Dependências Node.js instaladas"
# Atualizar ambiente Python
echo "Atualizando ambiente Python..."
source venv/bin/activate
pip install -r requirements.txt 2>/dev/null || echo "Sem requirements.txt"
deactivate
print_success "Ambiente Python atualizado"
# Build
echo "Fazendo build do frontend..."
npm run build
print_success "Build concluído"
# Migrações
echo "Executando migrações do banco..."
npm run db:push 2>/dev/null || echo "Sem migrações pendentes"
print_success "Migrações executadas"
# Reiniciar serviços
restart
print_header "Atualização Concluída!"
}
# Backup do banco de dados
backup_db() {
BACKUP_FILE="$BACKUP_DIR/arcadia_$(date +%Y%m%d_%H%M%S).sql"
# Carregar variáveis do .env
if [ -f "$APP_DIR/.env" ]; then
source $APP_DIR/.env
fi
PGPASSWORD=${PGPASSWORD:-""} pg_dump -h ${PGHOST:-localhost} -U ${PGUSER:-arcadia} ${PGDATABASE:-arcadia_suite} > $BACKUP_FILE
# Comprimir backup
gzip $BACKUP_FILE
print_success "Backup salvo em ${BACKUP_FILE}.gz"
# Manter apenas os últimos 7 backups
ls -t $BACKUP_DIR/*.gz 2>/dev/null | tail -n +8 | xargs rm -f 2>/dev/null
}
# Backup completo
backup() {
print_header "Backup Completo"
backup_db
print_header "Backup Concluído!"
}
# Reiniciar serviços
restart() {
print_header "Reiniciando Serviços"
cd $APP_DIR
pm2 restart ecosystem.config.js 2>/dev/null || pm2 start ecosystem.config.js
print_success "Serviços reiniciados"
# Aguardar inicialização
sleep 3
status
}
# Ver status
status() {
print_header "Status dos Serviços"
echo ""
echo -e "${BLUE}PM2:${NC}"
pm2 status
echo ""
echo -e "${BLUE}Nginx:${NC}"
systemctl status nginx --no-pager -l | head -5
echo ""
echo -e "${BLUE}PostgreSQL:${NC}"
systemctl status postgresql --no-pager -l | head -5
}
# Ver logs
logs() {
print_header "Logs em Tempo Real"
echo "Pressione Ctrl+C para sair"
echo ""
pm2 logs
}
# Configurar Nginx
setup_nginx() {
print_header "Configurar Nginx"
read -p "Digite seu domínio (ex: arcadia.seudominio.com.br): " DOMAIN
cat > /etc/nginx/sites-available/arcadia << EOF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
proxy_cache_bypass \$http_upgrade;
proxy_read_timeout 86400;
}
location /socket.io/ {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
}
}
EOF
ln -sf /etc/nginx/sites-available/arcadia /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
print_success "Nginx configurado para $DOMAIN"
read -p "Deseja instalar certificado SSL? (s/n) " -n 1 -r
echo ""
if [[ $REPLY =~ ^[Ss]$ ]]; then
certbot --nginx -d $DOMAIN -d www.$DOMAIN
print_success "SSL instalado"
fi
}
# Setup banco de dados
setup_db() {
print_header "Configurar Banco de Dados"
read -p "Nome do usuário PostgreSQL [arcadia]: " DB_USER
DB_USER=${DB_USER:-arcadia}
read -sp "Senha do usuário: " DB_PASS
echo ""
read -p "Nome do banco de dados [arcadia_suite]: " DB_NAME
DB_NAME=${DB_NAME:-arcadia_suite}
sudo -u postgres psql << EOF
CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';
CREATE DATABASE $DB_NAME OWNER $DB_USER;
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
EOF
print_success "Banco de dados configurado"
echo ""
echo "Adicione ao seu .env:"
echo "DATABASE_URL=postgresql://$DB_USER:$DB_PASS@localhost:5432/$DB_NAME"
}
# Menu de ajuda
show_help() {
echo ""
echo "Script de Deploy - Arcádia Suite"
echo ""
echo "Uso: $0 [comando]"
echo ""
echo "Comandos:"
echo " install Instalação inicial completa (Node, Python, PostgreSQL, etc)"
echo " update Atualizar aplicação (git pull, npm install, build, restart)"
echo " backup Fazer backup do banco de dados"
echo " restart Reiniciar todos os serviços (PM2)"
echo " status Ver status de todos os serviços"
echo " logs Ver logs em tempo real"
echo " setup-nginx Configurar Nginx e SSL"
echo " setup-db Configurar banco de dados PostgreSQL"
echo " help Mostrar esta ajuda"
echo ""
}
# Main
case "$1" in
install)
check_root
install
;;
update)
update
;;
backup)
backup
;;
restart)
restart
;;
status)
status
;;
logs)
logs
;;
setup-nginx)
check_root
setup_nginx
;;
setup-db)
check_root
setup_db
;;
help|--help|-h)
show_help
;;
*)
show_help
exit 1
;;
esac