#!/bin/bash # Avvia l'ambiente di sviluppo completo (vedi docs/AVVIO_LOCALE.md). Un solo server, Laravel su # http://localhost:8000, che serve API, admin e i due frontend compilati in backoffice/public: # - configuratore 3D -> http://localhost:8000/configuratore/ # - app cliente (preventivo) -> http://localhost:8000/preventivo/ # I frontend sono ricompilati a ogni modifica (vite build --watch): ricaricare la pagina per vederle. # Ctrl+C ferma tutti i servizi. set -euo pipefail ROOT="$(cd "$(dirname "$0")" && pwd)" BACKOFFICE="$ROOT/backoffice" CLIENTE="$BACKOFFICE/cliente" port_in_use() { lsof -nP -iTCP:"$1" -sTCP:LISTEN >/dev/null 2>&1; } # --- Controlli preliminari --------------------------------------------------- for cmd in php npx lsof; do command -v "$cmd" >/dev/null || { echo "Errore: '$cmd' non trovato nel PATH." >&2; exit 1; } done if ! port_in_use 3306; then echo "Errore: MySQL non risponde sulla porta 3306. Avvialo (es. da Herd) e riprova." >&2 exit 1 fi for port in 8000; do if port_in_use "$port"; then echo "Errore: la porta $port è già occupata:" >&2 lsof -nP -iTCP:"$port" -sTCP:LISTEN >&2 exit 1 fi done [ -d "$BACKOFFICE/vendor" ] || (cd "$BACKOFFICE" && composer install) # Stessa versione di pnpm di build.sh (formato dei pnpm-lock.yaml). PNPM=(npx --yes pnpm@10.34.7) for dir in "$ROOT" "$CLIENTE"; do (cd "$dir" && "${PNPM[@]}" install --frozen-lockfile --config.confirmModulesPurge=false) done # --- Avvio servizi ----------------------------------------------------------- PIDS=() # Termina un processo e tutti i suoi discendenti (pnpm -> vite, artisan serve -> php -S). kill_tree() { local child for child in $(pgrep -P "$1" 2>/dev/null); do kill_tree "$child"; done kill -TERM "$1" 2>/dev/null || true } cleanup() { trap - INT TERM EXIT echo echo "Arresto dei servizi..." for pid in "${PIDS[@]}"; do kill_tree "$pid"; done wait 2>/dev/null || true } trap cleanup EXIT trap 'exit 0' INT TERM # Esegue un comando in una cartella prefissando ogni riga di output con un'etichetta. run() { local label="$1" dir="$2"; shift 2 (cd "$dir" && exec "$@") > >(sed -u "s/^/[$label] /") 2>&1 & PIDS+=($!) } run "laravel" "$BACKOFFICE" php artisan serve --port=8000 run "cliente" "$CLIENTE" "${PNPM[@]}" build --watch run "config " "$ROOT" "${PNPM[@]}" build --watch cat </dev/null; then echo "Un servizio si è fermato, arresto degli altri." >&2 exit 1 fi done sleep 1 done