#!/bin/bash # vm-sync-strategy.sh - Sincronizzazione intelligente tra VM NetGescon set -e # Configurazione ambiente PROD_HOST="192.168.1.100" DEV_HOST="192.168.1.101" CLIENT_HOST="192.168.1.102" SSH_USER="netgescon" PROJECT_PATH="/var/www/netgescon/netgescon-laravel" # Colori per output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERROR]${NC} $1"; } log_step() { echo -e "${BLUE}[STEP]${NC} $1"; } echo "🔄 NetGescon VM Sync Strategy" echo "=============================" # Funzione per eseguire comandi remoti run_remote() { local host=$1 local command=$2 ssh -o ConnectTimeout=10 $SSH_USER@$host "$command" } # Funzione per sincronizzare codice sync_code() { local source_host=$1 local target_host=$2 local direction=$3 log_step "Sincronizzazione codice: $direction" # Esclusioni per rsync local excludes="--exclude=storage/logs/* --exclude=storage/cache/* --exclude=.env --exclude=vendor/ --exclude=node_modules/" # Sync via rsync rsync -avz --delete $excludes \ $SSH_USER@$source_host:$PROJECT_PATH/ \ $SSH_USER@$target_host:$PROJECT_PATH/ # Reinstalla dipendenze sul target run_remote $target_host "cd $PROJECT_PATH && composer install --no-dev --optimize-autoloader" run_remote $target_host "cd $PROJECT_PATH && npm install && npm run build" log_info "Sincronizzazione completata: $direction" } # Funzione per backup database backup_database() { local host=$1 local backup_name=$2 log_step "Backup database da $host" run_remote $host "mysqldump -u netgescon_user -pNetGescon2024! netgescon > /tmp/$backup_name.sql" scp $SSH_USER@$host:/tmp/$backup_name.sql ./backups/ log_info "Database backup salvato: ./backups/$backup_name.sql" } # Funzione per ripristino database restore_database() { local host=$1 local backup_file=$2 log_step "Ripristino database su $host" scp ./backups/$backup_file $SSH_USER@$host:/tmp/ run_remote $host "mysql -u netgescon_user -pNetGescon2024! netgescon < /tmp/$backup_file" log_info "Database ripristinato su $host" } # Menu principale show_menu() { echo "" echo "═══════════════════════════════════════════════════════" echo "🔄 NETGESCON VM SYNC MENU" echo "═══════════════════════════════════════════════════════" echo "" echo "SINCRONIZZAZIONE CODICE:" echo "1) PROD → DEV (Aggiorna ambiente sviluppo)" echo "2) DEV → PROD (Deploy sviluppo in produzione)" echo "3) PROD → CLIENT (Aggiorna cliente test)" echo "4) DEV → CLIENT (Test sviluppo su cliente)" echo "" echo "GESTIONE DATABASE:" echo "5) Backup DB PROD" echo "6) PROD DB → DEV" echo "7) PROD DB → CLIENT" echo "8) Ripristina DB da backup" echo "" echo "OPERAZIONI SPECIALI:" echo "9) Health check tutte le VM" echo "10) Setup SSH keys" echo "11) Deploy completo PROD → DEV + CLIENT" echo "12) Rollback emergency" echo "" echo "0) Esci" echo "" read -p "Scegli operazione: " choice } # Implementazione menu case_handler() { case $1 in 1) log_info "Sincronizzazione PROD → DEV" sync_code $PROD_HOST $DEV_HOST "PRODUCTION to DEVELOPMENT" ;; 2) log_warn "ATTENZIONE: Deploy in PRODUZIONE" read -p "Confermi il deploy DEV → PROD? (y/N): " confirm if [[ $confirm == "y" || $confirm == "Y" ]]; then backup_database $PROD_HOST "prod_backup_$(date +%Y%m%d_%H%M%S)" sync_code $DEV_HOST $PROD_HOST "DEVELOPMENT to PRODUCTION" fi ;; 3) log_info "Sincronizzazione PROD → CLIENT" sync_code $PROD_HOST $CLIENT_HOST "PRODUCTION to CLIENT" ;; 4) log_info "Sincronizzazione DEV → CLIENT" sync_code $DEV_HOST $CLIENT_HOST "DEVELOPMENT to CLIENT" ;; 5) backup_name="prod_manual_$(date +%Y%m%d_%H%M%S)" backup_database $PROD_HOST $backup_name ;; 6) log_info "Sincronizzazione DB PROD → DEV" backup_database $PROD_HOST "temp_prod_to_dev" restore_database $DEV_HOST "temp_prod_to_dev.sql" ;; 7) log_info "Sincronizzazione DB PROD → CLIENT" backup_database $PROD_HOST "temp_prod_to_client" restore_database $CLIENT_HOST "temp_prod_to_client.sql" ;; 9) log_info "Health check di tutte le VM" for host in $PROD_HOST $DEV_HOST $CLIENT_HOST; do if run_remote $host "systemctl is-active nginx mysql php8.2-fpm" &>/dev/null; then log_info "$host: OK" else log_error "$host: PROBLEMI" fi done ;; 10) log_info "Setup SSH keys per accesso automatico" ssh-keygen -t rsa -b 4096 -f ~/.ssh/netgescon_rsa -N "" for host in $PROD_HOST $DEV_HOST $CLIENT_HOST; do ssh-copy-id -i ~/.ssh/netgescon_rsa.pub $SSH_USER@$host done ;; 11) log_info "Deploy completo PROD → DEV + CLIENT" backup_database $PROD_HOST "full_deploy_$(date +%Y%m%d_%H%M%S)" sync_code $PROD_HOST $DEV_HOST "PROD to DEV" sync_code $PROD_HOST $CLIENT_HOST "PROD to CLIENT" restore_database $DEV_HOST "full_deploy_$(date +%Y%m%d_%H%M%S).sql" restore_database $CLIENT_HOST "full_deploy_$(date +%Y%m%d_%H%M%S).sql" ;; 0) log_info "Uscita dal programma" exit 0 ;; *) log_error "Opzione non valida" ;; esac } # Creazione directory backup mkdir -p ./backups # Loop principale while true; do show_menu case_handler $choice echo "" read -p "Premi ENTER per continuare..." done