#!/bin/bash set -euo pipefail NAME="${APP_NAME:-glastree}" VERSION="$(date +%Y%m%d_%H%M)" ARCHIVE="${NAME}-${VERSION}.tar.gz" echo "==> Installazione dipendenze PHP production..." composer install --no-dev --optimize-autoloader --no-scripts --quiet echo " OK" echo "==> Build asset Vite..." if [ -f "node_modules/.package-lock.json" ] || [ -d "node_modules" ]; then npm run build --quiet 2>/dev/null && echo " OK" || echo " (skip — node_modules non presente)" else echo " (skip — node_modules assente, build Vite non eseguita)" fi echo "==> Pulizia cache..." rm -rf bootstrap/cache/*.php storage/framework/cache/data/* storage/framework/sessions/* storage/framework/views/* storage/logs/* 2>/dev/null || true echo " OK" echo "==> Generazione post-deploy.sh..." cat > post-deploy.sh << 'POSTDEPLOY' #!/bin/bash # post-deploy.sh — Generated by build-dist.sh # Usage: bash post-deploy.sh {check|upgrade|install} [--yes] set -u APP_DIR="$(cd "$(dirname "$0")" && pwd)" ARTISAN="php ${APP_DIR}/artisan" DIAGNOSE="php ${APP_DIR}/diagnose.php" RED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m' CYAN='\033[36m'; BOLD='\033[1m'; NC='\033[0m' MODE="${1:-check}" BATCH=false; [ "${2:-}" = "--yes" ] && BATCH=true echo -e "${CYAN}${BOLD}============================================${NC}" echo -e "${CYAN}${BOLD} Glastree Post-Deploy — ${MODE}${NC}" echo -e "${CYAN}${BOLD}============================================${NC}" echo "" IS_FRESH=false; [ ! -f "${APP_DIR}/.env" ] && IS_FRESH=true log() { echo -e " ${BOLD}$1${NC}"; } ok() { echo -e " ${GREEN}✅ $1${NC}"; } warn() { echo -e " ${YELLOW}⚠ $1${NC}"; } fail() { echo -e " ${RED}❌ $1${NC}"; } check_artisan() { if [ ! -f "${APP_DIR}/artisan" ]; then fail "artisan non trovato. Esegui da root dell'applicazione." exit 1 fi } run_step() { local step="$1" desc="$2"; shift 2 log "${step} ${desc}" if "$@" 2>&1 | sed 's/^/ /'; then ok "${desc}" return 0 else local rc=$? fail "${desc} — exit code ${rc}" return ${rc} fi } run_diagnose() { if ${DIAGNOSE} 2>&1 | tail -5; then ok "Diagnostica OK" else warn "Diagnostica ha rilevato problemi (non bloccante)" fi } run_check() { echo -e "${YELLOW}═══════════ CONTROLLO ═══════════${NC}" ; echo "" echo -e "${BOLD}[0] Diagnostica sistema${NC}" run_diagnose ; echo "" echo -e "${BOLD}[1] Ambiente${NC}" if $IS_FRESH; then warn ".env non trovato — fresh install necessario" else ok ".env presente" fi ; echo "" echo -e "${BOLD}[2] Migration pendenti${NC}" if [ -f "${APP_DIR}/artisan" ]; then $ARTISAN migrate:status 2>&1 | grep -E '(Pending|Ran)' | head -5 || true PENDING=$(php -r "echo trim(shell_exec('${ARTISAN} migrate:status 2>&1 | grep -c Pending || true'));" 2>/dev/null || echo "0") if [ "${PENDING:-0}" -gt 0 ] 2>/dev/null; then warn "${PENDING} migration da eseguire" else ok "Nessuna migration pendente" fi else warn "artisan non disponibile — skip migration check" fi ; echo "" echo -e "${BOLD}[3] Storage & Permessi${NC}" for d in storage/framework/cache/data storage/framework/sessions \ storage/framework/views storage/logs bootstrap/cache \ storage/app/public storage/app/backups; do p="${APP_DIR}/${d}" if [ -d "$p" ]; then [ -w "$p" ] && ok "${d}" || warn "${d} — non scrivibile" else warn "${d} — mancante" fi done ; echo "" echo -e "${BOLD}[4] Symlink storage${NC}" if [ -L "${APP_DIR}/public/storage" ]; then ok "public/storage → $(readlink "${APP_DIR}/public/storage")" else warn "public/storage non presente" fi ; echo "" echo -e "${BOLD}[5] Cache${NC}" for d in bootstrap/cache storage/framework/cache/data \ storage/framework/sessions storage/framework/views; do c=$(find "${APP_DIR}/${d}" -type f 2>/dev/null | wc -l) [ "$c" -gt 0 ] && warn "${d}: ${c} file" || ok "${d}: vuoto" done echo "" ; echo -e "${YELLOW}═══════════ FINE CONTROLLO ═══════════${NC}" } run_upgrade() { echo -e "${YELLOW}═══════════ UPGRADE ═══════════${NC}" ; check_artisan run_step "[1/9]" "Directory storage" mkdir -p \ "${APP_DIR}/storage/framework/cache/data" \ "${APP_DIR}/storage/framework/sessions" \ "${APP_DIR}/storage/framework/views" \ "${APP_DIR}/storage/logs" "${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/storage/app/public" \ "${APP_DIR}/storage/app/public/logos" \ "${APP_DIR}/storage/app/public/documenti/eventi" \ "${APP_DIR}/storage/app/backups" \ "${APP_DIR}/storage/app/documenti" \ "${APP_DIR}/storage/app/private/avatars/gruppi" || true run_step "[2/9]" ".gitignore storage" bash -c \ "echo '*'>'${APP_DIR}/storage/app/public/.gitignore'; echo '!.gitignore'>>'${APP_DIR}/storage/app/public/.gitignore'" || true run_step "[3/9]" "Permessi" chmod -R 775 \ "${APP_DIR}/storage" "${APP_DIR}/bootstrap/cache" || true run_step "[4/9]" "Symlink storage" bash -c \ "rm -f '${APP_DIR}/public/storage'; ln -sf '../storage/app/public' '${APP_DIR}/public/storage'" || true run_step "[5/10]" "Migrazioni DB" $ARTISAN migrate --force || true run_step "[6/10]" "Seed diocesi" $ARTISAN db:seed --class=DiocesiSeeder --force || true run_step "[7/10]" "Dump autoload" composer dump-autoload --no-dev --optimize || true run_step "[8/10]" "Key generate" $ARTISAN key:generate --force || true run_step "[9/10]" "Pulizia cache" bash -c \ "$ARTISAN config:clear && $ARTISAN route:clear && $ARTISAN view:clear" || true run_step "[10/10]" "Verifica finale" $DIAGNOSE || true echo "" ; echo -e "${GREEN}${BOLD}✅ Upgrade completato.${NC}" } run_install() { echo -e "${YELLOW}═══════════ INSTALL (fresh) ═══════════${NC}" ; check_artisan run_step "[1/10]" "Directory storage" mkdir -p \ "${APP_DIR}/storage/framework/cache/data" \ "${APP_DIR}/storage/framework/sessions" \ "${APP_DIR}/storage/framework/views" \ "${APP_DIR}/storage/logs" "${APP_DIR}/bootstrap/cache" \ "${APP_DIR}/storage/app/public" \ "${APP_DIR}/storage/app/public/logos" \ "${APP_DIR}/storage/app/public/documenti/eventi" \ "${APP_DIR}/storage/app/backups" \ "${APP_DIR}/storage/app/documenti" \ "${APP_DIR}/storage/app/private/avatars/gruppi" || true run_step "[2/10]" ".gitignore storage" bash -c \ "echo '*'>'${APP_DIR}/storage/app/public/.gitignore'; echo '!.gitignore'>>'${APP_DIR}/storage/app/public/.gitignore'" || true run_step "[3/10]" "Permessi" chmod -R 775 \ "${APP_DIR}/storage" "${APP_DIR}/bootstrap/cache" || true run_step "[4/10]" "File .env" cp "${APP_DIR}/.env.example" "${APP_DIR}/.env" || true warn "MODIFICA .env con i tuoi dati DB/URL prima di proseguire" if ! $BATCH; then read -p " Fatto? (Invio per continuare) " _; fi run_step "[5/10]" "Symlink storage" bash -c \ "rm -f '${APP_DIR}/public/storage'; ln -sf '../storage/app/public' '${APP_DIR}/public/storage'" || true run_step "[6/10]" "Dump autoload" composer dump-autoload --no-dev --optimize || true run_step "[7/10]" "Key generate" $ARTISAN key:generate --force || true run_step "[8/11]" "Migrazioni DB" $ARTISAN migrate --force || true run_step "[9/11]" "Seed diocesi" $ARTISAN db:seed --class=DiocesiSeeder --force || true run_step "[10/11]" "Pulizia cache" bash -c \ "$ARTISAN config:clear && $ARTISAN route:clear && $ARTISAN view:clear" || true run_step "[11/11]" "Verifica finale" $DIAGNOSE || true echo "" ; echo -e "${GREEN}${BOLD}✅ Installazione completata.${NC}" } case "$MODE" in check) run_check ;; upgrade) run_check ; echo "" if $BATCH; then run_upgrade else read -p "Procedere con l'upgrade? (s/N) " c [ "$c" = "s" ] || [ "$c" = "S" ] && run_upgrade || echo "Annullato." fi ;; install) run_install ;; *) echo "Uso: bash post-deploy.sh {check|upgrade|install} [--yes]" echo " check — diagnostica (nessuna modifica)" echo " upgrade — aggiorna installazione esistente" echo " install — fresh install" echo " --yes — batch (nessuna conferma)" exit 1 ;; esac POSTDEPLOY chmod +x post-deploy.sh echo " OK" echo "==> Creazione archivio: ${ARCHIVE}" tar czf "${ARCHIVE}" \ --exclude='.git' \ --exclude='.gitignore' \ --exclude='.env' \ --exclude='.env.example' \ --exclude='node_modules' \ --exclude='tests' \ --exclude='vendor/bin' \ --exclude='vendor/*/tests' \ --exclude='vendor/*/test' \ --exclude='vendor/*/.git' \ --exclude='vendor/*/docs' \ --exclude='vendor/*/doc' \ --exclude='storage/app/backups' \ --exclude='storage/app/documenti' \ --exclude='storage/app/public' \ --exclude='storage/app/private' \ --exclude='public/storage' \ --exclude='storage/framework/cache/*' \ --exclude='storage/framework/sessions/*' \ --exclude='storage/framework/views/*' \ --exclude='storage/logs/*' \ --exclude='storage/debugbar/*' \ --exclude='bootstrap/cache/*.php' \ --exclude='public/hot' \ --exclude='*.tar.gz' \ --exclude='*.tar' \ --exclude='MEMORY.md' \ --exclude='AGENTS.md' \ --exclude='build-dist.sh' \ --exclude='Dockerfile' \ --exclude='docker-compose.yml' \ --exclude='docker-compose.mysql.yml' \ --exclude='docker-entrypoint.sh' \ --exclude='.dockerignore' \ --warning=no-file-changed \ . rm -f post-deploy.sh echo "" echo "============================================" echo " Archivio creato: ${ARCHIVE}" echo " Dimensione: $(du -h "${ARCHIVE}" | cut -f1)" echo "============================================" echo "" echo "Per estrarre sul server di destinazione:" echo " tar xzf ${ARCHIVE}" echo "" echo "Poi esegui:" echo " # Upgrade di un'installazione esistente:" echo " bash post-deploy.sh upgrade" echo "" echo " # Fresh install:" echo " bash post-deploy.sh install" echo "" echo " # Solo controllo (nessuna modifica):" echo " bash post-deploy.sh check" echo "" echo " # Batch mode (nessuna conferma):" echo " bash post-deploy.sh upgrade --yes"