303 lines
10 KiB
Bash
Executable File
303 lines
10 KiB
Bash
Executable File
#!/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"
|