# GUIDA COMPLETA MIGRAZIONE NETGESCON SU LINUX

## FASE 1: PREPARAZIONE AMBIENTE LINUX

### 1.1 Download Ubuntu Server 22.04 LTS
```bash
# Scaricare da: https://ubuntu.com/download/server
# File: ubuntu-22.04.3-live-server-amd64.iso
```

### 1.2 Creazione VM (VirtualBox)
```bash
# Impostazioni VM consigliate:
- Nome: NetGescon-Ubuntu
- Tipo: Linux
- Versione: Ubuntu (64-bit)
- RAM: 4096 MB (minimo) / 8192 MB (consigliato)
- Storage: 80 GB dinamico VDI
- Network: Bridge Adapter (o NAT con port forwarding)
- CPU: 2-4 core
```

### 1.3 Installazione Ubuntu Server
```bash
# Durante l'installazione:
1. Lingua: English (per compatibilità)
2. Layout tastiera: Italian
3. Network: Configurazione automatica DHCP
4. Storage: Use entire disk (guided)
5. Profile setup:
   - Nome server: netgescon-server
   - Username: netgescon
   - Password: [sicura]
6. SSH: Installa OpenSSH server ✓
7. Snap packages: Nessuno per ora
```

## FASE 2: CONFIGURAZIONE AMBIENTE SVILUPPO

### 2.1 Aggiornamento sistema
```bash
sudo apt update && sudo apt upgrade -y
sudo reboot
```

### 2.2 Installazione pacchetti base
```bash
# Pacchetti essenziali
sudo apt install -y curl wget git unzip vim htop tree

# Utilità di rete
sudo apt install -y net-tools openssh-server ufw

# Configurazione firewall
sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 8000
```

### 2.3 Installazione PHP 8.2
```bash
# Repository PHP
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update

# PHP 8.2 e estensioni Laravel
sudo apt install -y php8.2 php8.2-fpm php8.2-cli php8.2-common php8.2-mysql \
php8.2-zip php8.2-gd php8.2-mbstring php8.2-curl php8.2-xml php8.2-bcmath \
php8.2-intl php8.2-sqlite3 php8.2-redis php8.2-imagick

# Verifica installazione
php -v
```

### 2.4 Installazione Composer
```bash
# Download e installazione Composer
cd /tmp
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer

# Verifica
composer --version
```

### 2.5 Installazione Node.js (per asset frontend)
```bash
# NodeJS via NodeSource
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

# Verifica
node --version
npm --version
```

### 2.6 Installazione Database MySQL
```bash
# Installazione MySQL Server
sudo apt install -y mysql-server

# Configurazione sicura
sudo mysql_secure_installation
# Risposte consigliate:
# - Remove anonymous users: Y
# - Disallow root login remotely: Y
# - Remove test database: Y
# - Reload privilege tables: Y

# Configurazione utente database
sudo mysql -u root -p
```

```sql
-- Creazione database e utente per NetGescon
CREATE DATABASE netgescon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'NetGescon2024!';
GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

### 2.7 Installazione e configurazione Nginx
```bash
# Installazione Nginx
sudo apt install -y nginx

# Avvio e abilitazione
sudo systemctl start nginx
sudo systemctl enable nginx

# Test
curl localhost
```

## FASE 3: TRASFERIMENTO PROGETTO

### 3.1 Preparazione directory
```bash
# Creazione struttura directory
sudo mkdir -p /var/www/netgescon
sudo chown -R $USER:www-data /var/www/netgescon
sudo chmod -R 755 /var/www/netgescon

# Directory di lavoro
cd /var/www/netgescon
```

### 3.2 Opzioni di trasferimento

#### OPZIONE A: Trasferimento via SCP/SFTP
```bash
# Da Windows (PowerShell/cmd), copiare il progetto:
scp -r "u:\home\michele\netgescon\netgescon-laravel" netgescon@[IP_VM]:/var/www/netgescon/

# Oppure usare WinSCP, FileZilla, o strumenti grafici
```

#### OPZIONE B: Backup e ripristino via Git
```bash
# Su Windows: creare repository Git locale
cd "u:\home\michele\netgescon\netgescon-laravel"
git init
git add .
git commit -m "Backup completo progetto NetGescon"

# Su Linux: clonare da repository remoto o trasferire .git
```

#### OPZIONE C: Trasferimento via archivio
```bash
# Su Windows: creare archivio ZIP del progetto
# Su Linux: estrarre archivio
cd /var/www/netgescon
unzip netgescon-laravel.zip
```

### 3.3 Configurazione permessi
```bash
cd /var/www/netgescon/netgescon-laravel

# Permessi directory Laravel
sudo chown -R $USER:www-data .
sudo chmod -R 755 .
sudo chmod -R 775 storage bootstrap/cache
sudo chmod 644 .env
```

## FASE 4: CONFIGURAZIONE LARAVEL

### 4.1 Installazione dipendenze
```bash
cd /var/www/netgescon/netgescon-laravel

# Installazione dipendenze PHP
composer install --optimize-autoloader --no-dev

# Installazione dipendenze Node.js
npm install

# Build asset produzione
npm run build
```

### 4.2 Configurazione ambiente
```bash
# Copia e modifica file .env
cp .env.example .env
vim .env
```

```env
# Configurazione .env per Linux
APP_NAME="NetGescon"
APP_ENV=production
APP_KEY=
APP_DEBUG=false
APP_URL=http://localhost:8000

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=netgescon
DB_USERNAME=netgescon_user
DB_PASSWORD=NetGescon2024!

BROADCAST_DRIVER=log
CACHE_DRIVER=file
FILESYSTEM_DISK=local
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

MEMCACHED_HOST=127.0.0.1

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
```

### 4.3 Generazione chiave e cache
```bash
# Generazione chiave applicazione
php artisan key:generate

# Ottimizzazione cache
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Link storage
php artisan storage:link
```

### 4.4 Migrazione database
```bash
# Esecuzione migrazioni
php artisan migrate --force

# Seeder (se necessario)
php artisan db:seed --force
```

## FASE 5: CONFIGURAZIONE NGINX

### 5.1 Configurazione virtual host
```bash
sudo vim /etc/nginx/sites-available/netgescon
```

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name localhost netgescon.local;
    root /var/www/netgescon/netgescon-laravel/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

### 5.2 Attivazione configurazione
```bash
# Abilita sito
sudo ln -s /etc/nginx/sites-available/netgescon /etc/nginx/sites-enabled/

# Disabilita sito default
sudo unlink /etc/nginx/sites-enabled/default

# Test configurazione
sudo nginx -t

# Riavvio Nginx
sudo systemctl restart nginx
sudo systemctl restart php8.2-fpm
```

## FASE 6: TESTING E VERIFICA

### 6.1 Test applicazione
```bash
# Test via artisan serve (sviluppo)
cd /var/www/netgescon/netgescon-laravel
php artisan serve --host=0.0.0.0 --port=8000

# Test via browser:
# http://[IP_VM]:8000
```

### 6.2 Test database
```bash
# Verifica connessione database
php artisan tinker
# >>> \DB::connection()->getPdo();
# >>> User::count();
```

### 6.3 Log monitoring
```bash
# Monitoraggio log Laravel
tail -f storage/logs/laravel.log

# Monitoraggio log Nginx
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log
```

## FASE 7: CONFIGURAZIONE API LEGACY

### 7.1 Creazione controller API bridge
```bash
php artisan make:controller Api/LegacyBridgeController
```

### 7.2 Configurazione route API
```php
// routes/api.php
Route::prefix('legacy')->group(function () {
    Route::post('/import-stabili', [LegacyBridgeController::class, 'importStabili']);
    Route::post('/import-condomini', [LegacyBridgeController::class, 'importCondomini']);
    Route::post('/sync-data', [LegacyBridgeController::class, 'syncData']);
});
```

### 7.3 Documentazione API
```bash
# Installazione Swagger/OpenAPI
composer require darkaonline/l5-swagger
php artisan vendor:publish --provider "L5Swagger\L5SwaggerServiceProvider"
```

## FASE 8: SICUREZZA E BACKUP

### 8.1 Configurazione SSL (opzionale)
```bash
# Installazione Certbot per Let's Encrypt
sudo apt install -y certbot python3-certbot-nginx

# Certificato SSL (se dominio pubblico)
sudo certbot --nginx -d netgescon.yourdomain.com
```

### 8.2 Script backup automatico
```bash
# Script backup database e file
sudo vim /usr/local/bin/netgescon-backup.sh
```

```bash
#!/bin/bash
BACKUP_DIR="/var/backups/netgescon"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR

# Backup database
mysqldump -u netgescon_user -p'NetGescon2024!' netgescon > $BACKUP_DIR/netgescon_db_$DATE.sql

# Backup file applicazione
tar -czf $BACKUP_DIR/netgescon_files_$DATE.tar.gz -C /var/www/netgescon .

# Rimozione backup vecchi (>7 giorni)
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
```

```bash
# Permessi script
sudo chmod +x /usr/local/bin/netgescon-backup.sh

# Crontab per backup automatico
sudo crontab -e
# Aggiungere: 0 2 * * * /usr/local/bin/netgescon-backup.sh
```

## FASE 9: MONITORAGGIO E MANUTENZIONE

### 9.1 Script di monitoraggio
```bash
# Script controllo servizi
sudo vim /usr/local/bin/netgescon-health.sh
```

```bash
#!/bin/bash
echo "=== NetGescon Health Check ==="
echo "Date: $(date)"
echo

# Check services
systemctl is-active nginx || echo "❌ Nginx down"
systemctl is-active mysql || echo "❌ MySQL down"
systemctl is-active php8.2-fpm || echo "❌ PHP-FPM down"

# Check disk space
df -h /var/www/netgescon | tail -1 | awk '{print "Disk usage: " $5}'

# Check database connection
cd /var/www/netgescon/netgescon-laravel
php artisan tinker --execute="echo \DB::connection()->getPdo() ? '✅ DB OK' : '❌ DB Failed';"
```

### 9.2 Log rotation
```bash
sudo vim /etc/logrotate.d/netgescon
```

```
/var/www/netgescon/netgescon-laravel/storage/logs/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        systemctl reload php8.2-fpm
    endscript
}
```

## TROUBLESHOOTING COMUNE

### Errori Permission Denied
```bash
sudo chown -R $USER:www-data /var/www/netgescon
sudo chmod -R 755 /var/www/netgescon
sudo chmod -R 775 /var/www/netgescon/netgescon-laravel/storage
```

### Errori Database Connection
```bash
# Verifica stato MySQL
sudo systemctl status mysql

# Test connessione
mysql -u netgescon_user -p netgescon
```

### Errori 500 Internal Server
```bash
# Verifica log
tail -f /var/www/netgescon/netgescon-laravel/storage/logs/laravel.log
sudo tail -f /var/log/nginx/error.log
```

### Performance Tuning
```bash
# Ottimizzazione PHP-FPM
sudo vim /etc/php/8.2/fpm/pool.d/www.conf
# pm.max_children = 50
# pm.start_servers = 20
# pm.min_spare_servers = 10
# pm.max_spare_servers = 30

# Ottimizzazione MySQL
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
# innodb_buffer_pool_size = 1G
# query_cache_size = 128M
```

---

## NEXT STEPS

1. **Seguire questa guida step-by-step**
2. **Testare ogni fase prima di procedere**
3. **Configurare API bridge per connessione legacy**
4. **Implementare monitoraggio e backup**
5. **Ottimizzare performance**

Vuoi che iniziamo con la creazione della VM?

---

## SCRIPT INSTALLAZIONE AUTOMATICA

### Script setup-netgescon.sh
```bash
#!/bin/bash
set -e

echo "🚀 NetGescon Linux Setup Script"
echo "================================="

# Colori per output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# Verifica se eseguito come utente normale
if [[ $EUID -eq 0 ]]; then
   log_error "Non eseguire questo script come root. Usa il tuo utente normale."
   exit 1
fi

log_info "Aggiornamento sistema..."
sudo apt update && sudo apt upgrade -y

log_info "Installazione pacchetti base..."
sudo apt install -y curl wget git unzip vim htop tree net-tools openssh-server ufw

log_info "Configurazione firewall..."
sudo ufw --force enable
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 8000

log_info "Installazione PHP 8.2..."
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install -y php8.2 php8.2-fpm php8.2-cli php8.2-common php8.2-mysql \
php8.2-zip php8.2-gd php8.2-mbstring php8.2-curl php8.2-xml php8.2-bcmath \
php8.2-intl php8.2-sqlite3 php8.2-redis php8.2-imagick

log_info "Installazione Composer..."
cd /tmp
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer

log_info "Installazione Node.js..."
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y nodejs

log_info "Installazione MySQL..."
sudo apt install -y mysql-server

log_info "Installazione Nginx..."
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx

log_info "Creazione directory progetto..."
sudo mkdir -p /var/www/netgescon
sudo chown -R $USER:www-data /var/www/netgescon
sudo chmod -R 755 /var/www/netgescon

log_info "Configurazione MySQL..."
echo "IMPORTANTE: Configura MySQL manualmente con:"
echo "sudo mysql_secure_installation"
echo ""
echo "Poi esegui questi comandi SQL:"
echo "CREATE DATABASE netgescon CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
echo "CREATE USER 'netgescon_user'@'localhost' IDENTIFIED BY 'NetGescon2024!';"
echo "GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon_user'@'localhost';"
echo "FLUSH PRIVILEGES;"

log_info "Setup completato! 🎉"
echo ""
echo "NEXT STEPS:"
echo "1. Configura MySQL (vedi comandi sopra)"
echo "2. Trasferisci il progetto Laravel in /var/www/netgescon/"
echo "3. Configura Nginx virtual host"
echo "4. Esegui setup Laravel (composer install, migrations, etc.)"

# Salva log installazione
echo "$(date): NetGescon setup completato" >> ~/netgescon-setup.log
```

### Script post-installazione
```bash
#!/bin/bash
# setup-laravel.sh - Da eseguire dopo aver trasferito il progetto

set -e
cd /var/www/netgescon/netgescon-laravel

echo "🔧 Setup Laravel NetGescon"
echo "==========================="

# Verifica directory
if [ ! -f "artisan" ]; then
    echo "❌ File artisan non trovato. Assicurati di essere nella directory corretta."
    exit 1
fi

# Installazione dipendenze
echo "📦 Installazione dipendenze PHP..."
composer install --optimize-autoloader --no-dev

echo "📦 Installazione dipendenze Node.js..."
npm install

echo "🏗️  Build asset produzione..."
npm run build

# Configurazione permessi
echo "🔐 Configurazione permessi..."
sudo chown -R $USER:www-data .
sudo chmod -R 755 .
sudo chmod -R 775 storage bootstrap/cache

# Setup .env se non esiste
if [ ! -f ".env" ]; then
    echo "⚙️  Configurazione .env..."
    cp .env.example .env
    echo "✋ IMPORTANTE: Modifica il file .env con i dati del database!"
    echo "   Database: netgescon"
    echo "   Username: netgescon_user"
    echo "   Password: NetGescon2024!"
fi

# Generazione chiave
echo "🔑 Generazione chiave applicazione..."
php artisan key:generate

# Cache ottimizzazione
echo "⚡ Ottimizzazione cache..."
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Storage link
echo "🔗 Creazione storage link..."
php artisan storage:link

echo ""
echo "✅ Setup Laravel completato!"
echo ""
echo "NEXT STEPS:"
echo "1. Verifica configurazione .env"
echo "2. Esegui: php artisan migrate --force"
echo "3. Esegui: php artisan db:seed --force"
echo "4. Configura Nginx virtual host"
```

## CHECKLIST DI VERIFICA

### ✅ Pre-migrazione (Windows)
- [ ] Backup completo progetto NetGescon
- [ ] Export database (se esistente)
- [ ] Verifica file .env e configurazioni
- [ ] Test funzionalità correnti
- [ ] Documentazione personalizzazioni

### ✅ Setup VM Linux
- [ ] Ubuntu Server 22.04 LTS installato
- [ ] Configurazione rete (IP statico o DHCP)
- [ ] SSH server attivo e accessibile
- [ ] Utente netgescon creato
- [ ] Firewall UFW configurato

### ✅ Ambiente sviluppo
- [ ] PHP 8.2 installato e configurato
- [ ] Composer funzionante
- [ ] Node.js e npm installati
- [ ] MySQL server installato
- [ ] Nginx installato e attivo

### ✅ Database
- [ ] Database 'netgescon' creato
- [ ] Utente 'netgescon_user' configurato
- [ ] Privilegi assegnati correttamente
- [ ] Test connessione database OK

### ✅ Trasferimento progetto
- [ ] Codice Laravel trasferito in /var/www/netgescon/
- [ ] Permessi file corretti (755/775)
- [ ] Dipendenze Composer installate
- [ ] Asset frontend compilati
- [ ] File .env configurato

### ✅ Configurazione Laravel
- [ ] APP_KEY generata
- [ ] Cache configurazione creata
- [ ] Migrazioni database eseguite
- [ ] Seeder eseguiti (se necessario)
- [ ] Storage link creato

### ✅ Configurazione web server
- [ ] Virtual host Nginx configurato
- [ ] PHP-FPM funzionante
- [ ] Test sintassi nginx OK
- [ ] Servizi riavviati

### ✅ Testing funzionalità
- [ ] Homepage NetGescon carica
- [ ] Login utenti funziona
- [ ] Dashboard accessibile
- [ ] Menu sidebar funzionano
- [ ] AJAX navigation OK
- [ ] Upload file funziona
- [ ] Database queries OK

### ✅ Sicurezza e manutenzione
- [ ] Script backup configurato
- [ ] Crontab backup attivo
- [ ] Log rotation configurato
- [ ] Monitoraggio servizi OK
- [ ] SSL configurato (se necessario)

### ✅ API Legacy (se necessario)
- [ ] Controller API bridge creato
- [ ] Route API configurate
- [ ] Test connessione legacy system
- [ ] Documentazione API completa

## COMANDI RAPIDI EMERGENZA

### Riavvio servizi
```bash
sudo systemctl restart nginx
sudo systemctl restart php8.2-fpm
sudo systemctl restart mysql
```

### Check status servizi
```bash
sudo systemctl status nginx php8.2-fpm mysql
```

### Monitoring real-time
```bash
# Log Laravel
tail -f /var/www/netgescon/netgescon-laravel/storage/logs/laravel.log

# Log Nginx errori
sudo tail -f /var/log/nginx/error.log

# Log accessi Nginx
sudo tail -f /var/log/nginx/access.log

# Monitoraggio sistema
htop
```

### Reset cache Laravel
```bash
cd /var/www/netgescon/netgescon-laravel
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
```

### Backup emergenza
```bash
# Database
mysqldump -u netgescon_user -p netgescon > backup-emergency-$(date +%Y%m%d_%H%M%S).sql

# File progetto
tar -czf backup-netgescon-$(date +%Y%m%d_%H%M%S).tar.gz /var/www/netgescon/
```

---

## SUPPORTO E CONTATTI

Per problemi durante la migrazione:
1. Controllare i log (Laravel, Nginx, MySQL)
2. Verificare permessi file e directory
3. Testare connessione database
4. Controllare configurazione Nginx
5. Verificare stato servizi Linux

**File di log principali:**
- Laravel: `/var/www/netgescon/netgescon-laravel/storage/logs/laravel.log`
- Nginx: `/var/log/nginx/error.log`
- MySQL: `/var/log/mysql/error.log`
- Sistema: `/var/log/syslog`
