390 lines
10 KiB
Bash
390 lines
10 KiB
Bash
#!/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')"
|