VigilanzaTurni/deploy/deploy.sh
marco370 088ec72ddc Improve deployment script to handle database backups and application restarts
Update deploy.sh to include database backup, dependency installation, Vite build, Drizzle schema push, and PM2 application restart with rollback functionality.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 42d8028a-fa71-4ec2-938c-e43eedf7df01
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/42d8028a-fa71-4ec2-938c-e43eedf7df01/AwjfjCW
2025-10-16 15:31:17 +00:00

134 lines
4.0 KiB
Bash

#!/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
npx vite build && npx esbuild server/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist
# Database migrations (serve Drizzle che è devDependency)
echo "🗄️ Verifica database schema..."
npx drizzle-kit push --force || echo "⚠️ Schema push skipped (database già aggiornato)"
# NOTA: NON facciamo npm prune perché Vite serve a runtime per il middleware
# Il server Express usa Vite per servire il frontend anche in produzione
# =================== RESTART APPLICATION ===================
# Trova PM2 (potrebbe essere in vari percorsi)
PM2_CMD=$(which pm2 2>/dev/null || echo "/usr/local/bin/pm2")
if [ ! -x "$PM2_CMD" ]; then
PM2_CMD="/usr/bin/pm2"
fi
if [ ! -x "$PM2_CMD" ]; then
PM2_CMD="$(npm root -g)/pm2/bin/pm2"
fi
echo "🔍 Usando PM2: $PM2_CMD"
# Carica variabili .env per PM2
if [ -f .env ]; then
source .env
export DATABASE_URL PGDATABASE PGUSER PGPASSWORD PGHOST PGPORT SESSION_SECRET NODE_ENV PORT
fi
# Restart applicazione con PM2
echo "🔄 Restart applicazione..."
if $PM2_CMD show $APP_NAME > /dev/null 2>&1; then
$PM2_CMD delete $APP_NAME
fi
# Usa ecosystem.config.js se esiste, altrimenti comando diretto
if [ -f ecosystem.config.js ]; then
$PM2_CMD start ecosystem.config.js
else
$PM2_CMD start npm --name $APP_NAME -- start
fi
$PM2_CMD save
# Health check
echo "🏥 Health check..."
sleep 5
if $PM2_CMD show $APP_NAME | grep -q "online"; then
echo "✅ Deployment completato con successo!"
$PM2_CMD logs $APP_NAME --lines 20 --nostream
else
echo "❌ Errore: applicazione non online"
$PM2_CMD 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_CMD 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"