# 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
<?php

namespace App\Observers;

use App\Models\Amministratore;
use Illuminate\Support\Facades\DB;

class AmministratoreObserver
{
    public function creating(Amministratore $amministratore): void
    {
        if (empty($amministratore->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
