#!/bin/bash # ๐Ÿš€ NETGESCON - SETUP CORRETTO VM MASTER CON NGINX # Creato: 19/07/2025 - Setup definitivo Michele + AI set -e echo "๐Ÿš€ === NETGESCON - SETUP DEFINITIVO VM MASTER ===" echo "๐Ÿ“… $(date '+%Y-%m-%d %H:%M:%S')" echo "" # === CONFIGURAZIONI === PROJECT_PATH="/home/michele/netgescon" WEB_ROOT="/var/www" DOMAIN="netgescon.local" VM_IP="192.168.0.200" echo "๐Ÿ“‹ Configurazione:" echo " Progetto: $PROJECT_PATH" echo " Web Server: Nginx (invece di Apache)" echo " Dominio: $DOMAIN" echo " IP VM: $VM_IP" echo "" # === 1. PULIZIA INIZIALE === echo "๐Ÿงน 1. Pulizia /var/www/ e rimozione Apache..." # Rimuove Apache se presente if systemctl is-active apache2 >/dev/null 2>&1; then sudo systemctl stop apache2 sudo systemctl disable apache2 sudo apt remove -y apache2 echo " โœ… Apache rimosso" fi # Pulizia /var/www/ sudo rm -rf /var/www/html sudo rm -rf /var/www/netgescon* sudo mkdir -p /var/www echo " โœ… Directory /var/www/ pulita" # === 2. AGGIORNAMENTO SISTEMA === echo "" echo "๐Ÿ”„ 2. Aggiornamento sistema..." sudo apt update && sudo apt upgrade -y # === 3. INSTALLAZIONE STACK NGINX === echo "" echo "๐Ÿ“ฆ 3. Installazione stack con Nginx..." # Nginx sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx # MySQL sudo apt install -y mysql-server sudo systemctl enable mysql sudo systemctl start mysql # PHP-FPM (migliore per Nginx) sudo apt install -y php8.1-fpm php8.1-mysql php8.1-xml php8.1-mbstring \ php8.1-zip php8.1-gd php8.1-curl php8.1-dom php8.1-common php8.1-cli \ php8.1-bcmath php8.1-opcache # Composer if ! command -v composer &> /dev/null; then curl -sS https://getcomposer.org/installer | php sudo mv composer.phar /usr/local/bin/composer sudo chmod +x /usr/local/bin/composer fi # Node.js if ! command -v node &> /dev/null; then curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - sudo apt install -y nodejs fi # Git (se non presente) sudo apt install -y git curl wget rsync echo " โœ… Stack Nginx installato" # === 4. CONFIGURAZIONE NGINX PER LARAVEL === echo "" echo "๐ŸŒ 4. Configurazione Nginx per Laravel..." # Backup configurazione default sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.backup # Crea configurazione NetGescon ottimizzata sudo tee /etc/nginx/sites-available/netgescon << EOF server { listen 80; listen [::]:80; server_name $DOMAIN $VM_IP localhost; root $PROJECT_PATH/netgescon-laravel/public; index index.php index.html index.htm; # Logs access_log /var/log/nginx/netgescon-access.log; error_log /var/log/nginx/netgescon-error.log; # Security headers add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; # Laravel routes location / { try_files \$uri \$uri/ /index.php?\$query_string; } # PHP-FPM location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; fastcgi_param SCRIPT_FILENAME \$realpath_root\$fastcgi_script_name; include fastcgi_params; # Timeout ottimizzati per Laravel fastcgi_read_timeout 300; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; } # Static files caching location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; try_files \$uri =404; } # Deny access to sensitive files location ~ /\.(?!well-known).* { deny all; } location ~ /\.env { deny all; } # Prevent access to Laravel directories location ~ ^/(storage|bootstrap/cache)/ { deny all; } } EOF # Abilita sito e disabilita default sudo ln -sf /etc/nginx/sites-available/netgescon /etc/nginx/sites-enabled/ sudo rm -f /etc/nginx/sites-enabled/default # Test configurazione sudo nginx -t sudo systemctl reload nginx echo " โœ… Nginx configurato per Laravel" # === 5. CONFIGURAZIONE DATABASE === echo "" echo "๐Ÿ—„๏ธ 5. Configurazione database MySQL..." sudo mysql << 'MYSQL_SCRIPT' CREATE DATABASE IF NOT EXISTS netgescon; CREATE USER IF NOT EXISTS 'netgescon'@'localhost' IDENTIFIED BY 'netgescon2025'; GRANT ALL PRIVILEGES ON netgescon.* TO 'netgescon'@'localhost'; FLUSH PRIVILEGES; MYSQL_SCRIPT echo " โœ… Database MySQL configurato" # === 6. CONFIGURAZIONE LARAVEL === echo "" echo "๐Ÿ”ง 6. Configurazione Laravel..." cd $PROJECT_PATH/netgescon-laravel # Installa dipendenze se composer.json esiste if [ -f "composer.json" ]; then composer install --no-dev --optimize-autoloader echo " โœ… Dipendenze Composer installate" fi # Configura .env per produzione if [ ! -f ".env" ] && [ -f ".env.example" ]; then cp .env.example .env fi # Aggiorna configurazione .env cat > .env << 'ENV_CONFIG' APP_NAME="NetGescon Master" APP_ENV=production APP_KEY= APP_DEBUG=false APP_URL=http://192.168.0.200 LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=error DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=netgescon DB_USERNAME=netgescon DB_PASSWORD=netgescon2025 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}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_HOST= PUSHER_PORT=443 PUSHER_SCHEME=https PUSHER_APP_CLUSTER=mt1 VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" VITE_PUSHER_HOST="${PUSHER_HOST}" VITE_PUSHER_PORT="${PUSHER_PORT}" VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" ENV_CONFIG # Genera chiave app php artisan key:generate --force # Ottimizza per produzione php artisan config:cache php artisan route:cache php artisan view:cache # Permessi corretti sudo chown -R www-data:www-data $PROJECT_PATH/netgescon-laravel/storage sudo chown -R www-data:www-data $PROJECT_PATH/netgescon-laravel/bootstrap/cache sudo chmod -R 775 $PROJECT_PATH/netgescon-laravel/storage sudo chmod -R 775 $PROJECT_PATH/netgescon-laravel/bootstrap/cache echo " โœ… Laravel configurato per produzione" # Esegui migrazioni if [ -f "artisan" ]; then php artisan migrate --force echo " โœ… Migrazioni database eseguite" fi # === 7. INSTALLAZIONE DOCKER E GITEA === echo "" echo "๐Ÿณ 7. Installazione Docker e Gitea..." # Installa Docker if ! command -v docker &> /dev/null; then curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker michele rm get-docker.sh fi # Crea directory per Gitea sudo mkdir -p /var/lib/gitea sudo chown -R 1000:1000 /var/lib/gitea # Avvia Gitea sudo docker run -d \ --name=gitea \ --restart=unless-stopped \ -p 3000:3000 \ -p 2222:22 \ -v /var/lib/gitea:/data \ -e USER_UID=1000 \ -e USER_GID=1000 \ -e GITEA__database__DB_TYPE=sqlite3 \ -e GITEA__database__PATH=/data/gitea/gitea.db \ -e GITEA__server__DOMAIN=git.netgescon.local \ -e GITEA__server__SSH_DOMAIN=git.netgescon.local \ -e GITEA__server__ROOT_URL=http://$VM_IP:3000/ \ gitea/gitea:1.21.0 echo " โœ… Gitea installato e avviato" # === 8. CONFIGURAZIONE FIREWALL === echo "" echo "๐Ÿ”ฅ 8. Configurazione firewall..." sudo ufw allow ssh sudo ufw allow 80/tcp sudo ufw allow 3000/tcp sudo ufw allow 2222/tcp sudo ufw --force enable echo " โœ… Firewall configurato" # === 9. CONFIGURAZIONE GIT === echo "" echo "๐Ÿ”ง 9. Configurazione Git repository..." cd $PROJECT_PATH # Configura Git git config --global user.name "NetGescon VM Master" git config --global user.email "master@netgescon.local" # Se non รจ un repository, inizializza if [ ! -d ".git" ]; then git init git add . git commit -m "๐Ÿš€ NetGescon Master VM - Setup completo con Nginx ๐Ÿ“‹ Configurazione definitiva: โœ… Nginx + PHP-FPM ottimizzato per Laravel โœ… MySQL database configurato โœ… Gitea server pronto โœ… Firewall e sicurezza โœ… Struttura progetto: $(du -sh . | cut -f1) ๐Ÿ“… $(date '+%Y-%m-%d %H:%M:%S') ๐ŸŽฏ Sistema pronto per sviluppo enterprise" echo " โœ… Repository Git inizializzato" fi # === 10. RIEPILOGO FINALE === echo "" echo "๐Ÿ“Š === RIEPILOGO SETUP VM MASTER ===" echo "โœ… Sistema aggiornato" echo "โœ… Nginx + PHP-FPM installato (performance ottimali)" echo "โœ… MySQL database configurato" echo "โœ… Laravel ottimizzato per produzione" echo "โœ… Gitea server operativo" echo "โœ… Firewall configurato" echo "โœ… Git repository pronto" echo "" echo "๐Ÿ“‹ === INFORMAZIONI ACCESSO ===" echo "๐ŸŒ NetGescon: http://$VM_IP" echo "๐Ÿข Gitea: http://$VM_IP:3000" echo "๐Ÿ“‚ Progetto: $PROJECT_PATH" echo "๐Ÿ’พ Spazio occupato: $(du -sh $PROJECT_PATH | cut -f1)" echo "๐Ÿ’ฝ Spazio disponibile: $(df -h / | tail -1 | awk '{print $4}')" echo "" echo "๐Ÿ”„ === STATUS SERVIZI ===" echo "Nginx: $(systemctl is-active nginx)" echo "MySQL: $(systemctl is-active mysql)" echo "PHP-FPM: $(systemctl is-active php8.1-fpm)" echo "Docker: $(systemctl is-active docker)" echo "Gitea: $(docker ps --filter name=gitea --format "{{.Status}}" | head -1 || echo 'Starting...')" echo "" echo "๐Ÿ“‹ === PROSSIMI PASSI ===" echo "1. ๐ŸŒ Testare NetGescon: http://$VM_IP" echo "2. ๐Ÿข Configurare Gitea: http://$VM_IP:3000" echo "3. ๐Ÿ“ฆ Creare repository in Gitea" echo "4. ๐Ÿ”„ Push codice da locale a Gitea" echo "5. ๐Ÿš€ Iniziare sviluppo su VM Linux nativa" echo "" echo "๐ŸŽฏ Setup VM Master completato con successo!" echo "๐Ÿ“… $(date '+%Y-%m-%d %H:%M:%S')"