196 lines
6.3 KiB
Bash
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
|