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
This commit is contained in:
parent
a92b7a5096
commit
088ec72ddc
4
.replit
4
.replit
@ -27,10 +27,6 @@ externalPort = 3000
|
|||||||
localPort = 42175
|
localPort = 42175
|
||||||
externalPort = 3002
|
externalPort = 3002
|
||||||
|
|
||||||
[[ports]]
|
|
||||||
localPort = 43161
|
|
||||||
externalPort = 3003
|
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
PORT = "5000"
|
PORT = "5000"
|
||||||
|
|
||||||
|
|||||||
135
deploy/deploy.sh
135
deploy/deploy.sh
@ -1 +1,134 @@
|
|||||||
git commit -m "Fix deployment: PM2 env vars + drizzle-kit npx"
|
#!/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"
|
||||||
Loading…
Reference in New Issue
Block a user