#!/bin/bash # ───────────────────────────────────────────────────────────────────────────── # Entrypoint: eseguito ad ogni avvio del container. # Si occupa di preparare l'applicazione la prima volta e ad ogni restart. # ───────────────────────────────────────────────────────────────────────────── set -e # Interrompi se un comando fallisce echo "────────────────────────────────────────" echo " Avvio Portale Clienti" echo "────────────────────────────────────────" # ───────────────────────────────────────────── # 1. Installa le dipendenze PHP con Composer # --no-interaction → niente domande interattive # --optimize-autoloader → più veloce in produzione # ───────────────────────────────────────────── if [ ! -d "vendor" ]; then echo "→ vendor/ non trovata. Eseguo composer install..." composer install --no-interaction --optimize-autoloader else echo "→ vendor/ già presente. Salto composer install." fi # ───────────────────────────────────────────── # 2. Genera APP_KEY se non è impostata # La chiave è usata per cifrare sessioni e cookie. # ───────────────────────────────────────────── if grep -q "^APP_KEY=$" .env 2>/dev/null || ! grep -q "^APP_KEY=" .env 2>/dev/null; then echo "→ APP_KEY non trovata. La genero..." php artisan key:generate --no-interaction else echo "→ APP_KEY già impostata." fi # ───────────────────────────────────────────── # 3. Permessi sulle cartelle di storage # Laravel deve poter scrivere qui (log, cache, sessioni…) # ───────────────────────────────────────────── echo "→ Imposto permessi su storage/ e bootstrap/cache/" chmod -R 775 storage bootstrap/cache # ───────────────────────────────────────────── # 4. Crea il link symbolico storage → public/storage # Necessario per servire file caricati dall'utente # ───────────────────────────────────────────── if [ ! -L "public/storage" ]; then echo "→ Creo symlink public/storage → storage/app/public" php artisan storage:link --no-interaction fi # ───────────────────────────────────────────── # 5. Attende che il database sia pronto # MySQL impiega qualche secondo ad avviarsi. # ───────────────────────────────────────────── echo "→ Attendo che il database sia disponibile..." MAX_TRIES=30 TRIES=0 until php artisan db:monitor 2>/dev/null || [ $TRIES -ge $MAX_TRIES ]; do echo " Database non pronto, riprovo tra 2s... ($((TRIES+1))/$MAX_TRIES)" sleep 2 TRIES=$((TRIES+1)) done if [ $TRIES -ge $MAX_TRIES ]; then echo "⚠ Database non raggiungibile dopo $MAX_TRIES tentativi." echo " Continuo comunque (potresti essere in modalità manutenzione)." fi # ───────────────────────────────────────────── # 6. Esegui le migration # --force → necessario in ambiente non-TTY (es. Docker) # Le migration vengono eseguite solo se ci sono nuove # ───────────────────────────────────────────── echo "→ Eseguo le migration del database..." php artisan migrate --force --no-interaction # ───────────────────────────────────────────── # 7. Esegui i seeder solo al primo avvio # Controlla se la tabella settings è vuota # ───────────────────────────────────────────── SETTINGS_COUNT=$(php artisan tinker --execute="echo \App\Models\Setting::count();" 2>/dev/null | tail -1 || echo "0") if [ "$SETTINGS_COUNT" = "0" ]; then echo "→ Tabella settings vuota. Eseguo i seeder..." php artisan db:seed --force --no-interaction else echo "→ Dati già presenti. Salto i seeder." fi # ───────────────────────────────────────────── # 8. Ottimizzazioni (cache config, routes, views) # In development potrebbe essere più utile saltare questo, # in produzione invece migliora le performance. # ───────────────────────────────────────────── if [ "${APP_ENV}" = "production" ]; then echo "→ Ambiente produzione: ottimizzazione cache..." php artisan config:cache php artisan route:cache php artisan view:cache else echo "→ Ambiente development: svuoto cache esistente..." php artisan config:clear php artisan route:clear php artisan view:clear fi echo "────────────────────────────────────────" echo " Portale Clienti pronto!" echo " URL: http://localhost:${NGINX_PORT:-8080}" echo "────────────────────────────────────────" # Avvia il processo principale (php-fpm) exec "$@"