# 5. SINCRONIZZAZIONE E CONFIGURAZIONE AMBIENTE ## 📋 **INDICE CAPITOLO** - [5.1 Architettura di Sincronizzazione](#51-architettura-di-sincronizzazione) - [5.2 Configurazione Ambiente Locale](#52-configurazione-ambiente-locale) - [5.3 Configurazione Server Remoto](#53-configurazione-server-remoto) - [5.4 Script di Sincronizzazione](#54-script-di-sincronizzazione) - [5.5 Attivazione Nuova Macchina](#55-attivazione-nuova-macchina) - [5.6 Gestione Codici Univoci](#56-gestione-codici-univoci) - [5.7 Troubleshooting](#57-troubleshooting) - [5.8 Monitoraggio e Automazione](#58-monitoraggio-e-automazione) --- ## 5.1 Architettura di Sincronizzazione ### Modello Centralizzato ``` ┌─────────────────────────────────────────────────────────────────┐ │ AMBIENTE NETGESCON │ ├─────────────────────────────────────────────────────────────────┤ │ ┌─────────────────┐ ┌─────────────────┐ ┌──────────────┐ │ │ │ LOCALE WSL │ │ SERVER REMOTO │ │ BACKUP │ │ │ │ │ │ │ │ │ │ │ │ Dev Environment │◄──►│ Production Env │◄──►│ Archive Data │ │ │ │ michele@SVR-GES │ │ michele@netges │ │ Daily Backup │ │ │ │ 192.168.0.xxx │ │ 192.168.0.43 │ │ Git Repo │ │ │ └─────────────────┘ └─────────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` ### Flusso di Sincronizzazione 1. **Sviluppo Locale**: Modifiche codice e database 2. **Sync Automatico**: rsync ottimizzato per trasferimento veloce 3. **Applicazione Remota**: Migration e aggiornamenti automatici 4. **Backup**: Archiviazione versioni e dati --- ## 5.2 Configurazione Ambiente Locale ### Prerequisiti Sistema ```bash # Verifica sistema operativo uname -a lsb_release -a # Verifica versioni software php -v mysql --version composer --version node --version npm --version ``` ### Installazione Dipendenze ```bash # Aggiorna sistema sudo apt update && sudo apt upgrade -y # Installa PHP e estensioni sudo apt install -y php8.2 php8.2-cli php8.2-common php8.2-mysql \ php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-zip \ php8.2-bcmath php8.2-intl php8.2-readline php8.2-opcache # Installa Composer curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer # Installa Node.js e npm curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs # Installa MySQL/MariaDB sudo apt install -y mysql-server mysql-client sudo mysql_secure_installation ``` ### Configurazione Laravel ```bash # Clona o inizializza progetto cd ~/netgescon git clone [repository] netgescon-laravel cd netgescon-laravel # Installa dipendenze composer install --no-dev --optimize-autoloader npm install && npm run build # Configura ambiente cp .env.example .env php artisan key:generate # Configura database php artisan migrate php artisan db:seed ``` ### File di Configurazione `.env` ```env APP_NAME=Netgescon APP_ENV=local APP_KEY=base64:xxxxx APP_DEBUG=true APP_URL=http://localhost:8000 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=netgescon DB_USERNAME=netgescon_user DB_PASSWORD=password_sicura MAIL_MAILER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=your_email@gmail.com MAIL_PASSWORD=your_app_password MAIL_ENCRYPTION=tls FILESYSTEM_DISK=local QUEUE_CONNECTION=sync ``` --- ## 5.3 Configurazione Server Remoto ### Preparazione Server ```bash # Connessione al server ssh michele@192.168.0.43 # Verifica sistema sudo apt update && sudo apt upgrade -y # Installa software necessario sudo apt install -y nginx mysql-server php8.2-fpm php8.2-mysql \ php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-zip \ php8.2-bcmath php8.2-intl supervisor redis-server # Configura Nginx sudo nano /etc/nginx/sites-available/netgescon ``` ### Configurazione Nginx ```nginx server { listen 80; server_name netgescon.local 192.168.0.43; root /var/www/netgescon/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.2-fpm.sock; } location ~ /\.ht { deny all; } client_max_body_size 100M; fastcgi_read_timeout 300; } ``` ### Configurazione Database ```bash # Configura MySQL sudo mysql -u root -p CREATE DATABASE netgescon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'password_sicura'; GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost'; FLUSH PRIVILEGES; EXIT; ``` ### Configurazione Permessi ```bash # Crea directory progetto sudo mkdir -p /var/www/netgescon sudo chown -R michele:www-data /var/www/netgescon sudo chmod -R 755 /var/www/netgescon # Configura permessi Laravel sudo chown -R michele:www-data /var/www/netgescon/storage sudo chown -R michele:www-data /var/www/netgescon/bootstrap/cache sudo chmod -R 775 /var/www/netgescon/storage sudo chmod -R 775 /var/www/netgescon/bootstrap/cache # Abilita sito Nginx sudo ln -s /etc/nginx/sites-available/netgescon /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx ``` --- ## 5.4 Script di Sincronizzazione ### File di Esclusione `.rsyncignore` ```plaintext .git/ node_modules/ vendor/ storage/logs/ storage/framework/cache/ storage/framework/sessions/ storage/framework/views/ bootstrap/cache/ .env .env.local .env.example *.log .phpunit.result.cache Homestead.json Homestead.yaml npm-debug.log yarn-error.log .DS_Store Thumbs.db ``` ### Script di Sincronizzazione `sync-to-remote.sh` ```bash #!/bin/bash # Script di sincronizzazione veloce per Netgescon # Uso: ./sync-to-remote.sh echo "🔄 Sincronizzazione in corso..." # Parametri configurabili LOCAL_PATH="$HOME/netgescon/netgescon-laravel/" REMOTE_USER="michele" REMOTE_HOST="192.168.0.43" REMOTE_PATH="/var/www/netgescon/" # Controllo connessione if ! ping -c 1 $REMOTE_HOST &> /dev/null; then echo "❌ Impossibile raggiungere il server $REMOTE_HOST" exit 1 fi # Backup prima della sincronizzazione echo "📦 Creazione backup remoto..." ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_PATH && tar -czf backup-$(date +%Y%m%d_%H%M%S).tar.gz --exclude='backup-*.tar.gz' ." # Comando rsync ottimizzato echo "🔄 Trasferimento file..." if [ -f .rsyncignore ]; then rsync -rz --delete --checksum --exclude-from=.rsyncignore \ $LOCAL_PATH $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH else rsync -rz --delete --checksum --exclude='.git' --exclude='node_modules' --exclude='vendor' --exclude='storage/logs' --exclude='storage/framework' --exclude='bootstrap/cache' \ $LOCAL_PATH $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH fi if [ $? -eq 0 ]; then echo "✅ Sincronizzazione completata con successo!" echo "📊 Statistiche:" echo " - Solo file modificati trasferiti" echo " - Compressione attiva" echo " - File non necessari esclusi" else echo "❌ Errore durante la sincronizzazione" exit 1 fi # Esecuzione comandi sul server remoto echo "🔧 Esecuzione comandi sul server remoto..." ssh $REMOTE_USER@$REMOTE_HOST "cd $REMOTE_PATH && \ composer install --no-dev --optimize-autoloader && \ php artisan migrate --force && \ php artisan config:cache && \ php artisan route:cache && \ php artisan view:cache && \ sudo systemctl restart nginx" if [ $? -eq 0 ]; then echo "🚀 Processo completato con successo!" else echo "⚠️ Sincronizzazione OK ma errore nei comandi remoti" exit 1 fi ``` ### Comandi Rapidi ```bash # Sincronizzazione veloce ./sync-to-remote.sh # Solo rsync senza comandi remoti rsync -rz --delete --checksum --exclude-from=.rsyncignore $HOME/netgescon/netgescon-laravel/ michele@192.168.0.43:/var/www/netgescon/ # Sync con statistiche rsync -rz --delete --checksum --stats --exclude-from=.rsyncignore $HOME/netgescon/netgescon-laravel/ michele@192.168.0.43:/var/www/netgescon/ ``` --- ## 5.5 Attivazione Nuova Macchina ### Checklist Preliminare - [ ] Sistema operativo supportato (Ubuntu 20.04+ / Debian 11+) - [ ] Connessione internet attiva - [ ] Accesso sudo - [ ] Chiavi SSH configurate - [ ] Porte 22, 80, 443, 3306 disponibili ### Procedura Completa di Setup #### Step 1: Configurazione Sistema Base ```bash # Aggiorna sistema sudo apt update && sudo apt upgrade -y # Installa software essenziale sudo apt install -y curl wget git vim htop unzip # Configura timezone sudo timedatectl set-timezone Europe/Rome # Configura hostname sudo hostnamectl set-hostname netgescon-server # Configura hosts echo "127.0.0.1 netgescon.local" | sudo tee -a /etc/hosts ``` #### Step 2: Installazione Stack LEMP ```bash # Installa Nginx sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx # Installa MySQL sudo apt install -y mysql-server sudo mysql_secure_installation # Installa PHP 8.2 sudo apt install -y php8.2 php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl \ php8.2-gd php8.2-mbstring php8.2-zip php8.2-bcmath php8.2-intl \ php8.2-readline php8.2-opcache # Installa Composer curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer # Installa Node.js curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt-get install -y nodejs ``` #### Step 3: Configurazione Database ```bash # Connetti a MySQL sudo mysql -u root -p # Crea database e utente CREATE DATABASE netgescon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'password_sicura_123!'; GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost'; # Configura per trigger e stored procedure SET GLOBAL log_bin_trust_function_creators = 1; FLUSH PRIVILEGES; EXIT; ``` #### Step 4: Configurazione Applicazione ```bash # Crea directory progetto sudo mkdir -p /var/www/netgescon sudo chown -R michele:www-data /var/www/netgescon sudo chmod -R 755 /var/www/netgescon # Trasferimento iniziale (dal server locale) rsync -rz --exclude='.git' --exclude='node_modules' --exclude='vendor' \ $HOME/netgescon/netgescon-laravel/ michele@192.168.0.43:/var/www/netgescon/ # Sul server remoto cd /var/www/netgescon # Installa dipendenze composer install --no-dev --optimize-autoloader npm install && npm run build # Configura ambiente cp .env.example .env php artisan key:generate # Configura database php artisan migrate php artisan db:seed # Configura permessi sudo chown -R michele:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache ``` #### Step 5: Configurazione Nginx ```bash # Crea configurazione sito sudo nano /etc/nginx/sites-available/netgescon # Contenuto configurazione (vedi sezione 5.3) # Abilita sito sudo ln -s /etc/nginx/sites-available/netgescon /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl restart nginx ``` #### Step 6: Configurazione Sicurezza ```bash # Configura firewall sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable # Configura fail2ban sudo apt install -y fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban # Configura chiavi SSH mkdir -p ~/.ssh chmod 700 ~/.ssh # Copia chiave pubblica del server locale ``` #### Step 7: Test Finale ```bash # Verifica servizi sudo systemctl status nginx sudo systemctl status mysql sudo systemctl status php8.2-fpm # Test applicazione curl -I http://192.168.0.43 curl -I http://netgescon.local # Test database php artisan tinker # User::count() # exit ``` ### Script di Installazione Automatica ```bash #!/bin/bash # auto-setup-netgescon.sh echo "🚀 Avvio installazione automatica Netgescon..." # Controllo root if [[ $EUID -eq 0 ]]; then echo "❌ Non eseguire questo script come root" exit 1 fi # Aggiornamento sistema echo "📦 Aggiornamento sistema..." sudo apt update && sudo apt upgrade -y # Installazione software echo "🔧 Installazione software..." sudo apt install -y nginx mysql-server php8.2-fpm php8.2-mysql \ php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-zip \ php8.2-bcmath php8.2-intl curl wget git vim htop unzip # Configurazione database echo "🗃️ Configurazione database..." sudo mysql -e "CREATE DATABASE netgescon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" sudo mysql -e "CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'password_sicura_123!';" sudo mysql -e "GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost';" sudo mysql -e "SET GLOBAL log_bin_trust_function_creators = 1;" sudo mysql -e "FLUSH PRIVILEGES;" # Configurazione directory echo "📁 Configurazione directory..." sudo mkdir -p /var/www/netgescon sudo chown -R $USER:www-data /var/www/netgescon sudo chmod -R 755 /var/www/netgescon echo "✅ Installazione base completata!" echo "🔄 Ora eseguire la sincronizzazione dal server locale" ``` --- ## 5.6 Gestione Codici Univoci ### Trigger MySQL per Codici Univoci ```sql -- Trigger per amministratori CREATE TRIGGER generate_codice_univoco_amministratori BEFORE INSERT ON amministratori FOR EACH ROW BEGIN DECLARE codice_temp VARCHAR(8); DECLARE codice_exists INT DEFAULT 1; IF NEW.codice_univoco IS NULL OR NEW.codice_univoco = "" THEN WHILE codice_exists > 0 DO SET codice_temp = CONCAT( SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1), SUBSTRING("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", FLOOR(1 + (RAND() * 36)), 1) ); SELECT COUNT(*) INTO codice_exists FROM amministratori WHERE codice_univoco = codice_temp; END WHILE; SET NEW.codice_univoco = codice_temp; END IF; END; ``` ### Observer Laravel Alternative ```php codice_univoco)) { $amministratore->codice_univoco = $this->generateCodiceUnivoco(); } } private function generateCodiceUnivoco(): string { $characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; do { $codice = ''; for ($i = 0; $i < 8; $i++) { $codice .= $characters[random_int(0, 35)]; } $exists = DB::table('amministratori') ->where('codice_univoco', $codice) ->exists(); } while ($exists); return $codice; } } ``` --- ## 5.7 Troubleshooting ### Problemi Comuni di Sincronizzazione #### Errore: "No such file or directory" ```bash # Problema: Path con tilde non espansa # Soluzione: Usare $HOME invece di ~ LOCAL_PATH="$HOME/netgescon/netgescon-laravel/" # invece di LOCAL_PATH="~/netgescon/netgescon-laravel/" ``` #### Errore: "Permission denied" ```bash # Problema: Permessi SSH o directory # Soluzione: Configura chiavi SSH ssh-keygen -t rsa -b 4096 -C "your_email@example.com" ssh-copy-id michele@192.168.0.43 # Verifica permessi directory sudo chown -R michele:www-data /var/www/netgescon sudo chmod -R 755 /var/www/netgescon ``` #### Errore: "MySQL connection refused" ```bash # Problema: MySQL non avviato o configurato male # Soluzione: Verifica servizio sudo systemctl status mysql sudo systemctl start mysql # Verifica configurazione sudo mysql -u root -p SHOW DATABASES; SHOW GRANTS FOR 'netgescon_user'@'localhost'; ``` #### Errore: "Nginx 502 Bad Gateway" ```bash # Problema: PHP-FPM non funzionante # Soluzione: Riavvia servizi sudo systemctl restart php8.2-fpm sudo systemctl restart nginx # Verifica configurazione sudo nginx -t sudo systemctl status php8.2-fpm ``` ### Comandi di Diagnostica ```bash # Verifica connessione rete ping 192.168.0.43 ssh -v michele@192.168.0.43 # Verifica servizi sudo systemctl status nginx sudo systemctl status mysql sudo systemctl status php8.2-fpm # Verifica log sudo tail -f /var/log/nginx/error.log sudo tail -f /var/log/mysql/error.log tail -f /var/www/netgescon/storage/logs/laravel.log # Verifica permessi ls -la /var/www/netgescon/ ls -la /var/www/netgescon/storage/ ls -la /var/www/netgescon/bootstrap/cache/ ``` --- ## 5.8 Monitoraggio e Automazione ### Script di Monitoraggio ```bash #!/bin/bash # monitor-netgescon.sh LOG_FILE="/var/log/netgescon-monitor.log" ALERT_EMAIL="admin@example.com" check_service() { service=$1 if ! systemctl is-active --quiet $service; then echo "$(date): ❌ $service is not running" | tee -a $LOG_FILE sudo systemctl start $service return 1 else echo "$(date): ✅ $service is running" | tee -a $LOG_FILE return 0 fi } check_disk_space() { usage=$(df /var/www | awk 'NR==2 {print $5}' | sed 's/%//') if [ $usage -gt 80 ]; then echo "$(date): ⚠️ Disk usage is ${usage}%" | tee -a $LOG_FILE return 1 else echo "$(date): ✅ Disk usage is ${usage}%" | tee -a $LOG_FILE return 0 fi } check_application() { response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost) if [ $response -eq 200 ]; then echo "$(date): ✅ Application is responding" | tee -a $LOG_FILE return 0 else echo "$(date): ❌ Application returned $response" | tee -a $LOG_FILE return 1 fi } # Esegui controlli check_service nginx check_service mysql check_service php8.2-fpm check_disk_space check_application ``` ### Automazione con Cron ```bash # Aggiungi al crontab crontab -e # Monitoring ogni 5 minuti */5 * * * * /home/michele/scripts/monitor-netgescon.sh # Backup database giornaliero 0 2 * * * mysqldump -u netgescon_user -p netgescon > /var/backups/netgescon_$(date +%Y%m%d).sql # Sincronizzazione automatica (se necessario) 0 */6 * * * /home/michele/netgescon/netgescon-laravel/sync-to-remote.sh ``` ### Script di Backup Automatico ```bash #!/bin/bash # backup-netgescon.sh BACKUP_DIR="/var/backups/netgescon" DB_NAME="netgescon" DB_USER="netgescon_user" DB_PASS="password_sicura_123!" APP_DIR="/var/www/netgescon" mkdir -p $BACKUP_DIR # Backup database mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_$(date +%Y%m%d_%H%M%S).sql # Backup files tar -czf $BACKUP_DIR/files_$(date +%Y%m%d_%H%M%S).tar.gz -C $APP_DIR . # Cleanup vecchi backup (mantieni 7 giorni) find $BACKUP_DIR -name "*.sql" -mtime +7 -delete find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete echo "Backup completato: $(date)" ``` --- ## 📚 **COMANDI RAPIDI** ### Sincronizzazione ```bash # Sync completo ./sync-to-remote.sh # Solo rsync rsync -rz --delete --checksum --exclude-from=.rsyncignore $HOME/netgescon/netgescon-laravel/ michele@192.168.0.43:/var/www/netgescon/ # Sync con statistiche rsync -rz --delete --checksum --stats --exclude-from=.rsyncignore $HOME/netgescon/netgescon-laravel/ michele@192.168.0.43:/var/www/netgescon/ ``` ### Manutenzione Remota ```bash # Connessione server ssh michele@192.168.0.43 # Riavvio servizi sudo systemctl restart nginx php8.2-fpm mysql # Verifica stato sudo systemctl status nginx mysql php8.2-fpm # Update applicazione cd /var/www/netgescon composer install --no-dev --optimize-autoloader php artisan migrate --force php artisan config:cache ``` ### Diagnostica ```bash # Verifica connessione ping 192.168.0.43 ssh -v michele@192.168.0.43 # Log monitoring sudo tail -f /var/log/nginx/error.log tail -f /var/www/netgescon/storage/logs/laravel.log # Test applicazione curl -I http://192.168.0.43 ``` --- **Data ultima modifica**: 18 Luglio 2025 **Versione**: 1.0 **Stato**: Aggiornato con script di sincronizzazione ottimizzati