netgescon-master/scripts/vm-sync-strategy.sh

196 lines
6.3 KiB
Bash

#!/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