Move the database import step to occur after database schema migrations are applied. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e5565357-90e1-419f-b9a8-6ee8394636df Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/e5565357-90e1-419f-b9a8-6ee8394636df/IgrJ2ut
187 lines
6.2 KiB
Bash
187 lines
6.2 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# Script di deployment automatico per VigilanzaTurni
|
|
# Uso:
|
|
# bash deploy/deploy.sh → deployment normale
|
|
# bash deploy/deploy.sh db → deployment + importa backup database da Git
|
|
|
|
APP_DIR="/var/www/vigilanza-turni"
|
|
APP_NAME="vigilanza-turni"
|
|
BACKUP_DIR="/var/backups/vigilanza-turni"
|
|
GIT_BACKUP_DIR="$APP_DIR/database-backups"
|
|
|
|
# Verifica parametro per import database
|
|
IMPORT_DB=false
|
|
if [ "$1" == "db" ]; then
|
|
IMPORT_DB=true
|
|
echo "🔄 Modalità: Deployment con import database da Git"
|
|
fi
|
|
|
|
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
|
|
|
|
# Load env vars
|
|
if [ -f .env ]; then
|
|
source .env
|
|
fi
|
|
|
|
# =================== BACKUP DATABASE NORMALE (se non import) ===================
|
|
if [ "$IMPORT_DB" != true ]; then
|
|
echo "💾 Backup database pre-deployment..."
|
|
mkdir -p $BACKUP_DIR
|
|
BACKUP_FILE="$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).sql"
|
|
|
|
# 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
|
|
fi
|
|
|
|
# =================== BUILD & DEPLOY ===================
|
|
# Installa TUTTE le dipendenze (serve per build e migrations)
|
|
echo "📥 Installazione dipendenze (include devDependencies)..."
|
|
npm ci --include=dev
|
|
|
|
# Build frontend
|
|
echo "🏗️ Build frontend Vite..."
|
|
export NODE_ENV=production
|
|
npm run build
|
|
|
|
# Database migrations (serve Drizzle che è devDependency)
|
|
# IMPORTANTE: Le migrazioni devono essere eseguite PRIMA dell'import dei dati
|
|
echo "🗄️ Aggiornamento schema database..."
|
|
npm run db:push || echo "⚠️ Schema push skipped (database già aggiornato)"
|
|
|
|
# =================== IMPORT DATABASE DA GIT (dopo le migrazioni) ===================
|
|
if [ "$IMPORT_DB" = true ]; then
|
|
echo "📦 Import dati da backup Git..."
|
|
|
|
# Trova l'ultimo backup nella directory git
|
|
LATEST_GIT_BACKUP=$(ls -t $GIT_BACKUP_DIR/*.sql.gz 2>/dev/null | head -1)
|
|
|
|
if [ -f "$LATEST_GIT_BACKUP" ]; then
|
|
echo "📥 Trovato backup: $LATEST_GIT_BACKUP"
|
|
|
|
# Controlla che le variabili siano definite
|
|
if [ -z "$PGDATABASE" ] || [ -z "$PGUSER" ]; then
|
|
echo "❌ Variabili DB non trovate nel .env, impossibile importare"
|
|
exit 1
|
|
fi
|
|
|
|
# Chiedi conferma
|
|
echo "⚠️ ATTENZIONE: Questo sovrascriverà i dati correnti del database!"
|
|
echo "Lo schema è già stato aggiornato con le migrazioni."
|
|
echo "Backup da importare: $(basename $LATEST_GIT_BACKUP)"
|
|
read -p "Continuare? (s/n): " -n 1 -r
|
|
echo
|
|
|
|
if [[ $REPLY =~ ^[Ss]$ ]]; then
|
|
# NOTA: Il backup contiene --clean e ricreerà le tabelle
|
|
# Questo va bene perché contiene anche lo schema della versione corrente
|
|
echo "🔄 Importazione database completo (schema + dati)..."
|
|
gunzip -c "$LATEST_GIT_BACKUP" | PGPASSWORD=$PGPASSWORD psql -h ${PGHOST:-localhost} -U $PGUSER --dbname=$PGDATABASE
|
|
|
|
# Ri-esegui le migrazioni per sincronizzare eventuali differenze
|
|
echo "🔄 Sincronizzazione schema dopo import..."
|
|
npm run db:push || echo "⚠️ Schema già sincronizzato"
|
|
|
|
echo "✅ Database importato con successo da Git!"
|
|
else
|
|
echo "❌ Import annullato dall'utente"
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "❌ Nessun backup trovato in $GIT_BACKUP_DIR"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# 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
|
|
|
|
# Start con comando diretto (più affidabile)
|
|
$PM2_CMD start npm --name $APP_NAME -- start
|
|
$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" |