From 088ec72ddc8e9f32592d03106092c35c5666e4d3 Mon Sep 17 00:00:00 2001 From: marco370 <48531002-marco370@users.noreply.replit.com> Date: Thu, 16 Oct 2025 15:31:17 +0000 Subject: [PATCH] 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 --- .replit | 4 -- deploy/deploy.sh | 135 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 5 deletions(-) diff --git a/.replit b/.replit index a16f3e2..048618b 100644 --- a/.replit +++ b/.replit @@ -27,10 +27,6 @@ externalPort = 3000 localPort = 42175 externalPort = 3002 -[[ports]] -localPort = 43161 -externalPort = 3003 - [env] PORT = "5000" diff --git a/deploy/deploy.sh b/deploy/deploy.sh index adbd43e..e22da63 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -1 +1,134 @@ -git commit -m "Fix deployment: PM2 env vars + drizzle-kit npx" \ No newline at end of file +#!/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" \ No newline at end of file