#!/bin/bash set -e # Script di deployment automatico per VigilanzaTurni # Uso: bash deploy/deploy.sh APP_DIR="/var/www/vigilanza-turni" APP_NAME="vigilanza-turni" BACKUP_DIR="/var/backups/vigilanza-turni" echo "๐Ÿš€ Deployment VigilanzaTurni - $(date)" # Vai alla directory applicazione cd $APP_DIR # Pull ultime modifiche (se eseguito manualmente) if [ -d .git ]; then echo "๐Ÿ“ฅ Pull ultime modifiche da GitLab..." git pull origin main || true fi # =================== BACKUP DATABASE =================== echo "๐Ÿ’พ Backup database pre-deployment..." mkdir -p $BACKUP_DIR BACKUP_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).sql" # Load env vars if [ -f .env ]; then source .env fi # Esegui backup PostgreSQL if command -v pg_dump &> /dev/null; then # Controlla che le variabili siano definite if [ -z "$PGDATABASE" ] || [ -z "$PGUSER" ]; then echo "โš ๏ธ Variabili DB non trovate nel .env, skip backup" else PGPASSWORD=$PGPASSWORD pg_dump -h ${PGHOST:-localhost} -U $PGUSER --dbname=$PGDATABASE > $BACKUP_FILE echo "โœ… Backup salvato: $BACKUP_FILE" # Comprimi backup gzip $BACKUP_FILE echo "โœ… Backup compresso: ${BACKUP_FILE}.gz" # Pulisci backup vecchi (> 30 giorni) find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +30 -delete echo "๐Ÿงน Backup vecchi eliminati (retention: 30 giorni)" fi else echo "โš ๏ธ pg_dump non trovato, skip backup" fi # =================== BUILD & DEPLOY =================== # Installa TUTTE le dipendenze (serve per build e migrations) echo "๐Ÿ“ฅ Installazione dipendenze (include devDependencies)..." npm ci # Build frontend echo "๐Ÿ—๏ธ Build frontend Vite..." export NODE_ENV=production npm run build # Database migrations (serve Drizzle che รจ devDependency) echo "๐Ÿ—„๏ธ Verifica database schema..." npm run db:push || true # Rimuovi devDependencies dopo build e migrations echo "๐Ÿงน Pulizia devDependencies (mantiene solo production)..." npm prune --production # =================== RESTART APPLICATION =================== # Restart applicazione con PM2 echo "๐Ÿ”„ Restart applicazione..." if pm2 show $APP_NAME > /dev/null 2>&1; then pm2 reload $APP_NAME --update-env else pm2 start npm --name $APP_NAME -- start pm2 save fi # Health check echo "๐Ÿฅ Health check..." sleep 5 if pm2 show $APP_NAME | grep -q "online"; then echo "โœ… Deployment completato con successo!" pm2 logs $APP_NAME --lines 20 --nostream else echo "โŒ Errore: applicazione non online" pm2 logs $APP_NAME --lines 50 --nostream # Rollback: ripristina ultimo backup echo "๐Ÿ”„ Tentativo rollback backup..." LATEST_BACKUP=$(ls -t $BACKUP_DIR/backup_*.sql.gz 2>/dev/null | head -1) if [ -f "$LATEST_BACKUP" ]; then echo "๐Ÿ“ฆ Ripristino da: $LATEST_BACKUP" gunzip -c $LATEST_BACKUP | PGPASSWORD=$PGPASSWORD psql -h ${PGHOST:-localhost} -U $PGUSER --dbname=$PGDATABASE echo "โœ… Database ripristinato" fi exit 1 fi # =================== STATUS =================== echo "" echo "๐Ÿ“Š Status PM2:" pm2 status echo "" echo "๐Ÿ“ˆ Ultimi backup disponibili:" ls -lht $BACKUP_DIR/*.gz 2>/dev/null | head -5 || echo "Nessun backup trovato" echo "" echo "๐ŸŒ Applicazione disponibile su: https://vt.alfacom.it"