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