Version 1.0.1 - add install.sh
This commit is contained in:
Executable
+428
@@ -0,0 +1,428 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# Glastree — Installer interattivo per amministratori
|
||||||
|
# Richiede: bash 4+, curl, git (opzionale), composer,
|
||||||
|
# php 8.3+, node 20+, npm 10+, mysql (opz.)
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
||||||
|
CYAN='\033[0;36m'; NC='\033[0m'
|
||||||
|
|
||||||
|
info() { echo -e "${CYAN}[INFO]${NC} $*"; }
|
||||||
|
ok() { echo -e "${GREEN}[OK]${NC} $*"; }
|
||||||
|
warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
|
||||||
|
error() { echo -e "${RED}[ERR]${NC} $*"; }
|
||||||
|
|
||||||
|
fail() { error "$*"; exit 1; }
|
||||||
|
|
||||||
|
ask() {
|
||||||
|
local prompt="$1" var_name="$2" default="${3:-}"
|
||||||
|
local val
|
||||||
|
if [ -n "$default" ]; then
|
||||||
|
read -r -p "$(echo -e "${CYAN}?${NC} ${prompt} [${default}]: ")" val
|
||||||
|
val="${val:-$default}"
|
||||||
|
else
|
||||||
|
read -r -p "$(echo -e "${CYAN}?${NC} ${prompt}: ")" val
|
||||||
|
fi
|
||||||
|
printf -v "$var_name" '%s' "$val"
|
||||||
|
}
|
||||||
|
|
||||||
|
ask_required() {
|
||||||
|
local prompt="$1" var_name="$2"
|
||||||
|
local val
|
||||||
|
while true; do
|
||||||
|
read -r -p "$(echo -e "${CYAN}?${NC} ${prompt}: ")" val
|
||||||
|
[ -n "$val" ] && break
|
||||||
|
warn "Valore obbligatorio."
|
||||||
|
done
|
||||||
|
printf -v "$var_name" '%s' "$val"
|
||||||
|
}
|
||||||
|
|
||||||
|
confirm() {
|
||||||
|
local prompt="$1"
|
||||||
|
local resp
|
||||||
|
read -r -p "$(echo -e "${CYAN}?${NC} ${prompt} [S/n]: ")" resp
|
||||||
|
[[ "$resp" =~ ^[Ss]?$ ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
check_cmds() {
|
||||||
|
local missing=()
|
||||||
|
for c in "$@"; do
|
||||||
|
command -v "$c" &>/dev/null || missing+=("$c")
|
||||||
|
done
|
||||||
|
[ ${#missing[@]} -gt 0 ] && fail "Comandi mancanti: ${missing[*]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
print_banner() {
|
||||||
|
cat << 'EOF'
|
||||||
|
____ _ _ _
|
||||||
|
/ ___| | __ _ ___| |_ ___ _ __ ___ | |_ ___
|
||||||
|
| | _| |/ _` / __| __/ _ \ '__/ _ \ | __/ _ \
|
||||||
|
| |_| | | (_| \__ \ || __/ | | __/ | || __/
|
||||||
|
\____|_|\__,_|___/\__\___|_| \___| \__\___|
|
||||||
|
|
||||||
|
Installer interattivo per sysadmin
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# PREFLIGHT
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
print_banner
|
||||||
|
|
||||||
|
# Directory dello script
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
cd "$SCRIPT_DIR"
|
||||||
|
|
||||||
|
# Rileva modalità
|
||||||
|
echo ""
|
||||||
|
echo "Seleziona la modalità di installazione:"
|
||||||
|
echo " 1) Fresh Install su Apache (LAMP tradizionale)"
|
||||||
|
echo " 2) Fresh Install via Docker"
|
||||||
|
echo " 3) Restore da Backup (Apache)"
|
||||||
|
ask "Scegli [1/2/3]" INSTALL_MODE "1"
|
||||||
|
|
||||||
|
case "$INSTALL_MODE" in
|
||||||
|
1) MODE="apache" ;;
|
||||||
|
2) MODE="docker" ;;
|
||||||
|
3) MODE="restore" ;;
|
||||||
|
*) fail "Scelta non valida: $INSTALL_MODE" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# PARAMETRI COMUNI
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " PARAMETRI GENERALI"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
ask_required "Nome del sito/app (es. Glastree MyChurch)" APP_NAME
|
||||||
|
ask_required "Nome del primo utente amministratore" ADMIN_NAME
|
||||||
|
ask_required "Email dell'amministratore" ADMIN_EMAIL
|
||||||
|
ask_required "Password per l'amministratore" ADMIN_PASSWORD
|
||||||
|
ask_required "URL pubblico del sito (es. https://glastree.esempio.it)" APP_URL
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# APACHE
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
if [ "$MODE" = "apache" ] || [ "$MODE" = "restore" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " DATABASE"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
ask "Tipo database" DB_TYPE "mysql" # mysql|sqlite
|
||||||
|
|
||||||
|
if [ "$DB_TYPE" = "mysql" ]; then
|
||||||
|
ask_required "Host database" DB_HOST
|
||||||
|
ask "Porta database" DB_PORT "3306"
|
||||||
|
ask_required "Nome database (verrà creato se non esiste)" DB_NAME
|
||||||
|
ask_required "Utente database" DB_USER
|
||||||
|
ask_required "Password database" DB_PASS
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# APACHE — FRESH INSTALL
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
if [ "$MODE" = "apache" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " PRE-FLIGHT CHECKS (Apache)"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
check_cmds php composer node npm
|
||||||
|
|
||||||
|
PHP_VER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
|
||||||
|
info "PHP versione: $PHP_VER"
|
||||||
|
if php -r 'exit(version_compare(PHP_VERSION, "8.3.0") ? 0 : 1);' 2>/dev/null; then
|
||||||
|
fail "PHP >= 8.3 richiesto (trovato $PHP_VER)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for ext in pdo_mysql mbstring xml curl zip gd fileinfo; do
|
||||||
|
php -m | grep -qi "$ext" || warn "Estensione PHP '$ext' non trovata"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " INSTALLAZIONE APACHE"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
info "Percorso installazione: $SCRIPT_DIR"
|
||||||
|
|
||||||
|
# 1. Ambiente
|
||||||
|
[ ! -f .env ] && cp .env.example .env
|
||||||
|
"$SCRIPT_DIR"/artisan key:generate --force
|
||||||
|
|
||||||
|
# 2. Config .env
|
||||||
|
sed -i "s|APP_NAME=.*|APP_NAME=\"$APP_NAME\"|" .env
|
||||||
|
sed -i "s|APP_URL=.*|APP_URL=$APP_URL|" .env
|
||||||
|
sed -i "s|APP_ENV=.*|APP_ENV=production|" .env
|
||||||
|
sed -i "s|APP_DEBUG=.*|APP_DEBUG=false|" .env
|
||||||
|
|
||||||
|
if [ "$DB_TYPE" = "mysql" ]; then
|
||||||
|
sed -i "s/DB_CONNECTION=.*/DB_CONNECTION=mysql/" .env
|
||||||
|
sed -i "s/DB_HOST=.*/DB_HOST=$DB_HOST/" .env
|
||||||
|
sed -i "s/DB_PORT=.*/DB_PORT=$DB_PORT/" .env
|
||||||
|
sed -i "s/DB_DATABASE=.*/DB_DATABASE=$DB_NAME/" .env
|
||||||
|
sed -i "s/DB_USERNAME=.*/DB_USERNAME=$DB_USER/" .env
|
||||||
|
sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=$DB_PASS/" .env
|
||||||
|
|
||||||
|
info "Attendo MySQL..."
|
||||||
|
php -r "
|
||||||
|
\$start = time();
|
||||||
|
while (time() - \$start < 60) {
|
||||||
|
try {
|
||||||
|
new PDO('mysql:host=$DB_HOST;port=$DB_PORT', '$DB_USER', '$DB_PASS');
|
||||||
|
exit(0);
|
||||||
|
} catch (\PDOException \$e) {
|
||||||
|
sleep(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit(1);
|
||||||
|
" && ok "MySQL pronto" || warn "Timeout MySQL — continuo comunque"
|
||||||
|
|
||||||
|
php "$SCRIPT_DIR"/artisan config:clear 2>/dev/null || true
|
||||||
|
else
|
||||||
|
sed -i "s/DB_CONNECTION=.*/DB_CONNECTION=sqlite/" .env
|
||||||
|
touch database/database.sqlite
|
||||||
|
chmod 664 database/database.sqlite
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Composer
|
||||||
|
info "Installazione dipendenze Composer..."
|
||||||
|
composer install --no-dev --optimize-autoloader --no-scripts
|
||||||
|
|
||||||
|
# 4. Migration + seed
|
||||||
|
info "Esecuzione migration e seed..."
|
||||||
|
php "$SCRIPT_DIR"/artisan migrate --seed --force
|
||||||
|
|
||||||
|
# 5. Storage link
|
||||||
|
php "$SCRIPT_DIR"/artisan storage:link --force 2>/dev/null || true
|
||||||
|
|
||||||
|
# 6. Crea admin
|
||||||
|
info "Creazione utente amministratore..."
|
||||||
|
php "$SCRIPT_DIR"/artisan tinker --execute="
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = '$ADMIN_NAME';
|
||||||
|
\$u->email = '$ADMIN_EMAIL';
|
||||||
|
\$u->password = bcrypt('$ADMIN_PASSWORD');
|
||||||
|
\$u->save();
|
||||||
|
" 2>/dev/null
|
||||||
|
|
||||||
|
# 7. Asset
|
||||||
|
if command -v npm &>/dev/null; then
|
||||||
|
info "Compilazione asset frontend..."
|
||||||
|
npm ci --ignore-scripts 2>/dev/null && npm run build
|
||||||
|
else
|
||||||
|
warn "npm non trovato — asset non compilati (usa AdminLTE via CDN)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8. Permessi
|
||||||
|
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || warn "chown fallito — esegui manualmente: chown -R www-data:www-data storage bootstrap/cache"
|
||||||
|
chmod -R 775 storage bootstrap/cache
|
||||||
|
|
||||||
|
ok "Installazione Apache completata!"
|
||||||
|
echo ""
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo " URL: $APP_URL"
|
||||||
|
echo " Admin: $ADMIN_EMAIL"
|
||||||
|
echo " Cartella: $SCRIPT_DIR"
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo ""
|
||||||
|
warn "Configura Apache con il VirtualHost che trovi nella Guida → Installazione."
|
||||||
|
warn "Se hai appena creato il database MySQL, assicurati che l'utente abbia privilegi CREATE."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# DOCKER
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
if [ "$MODE" = "docker" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " PRE-FLIGHT CHECKS (Docker)"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
check_cmds docker
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " CONFIGURAZIONE DOCKER"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
ask "Tipo database per Docker" DOCKER_DB "sqlite"
|
||||||
|
ask "Porta host (es. 8080)" DOCKER_PORT "8080"
|
||||||
|
|
||||||
|
COMPOSE_FILE="docker-compose.yml"
|
||||||
|
[ "$DOCKER_DB" = "mysql" ] && COMPOSE_FILE="docker-compose.mysql.yml"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " INSTALLAZIONE DOCKER"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
|
||||||
|
info "Build immagine Docker..."
|
||||||
|
docker compose -f "$COMPOSE_FILE" build
|
||||||
|
|
||||||
|
# Crea un .env temporaneo per il docker-entrypoint
|
||||||
|
# Il container genera APP_KEY e fa migrate da solo
|
||||||
|
# Ma dobbiamo passare le variabili per admin e app name
|
||||||
|
cat > docker-compose.override.yml << EOF
|
||||||
|
services:
|
||||||
|
glastree:
|
||||||
|
environment:
|
||||||
|
- APP_NAME=$APP_NAME
|
||||||
|
- APP_URL=$APP_URL
|
||||||
|
- APP_ENV=production
|
||||||
|
- APP_DEBUG=false
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Se mysql, la configurazione DB è già nel compose
|
||||||
|
# Se sqlite, non serve override per DB
|
||||||
|
|
||||||
|
info "Avvio container..."
|
||||||
|
docker compose -f "$COMPOSE_FILE" -f docker-compose.override.yml up -d
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
info "Attendo che il container sia pronto..."
|
||||||
|
CONTAINER_NAME=$(docker compose -f "$COMPOSE_FILE" ps -q glastree 2>/dev/null | head -1)
|
||||||
|
if [ -n "$CONTAINER_NAME" ]; then
|
||||||
|
# Attendi che Apache sia in ascolto
|
||||||
|
for i in $(seq 1 30); do
|
||||||
|
docker exec "$CONTAINER_NAME" curl -sf -o /dev/null http://localhost/ 2>/dev/null && break
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Crea utente admin dentro il container
|
||||||
|
info "Creazione utente amministratore nel container..."
|
||||||
|
docker exec -i "$CONTAINER_NAME" php artisan tinker --execute="
|
||||||
|
\App\Models\User::where('email', '$ADMIN_EMAIL')->delete();
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = '$ADMIN_NAME';
|
||||||
|
\$u->email = '$ADMIN_EMAIL';
|
||||||
|
\$u->password = bcrypt('$ADMIN_PASSWORD');
|
||||||
|
\$u->save();
|
||||||
|
" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
rm -f docker-compose.override.yml
|
||||||
|
|
||||||
|
ok "Installazione Docker completata!"
|
||||||
|
echo ""
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo " URL: http://localhost:${DOCKER_PORT}"
|
||||||
|
echo " Admin: $ADMIN_EMAIL"
|
||||||
|
echo " Container: $(docker compose -f "$COMPOSE_FILE" ps -q glastree 2>/dev/null | head -1)"
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo ""
|
||||||
|
warn "Per URL pubblici, imposta APP_URL nelle environment del container."
|
||||||
|
warn "Dati persistenti: volume 'glastree_storage' e 'glastree_db' (sqlite) o 'mysql_data'."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
# RESTORE DA BACKUP (Apache)
|
||||||
|
# ─────────────────────────────────────────────────────
|
||||||
|
if [ "$MODE" = "restore" ]; then
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " PRE-FLIGHT CHECKS (Restore)"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
check_cmds php composer unzip mysql
|
||||||
|
|
||||||
|
ask_required "Percorso del file ZIP di backup" BACKUP_ZIP
|
||||||
|
[ ! -f "$BACKUP_ZIP" ] && fail "File non trovato: $BACKUP_ZIP"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
echo " RESTORE DA BACKUP"
|
||||||
|
echo "══════════════════════════════════════════"
|
||||||
|
|
||||||
|
# Estrai backup in temp
|
||||||
|
TMP_DIR=$(mktemp -d)
|
||||||
|
info "Estrazione backup in $TMP_DIR ..."
|
||||||
|
unzip -q "$BACKUP_ZIP" -d "$TMP_DIR"
|
||||||
|
|
||||||
|
# 1. Ambiente
|
||||||
|
[ ! -f .env ] && cp .env.example .env
|
||||||
|
|
||||||
|
# 2. Ripristina .env dal backup (preservando DB creds)
|
||||||
|
if [ -f "$TMP_DIR/.env" ]; then
|
||||||
|
cp .env .env.backup-pre-restore
|
||||||
|
# Estrai DB_* dal .env corrente
|
||||||
|
for key in DB_CONNECTION DB_HOST DB_PORT DB_DATABASE DB_USERNAME DB_PASSWORD; do
|
||||||
|
current_val=$(grep "^${key}=" .env 2>/dev/null | cut -d= -f2-)
|
||||||
|
[ -n "$current_val" ] && export "CURRENT_${key}=$current_val"
|
||||||
|
done
|
||||||
|
cp "$TMP_DIR/.env" .env
|
||||||
|
# Ripristina le credenziali DB del nuovo server
|
||||||
|
for key in DB_CONNECTION DB_HOST DB_PORT DB_DATABASE DB_USERNAME DB_PASSWORD; do
|
||||||
|
var="CURRENT_${key}"
|
||||||
|
if [ -n "${!var:-}" ]; then
|
||||||
|
sed -i "s|^${key}=.*|${key}=${!var}|" .env
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
ok ".env ripristinato dal backup (credenziali DB preservate)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -i "s|APP_NAME=.*|APP_NAME=\"$APP_NAME\"|" .env
|
||||||
|
sed -i "s|APP_URL=.*|APP_URL=$APP_URL|" .env
|
||||||
|
sed -i "s|APP_ENV=.*|APP_ENV=production|" .env
|
||||||
|
sed -i "s|APP_DEBUG=.*|APP_DEBUG=false|" .env
|
||||||
|
|
||||||
|
# 3. rigenera APP_KEY
|
||||||
|
"$SCRIPT_DIR"/artisan key:generate --force
|
||||||
|
|
||||||
|
# 4. Importa database
|
||||||
|
if [ "$DB_TYPE" = "mysql" ]; then
|
||||||
|
info "Importazione database MySQL..."
|
||||||
|
if [ -f "$TMP_DIR/database.sql" ]; then
|
||||||
|
mysql -h "$DB_HOST" -P "$DB_PORT" -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$TMP_DIR/database.sql"
|
||||||
|
ok "Database importato"
|
||||||
|
else
|
||||||
|
warn "database.sql non trovato nel backup"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "Tipo database non supportato per restore automatico (usa SQLite o importa manualmente)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Ripristina storage
|
||||||
|
if [ -d "$TMP_DIR/storage" ]; then
|
||||||
|
info "Ripristino file storage..."
|
||||||
|
cp -r "$TMP_DIR/storage"/* "$SCRIPT_DIR"/storage/ 2>/dev/null || true
|
||||||
|
ok "Storage ripristinato"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. Composer
|
||||||
|
composer install --no-dev --optimize-autoloader --no-scripts
|
||||||
|
|
||||||
|
# 7. Storage link + cache
|
||||||
|
php "$SCRIPT_DIR"/artisan storage:link --force 2>/dev/null || true
|
||||||
|
php "$SCRIPT_DIR"/artisan optimize:clear
|
||||||
|
|
||||||
|
# 8. Permessi
|
||||||
|
chown -R www-data:www-data storage bootstrap/cache 2>/dev/null || warn "chown fallito"
|
||||||
|
chmod -R 775 storage bootstrap/cache
|
||||||
|
|
||||||
|
# 9. Crea admin se non esiste
|
||||||
|
php "$SCRIPT_DIR"/artisan tinker --execute="
|
||||||
|
\$exists = \App\Models\User::where('email', '$ADMIN_EMAIL')->exists();
|
||||||
|
if (!\$exists) {
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = '$ADMIN_NAME';
|
||||||
|
\$u->email = '$ADMIN_EMAIL';
|
||||||
|
\$u->password = bcrypt('$ADMIN_PASSWORD');
|
||||||
|
\$u->save();
|
||||||
|
}
|
||||||
|
" 2>/dev/null
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -rf "$TMP_DIR"
|
||||||
|
|
||||||
|
ok "Restore completato!"
|
||||||
|
echo ""
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo " URL: $APP_URL"
|
||||||
|
echo " Admin: $ADMIN_EMAIL"
|
||||||
|
echo " Cartella: $SCRIPT_DIR"
|
||||||
|
echo "────────────────────────────────────────────"
|
||||||
|
echo ""
|
||||||
|
warn "Verifica che la APP_KEY non abbia invalidato dati criptati (token OAuth, password IMAP)."
|
||||||
|
warn "Se necessario, riconfigura SMTP e Google Drive dalle Impostazioni."
|
||||||
|
fi
|
||||||
@@ -470,9 +470,8 @@ sudo certbot --apache -d glastree.esempio.it</code></pre>
|
|||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
<h5>PHP Web Installer</h5>
|
<h5>Comandi Artisan</h5>
|
||||||
<p>L'applicazione include un <strong>wizard di installazione web</strong> nella cartella <code>installer/</code>. Questo wizard gestisce sia installazioni fresh che ripristino da backup.</p>
|
<p>Per installazione e ripristino usa i comandi Artisan da terminale. Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
||||||
<p>Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -776,7 +775,7 @@ echo 'Utente creato con successo!';
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>Panoramica</h5>
|
<h5>Panoramica</h5>
|
||||||
<p>l'applicazione include un <strong>wizard di installazione web</strong> che guida passo-passo nella configurazione su un nuovo server LAMP. Supporta due modalita:</p>
|
<p>L'installazione avviene tramite comandi <strong>Artisan</strong> da terminale. Non esiste un wizard web interattivo. Supporta due modalita:</p>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="callout callout-info">
|
<div class="callout callout-info">
|
||||||
@@ -863,54 +862,80 @@ sudo a2dissite 000-default.conf
|
|||||||
sudo a2ensite glastree.conf
|
sudo a2ensite glastree.conf
|
||||||
sudo systemctl reload apache2</code></pre>
|
sudo systemctl reload apache2</code></pre>
|
||||||
|
|
||||||
<h6>Passo 5: Avviare il wizard di installazione</h6>
|
<h6>Passo 5: Configurare l'ambiente</h6>
|
||||||
<p>Apri il browser e visita l'indirizzo del tuo server:</p>
|
<pre><code># Copia il file di configurazione di esempio
|
||||||
<pre><code>http://glastree.esempio.it/installer/</code></pre>
|
cp .env.example .env
|
||||||
|
|
||||||
<p>Il wizard ti guidera attraverso 6 passi:</p>
|
# Genera la chiave di crittografia (obbligatorio)
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
<table class="table table-sm table-bordered">
|
# Modifica .env con i parametri del tuo database:
|
||||||
<thead><tr><th>Passo</th><th>Descrizione</th></tr></thead>
|
# nano .env
|
||||||
<tbody>
|
# DB_DATABASE=glastree
|
||||||
<tr><td>1. Benvenuto</td><td>Scegli Fresh Install o Restore da Backup</td></tr>
|
# DB_USERNAME=glastree
|
||||||
<tr><td>2. Requisiti</td><td>Verifica PHP, estensioni e permessi</td></tr>
|
# DB_PASSWORD=la_tua_password</code></pre>
|
||||||
<tr><td>3. Database</td><td>Configura MySQL (crea nuovo o usa esistente)</td></tr>
|
|
||||||
<tr><td>4. Installazione</td><td>Fresh: migration e seed. Backup: upload ZIP</td></tr>
|
|
||||||
<tr><td>5. Amministratore</td><td>Fresh: crea super-admin. Backup: verifica utenti</td></tr>
|
|
||||||
<tr><td>6. Finalizzazione</td><td>Cache, storage link, auto-eliminazione installer</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="alert alert-warning">
|
<h6>Passo 6: Eseguire l'installazione</h6>
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
<p>Scegli la modalita in base alle tue esigenze:</p>
|
||||||
<strong>Attenzione:</strong> Al termine dell'installazione, la cartella <code>installer/</code> viene <strong>automaticamente eliminata</strong>. Non puoi rieseguire l'installazione se non ricreando manualmente la cartella.
|
|
||||||
|
<h6 class="mt-3"><i class="fas fa-rocket"></i> Fresh Install</h6>
|
||||||
|
<pre><code># Esegui migration e seed dei dati di base
|
||||||
|
php artisan migrate --seed
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link
|
||||||
|
|
||||||
|
# Crea l'utente amministratore
|
||||||
|
php artisan tinker --execute="
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = 'Admin';
|
||||||
|
\$u->email = 'admin@esempio.it';
|
||||||
|
\$u->password = bcrypt('password_sicura');
|
||||||
|
\$u->save();
|
||||||
|
"</code></pre>
|
||||||
|
|
||||||
|
<div class="callout callout-info">
|
||||||
|
<h6><i class="fas fa-info-circle"></i> Dopo l'installazione</h6>
|
||||||
|
<p>Accedi con le credenziali create, vai in <strong>Impostazioni → Generali</strong> per configurare nome app, logo e parametri email.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h5 class="mt-4">Modalita Fresh Install</h5>
|
<h6 class="mt-3"><i class="fas fa-upload"></i> Restore da Backup</h6>
|
||||||
<p>Seleziona questa modalita quando installi l'applicazione per la prima volta su un server.</p>
|
<pre><code># Crea il database e importa il backup
|
||||||
<p>Cosa succede durante l'installazione:</p>
|
# mysql -u root -p glastree < database.sql
|
||||||
|
|
||||||
|
# Ripristina i file dei documenti
|
||||||
|
# tar -xzf storage.tar.gz -C storage/
|
||||||
|
|
||||||
|
# Rigenera APP_KEY (invalida dati criptati esistenti!)
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link</code></pre>
|
||||||
|
|
||||||
|
<div class="callout alert alert-warning">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
|
<strong>Importante:</strong> Il restore da backup richiede che tu abbia un file ZIP generato dalla pagina <strong>Admin → Backup</strong> del server originale. Estrai manualmente il contenuto seguendo la struttura del progetto.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="mt-4">Cosa succede durante l'installazione</h5>
|
||||||
|
<p>I comandi <code>php artisan migrate --seed</code> eseguono:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Genera <code>APP_KEY</code> per la crittografia</li>
|
<li>Genera <code>APP_KEY</code> per la crittografia (gia eseguito al passo 5)</li>
|
||||||
<li>Esegue tutte le migration per creare le tabelle del database</li>
|
<li>Esegue tutte le migration per creare le tabelle del database</li>
|
||||||
<li>Popola i dati di base (diocesi, comuni, ruoli, preset)</li>
|
<li>Popola i dati di base (diocesi, comuni, ruoli, preset)</li>
|
||||||
<li>Crea il collegamento <code>storage → public/storage</code></li>
|
<li>Crea il collegamento <code>storage → public/storage</code></li>
|
||||||
<li>Crea l'utente amministratore con i permessi completi</li>
|
<li>Crea l'utente amministratore con i permessi completi</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h5 class="mt-4">Modalita Restore da Backup</h5>
|
<h5 class="mt-4">Restore da Backup</h5>
|
||||||
<p>Seleziona questa modalita quando vuoi migrare un'installazione esistente su un nuovo server.</p>
|
<p>Il backup ZIP generato dalla pagina <strong>Admin → Backup</strong> contiene un dump SQL e i file dei documenti. Per ripristinare:</p>
|
||||||
<p>Cosa serve:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Un file ZIP generato dalla pagina <strong>Admin → Backup</strong> del server originale</li>
|
<li>Estrai il file ZIP in una cartella temporanea</li>
|
||||||
<li>Il wizard accetta upload diretto del file o un percorso sul server</li>
|
<li>Importa il database dal file SQL (<code>mysql -u root -p glastree < backup/database.sql</code>)</li>
|
||||||
|
<li>Copia i file in <code>storage/app/</code> per ripristinare i documenti</li>
|
||||||
|
<li>Copia il file <code>.env</code> dal backup (modifica le credenziali DB per il nuovo server)</li>
|
||||||
|
<li>Esegui <code>php artisan key:generate</code> se la <code>APP_KEY</code> del backup non è utilizzabile</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Cosa succede durante il restore:</p>
|
|
||||||
<ol>
|
|
||||||
<li>Estrae il file ZIP in una cartella temporanea</li>
|
|
||||||
<li>Importa <code>database.sql</code> nel database MySQL configurato</li>
|
|
||||||
<li>Copia i file documenti in <code>storage/app/documenti/</code></li>
|
|
||||||
<li>Ripristina il file <code>.env</code> dal backup (preservando le credenziali DB del nuovo server)</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h5 class="mt-4">Dopo l'Installazione</h5>
|
<h5 class="mt-4">Dopo l'Installazione</h5>
|
||||||
<ol>
|
<ol>
|
||||||
|
|||||||
@@ -268,7 +268,7 @@
|
|||||||
<h2 id="installazione">5. Guida all'Installazione</h2>
|
<h2 id="installazione">5. Guida all'Installazione</h2>
|
||||||
|
|
||||||
<h3>Panoramica</h3>
|
<h3>Panoramica</h3>
|
||||||
<p>L'applicazione include un <strong>wizard di installazione web</strong> che guida passo-passo nella configurazione su un nuovo server LAMP. Supporta due modalità:</p>
|
<p>L'installazione avviene tramite comandi <strong>Artisan</strong> da terminale. Non esiste un wizard web interattivo. Supporta due modalità:</p>
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<thead><tr><th>Modalità</th><th>Descrizione</th></tr></thead>
|
<thead><tr><th>Modalità</th><th>Descrizione</th></tr></thead>
|
||||||
@@ -343,25 +343,48 @@ sudo a2dissite 000-default.conf
|
|||||||
sudo a2ensite glastree.conf
|
sudo a2ensite glastree.conf
|
||||||
sudo systemctl reload apache2</pre>
|
sudo systemctl reload apache2</pre>
|
||||||
|
|
||||||
<h4>Passo 5: Avviare il wizard di installazione</h4>
|
<h4>Passo 5: Configurare l'ambiente</h4>
|
||||||
<p>Apri il browser e visita: <code>http://glastree.esempio.it/installer/</code></p>
|
<pre># Copia il file di configurazione di esempio
|
||||||
|
cp .env.example .env
|
||||||
|
|
||||||
<p>Il wizard ti guiderà attraverso 6 passi:</p>
|
# Genera la chiave di crittografia (obbligatorio)
|
||||||
<table>
|
php artisan key:generate
|
||||||
<thead><tr><th>Passo</th><th>Descrizione</th></tr></thead>
|
|
||||||
<tbody>
|
|
||||||
<tr><td>1. Benvenuto</td><td>Scegli Fresh Install o Restore da Backup</td></tr>
|
|
||||||
<tr><td>2. Requisiti</td><td>Verifica PHP, estensioni e permessi</td></tr>
|
|
||||||
<tr><td>3. Database</td><td>Configura MySQL (crea nuovo o usa esistente)</td></tr>
|
|
||||||
<tr><td>4. Installazione</td><td>Fresh: migration e seed. Backup: upload ZIP</td></tr>
|
|
||||||
<tr><td>5. Amministratore</td><td>Fresh: crea super-admin. Backup: verifica utenti</td></tr>
|
|
||||||
<tr><td>6. Finalizzazione</td><td>Cache, storage link, auto-eliminazione installer</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="callout callout-warning">
|
# Modifica .env con i parametri del tuo database:
|
||||||
<strong>Attenzione:</strong> Al termine dell'installazione, la cartella <code>installer/</code> viene <strong>automaticamente eliminata</strong>. Non puoi rieseguire l'installazione se non ricreando manualmente la cartella.
|
# nano .env
|
||||||
</div>
|
# DB_DATABASE=glastree
|
||||||
|
# DB_USERNAME=glastree
|
||||||
|
# DB_PASSWORD=la_tua_password</pre>
|
||||||
|
|
||||||
|
<h4>Passo 6: Eseguire l'installazione</h4>
|
||||||
|
<p><strong>Fresh Install:</strong></p>
|
||||||
|
<pre># Esegui migration e seed dei dati di base
|
||||||
|
php artisan migrate --seed
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link
|
||||||
|
|
||||||
|
# Crea l'utente amministratore
|
||||||
|
php artisan tinker --execute="
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = 'Admin';
|
||||||
|
\$u->email = 'admin@esempio.it';
|
||||||
|
\$u->password = bcrypt('password_sicura');
|
||||||
|
\$u->save();
|
||||||
|
"</pre>
|
||||||
|
|
||||||
|
<p><strong>Restore da Backup:</strong></p>
|
||||||
|
<pre># Importa il database
|
||||||
|
# mysql -u root -p glastree < database.sql
|
||||||
|
|
||||||
|
# Ripristina i file dei documenti
|
||||||
|
# tar -xzf storage.tar.gz -C storage/
|
||||||
|
|
||||||
|
# Rigenera APP_KEY
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link</pre>
|
||||||
|
|
||||||
<h3>Modalità Fresh Install</h3>
|
<h3>Modalità Fresh Install</h3>
|
||||||
<p>Seleziona questa modalità quando installi l'applicazione per la prima volta su un server.</p>
|
<p>Seleziona questa modalità quando installi l'applicazione per la prima volta su un server.</p>
|
||||||
@@ -611,9 +634,8 @@ sudo certbot --apache -d glastree.esempio.it</pre>
|
|||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<h3>PHP Web Installer</h3>
|
<h3>Comandi Artisan</h3>
|
||||||
<p>L'applicazione include un <strong>wizard di installazione web</strong> nella cartella <code>installer/</code>. Questo wizard gestisce sia installazioni fresh che ripristino da backup.</p>
|
<p>Per installazione e ripristino usa i comandi Artisan da terminale. Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
||||||
<p>Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
|
||||||
|
|
||||||
<div class="page-break"></div>
|
<div class="page-break"></div>
|
||||||
|
|
||||||
|
|||||||
@@ -468,9 +468,8 @@ sudo certbot --apache -d glastree.esempio.it</code></pre>
|
|||||||
|
|
||||||
<hr class="my-4">
|
<hr class="my-4">
|
||||||
|
|
||||||
<h5>PHP Web Installer</h5>
|
<h5>Comandi Artisan</h5>
|
||||||
<p>L'applicazione include un <strong>wizard di installazione web</strong> nella cartella <code>installer/</code>. Questo wizard gestisce sia installazioni fresh che ripristino da backup.</p>
|
<p>Per installazione e ripristino usa i comandi Artisan da terminale. Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
||||||
<p>Vedi la sezione <strong>Installazione</strong> per la guida completa.</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -774,7 +773,7 @@ echo 'Utente creato con successo!';
|
|||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5>Panoramica</h5>
|
<h5>Panoramica</h5>
|
||||||
<p>l'applicazione include un <strong>wizard di installazione web</strong> che guida passo-passo nella configurazione su un nuovo server LAMP. Supporta due modalita:</p>
|
<p>L'installazione avviene tramite comandi <strong>Artisan</strong> da terminale. Non esiste un wizard web interattivo. Supporta due modalita:</p>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="callout callout-info">
|
<div class="callout callout-info">
|
||||||
@@ -861,54 +860,80 @@ sudo a2dissite 000-default.conf
|
|||||||
sudo a2ensite glastree.conf
|
sudo a2ensite glastree.conf
|
||||||
sudo systemctl reload apache2</code></pre>
|
sudo systemctl reload apache2</code></pre>
|
||||||
|
|
||||||
<h6>Passo 5: Avviare il wizard di installazione</h6>
|
<h6>Passo 5: Configurare l'ambiente</h6>
|
||||||
<p>Apri il browser e visita l'indirizzo del tuo server:</p>
|
<pre><code># Copia il file di configurazione di esempio
|
||||||
<pre><code>http://glastree.esempio.it/installer/</code></pre>
|
cp .env.example .env
|
||||||
|
|
||||||
<p>Il wizard ti guidera attraverso 6 passi:</p>
|
# Genera la chiave di crittografia (obbligatorio)
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
<table class="table table-sm table-bordered">
|
# Modifica .env con i parametri del tuo database:
|
||||||
<thead><tr><th>Passo</th><th>Descrizione</th></tr></thead>
|
# nano .env
|
||||||
<tbody>
|
# DB_DATABASE=glastree
|
||||||
<tr><td>1. Benvenuto</td><td>Scegli Fresh Install o Restore da Backup</td></tr>
|
# DB_USERNAME=glastree
|
||||||
<tr><td>2. Requisiti</td><td>Verifica PHP, estensioni e permessi</td></tr>
|
# DB_PASSWORD=la_tua_password</code></pre>
|
||||||
<tr><td>3. Database</td><td>Configura MySQL (crea nuovo o usa esistente)</td></tr>
|
|
||||||
<tr><td>4. Installazione</td><td>Fresh: migration e seed. Backup: upload ZIP</td></tr>
|
|
||||||
<tr><td>5. Amministratore</td><td>Fresh: crea super-admin. Backup: verifica utenti</td></tr>
|
|
||||||
<tr><td>6. Finalizzazione</td><td>Cache, storage link, auto-eliminazione installer</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div class="alert alert-warning">
|
<h6>Passo 6: Eseguire l'installazione</h6>
|
||||||
<i class="fas fa-exclamation-triangle"></i>
|
<p>Scegli la modalita in base alle tue esigenze:</p>
|
||||||
<strong>Attenzione:</strong> Al termine dell'installazione, la cartella <code>installer/</code> viene <strong>automaticamente eliminata</strong>. Non puoi rieseguire l'installazione se non ricreando manualmente la cartella.
|
|
||||||
|
<h6 class="mt-3"><i class="fas fa-rocket"></i> Fresh Install</h6>
|
||||||
|
<pre><code># Esegui migration e seed dei dati di base
|
||||||
|
php artisan migrate --seed
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link
|
||||||
|
|
||||||
|
# Crea l'utente amministratore
|
||||||
|
php artisan tinker --execute="
|
||||||
|
\$u = new \App\Models\User;
|
||||||
|
\$u->name = 'Admin';
|
||||||
|
\$u->email = 'admin@esempio.it';
|
||||||
|
\$u->password = bcrypt('password_sicura');
|
||||||
|
\$u->save();
|
||||||
|
"</code></pre>
|
||||||
|
|
||||||
|
<div class="callout callout-info">
|
||||||
|
<h6><i class="fas fa-info-circle"></i> Dopo l'installazione</h6>
|
||||||
|
<p>Accedi con le credenziali create, vai in <strong>Impostazioni → Generali</strong> per configurare nome app, logo e parametri email.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h5 class="mt-4">Modalita Fresh Install</h5>
|
<h6 class="mt-3"><i class="fas fa-upload"></i> Restore da Backup</h6>
|
||||||
<p>Seleziona questa modalita quando installi l'applicazione per la prima volta su un server.</p>
|
<pre><code># Crea il database e importa il backup
|
||||||
<p>Cosa succede durante l'installazione:</p>
|
# mysql -u root -p glastree < database.sql
|
||||||
|
|
||||||
|
# Ripristina i file dei documenti
|
||||||
|
# tar -xzf storage.tar.gz -C storage/
|
||||||
|
|
||||||
|
# Rigenera APP_KEY (invalida dati criptati esistenti!)
|
||||||
|
php artisan key:generate
|
||||||
|
|
||||||
|
# Crea il collegamento storage
|
||||||
|
php artisan storage:link</code></pre>
|
||||||
|
|
||||||
|
<div class="callout alert alert-warning">
|
||||||
|
<i class="fas fa-exclamation-triangle"></i>
|
||||||
|
<strong>Importante:</strong> Il restore da backup richiede che tu abbia un file ZIP generato dalla pagina <strong>Admin → Backup</strong> del server originale. Estrai manualmente il contenuto seguendo la struttura del progetto.
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="mt-4">Cosa succede durante l'installazione</h5>
|
||||||
|
<p>I comandi <code>php artisan migrate --seed</code> eseguono:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>Genera <code>APP_KEY</code> per la crittografia</li>
|
<li>Genera <code>APP_KEY</code> per la crittografia (gia eseguito al passo 5)</li>
|
||||||
<li>Esegue tutte le migration per creare le tabelle del database</li>
|
<li>Esegue tutte le migration per creare le tabelle del database</li>
|
||||||
<li>Popola i dati di base (diocesi, comuni, ruoli, preset)</li>
|
<li>Popola i dati di base (diocesi, comuni, ruoli, preset)</li>
|
||||||
<li>Crea il collegamento <code>storage → public/storage</code></li>
|
<li>Crea il collegamento <code>storage → public/storage</code></li>
|
||||||
<li>Crea l'utente amministratore con i permessi completi</li>
|
<li>Crea l'utente amministratore con i permessi completi</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<h5 class="mt-4">Modalita Restore da Backup</h5>
|
<h5 class="mt-4">Restore da Backup</h5>
|
||||||
<p>Seleziona questa modalita quando vuoi migrare un'installazione esistente su un nuovo server.</p>
|
<p>Il backup ZIP generato dalla pagina <strong>Admin → Backup</strong> contiene un dump SQL e i file dei documenti. Per ripristinare:</p>
|
||||||
<p>Cosa serve:</p>
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>Un file ZIP generato dalla pagina <strong>Admin → Backup</strong> del server originale</li>
|
<li>Estrai il file ZIP in una cartella temporanea</li>
|
||||||
<li>Il wizard accetta upload diretto del file o un percorso sul server</li>
|
<li>Importa il database dal file SQL (<code>mysql -u root -p glastree < backup/database.sql</code>)</li>
|
||||||
|
<li>Copia i file in <code>storage/app/</code> per ripristinare i documenti</li>
|
||||||
|
<li>Copia il file <code>.env</code> dal backup (modifica le credenziali DB per il nuovo server)</li>
|
||||||
|
<li>Esegui <code>php artisan key:generate</code> se la <code>APP_KEY</code> del backup non è utilizzabile</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Cosa succede durante il restore:</p>
|
|
||||||
<ol>
|
|
||||||
<li>Estrae il file ZIP in una cartella temporanea</li>
|
|
||||||
<li>Importa <code>database.sql</code> nel database MySQL configurato</li>
|
|
||||||
<li>Copia i file documenti in <code>storage/app/documenti/</code></li>
|
|
||||||
<li>Ripristina il file <code>.env</code> dal backup (preservando le credenziali DB del nuovo server)</li>
|
|
||||||
</ol>
|
|
||||||
|
|
||||||
<h5 class="mt-4">Dopo l'Installazione</h5>
|
<h5 class="mt-4">Dopo l'Installazione</h5>
|
||||||
<ol>
|
<ol>
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
<?php $__env->startSection('title', 'Calendario Eventi'); ?>
|
||||||
|
<?php $__env->startSection('page_title', 'Calendario Eventi'); ?>
|
||||||
|
|
||||||
|
<?php $__env->startSection('content'); ?>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card card-primary">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">
|
||||||
|
<i class="fas fa-calendar-alt mr-2"></i>Calendario Eventi
|
||||||
|
</h3>
|
||||||
|
<div class="card-tools">
|
||||||
|
<a href="<?php echo e(route('eventi.index')); ?>" class="btn btn-secondary btn-sm">
|
||||||
|
<i class="fas fa-list mr-1"></i> Elenco Eventi
|
||||||
|
</a>
|
||||||
|
<a href="<?php echo e(route('eventi.create')); ?>" class="btn btn-success btn-sm">
|
||||||
|
<i class="fas fa-plus mr-1"></i> Nuovo Evento
|
||||||
|
</a>
|
||||||
|
<form action="<?php echo e(route('eventi.export-selected-ics')); ?>" method="POST" class="d-inline">
|
||||||
|
<?php echo csrf_field(); ?>
|
||||||
|
<button type="submit" class="btn btn-success btn-sm">
|
||||||
|
<i class="fas fa-calendar-plus mr-1"></i> Esporta ICS
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div id="calendar"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php $__env->stopSection(); ?>
|
||||||
|
|
||||||
|
<?php $__env->startSection('styles'); ?>
|
||||||
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.css">
|
||||||
|
<?php $__env->stopSection(); ?>
|
||||||
|
|
||||||
|
<?php $__env->startSection('scripts'); ?>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@6.1.10/index.global.min.js"></script>
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
var calendarEl = document.getElementById('calendar');
|
||||||
|
|
||||||
|
var calendar = new FullCalendar.Calendar(calendarEl, {
|
||||||
|
initialView: 'dayGridMonth',
|
||||||
|
locale: 'it',
|
||||||
|
headerToolbar: {
|
||||||
|
left: 'prev,next today',
|
||||||
|
center: 'title',
|
||||||
|
right: 'dayGridMonth,timeGridWeek,listWeek'
|
||||||
|
},
|
||||||
|
buttonText: {
|
||||||
|
today: 'Oggi',
|
||||||
|
month: 'Mese',
|
||||||
|
week: 'Settimana',
|
||||||
|
list: 'Lista'
|
||||||
|
},
|
||||||
|
eventSources: [
|
||||||
|
{
|
||||||
|
url: '/eventi/calendar/events',
|
||||||
|
method: 'GET',
|
||||||
|
extraParams: function() {
|
||||||
|
return {
|
||||||
|
_token: document.querySelector('meta[name="csrf-token"]')?.content || ''
|
||||||
|
};
|
||||||
|
},
|
||||||
|
startParam: 'start',
|
||||||
|
endParam: 'end',
|
||||||
|
success: function(response) {
|
||||||
|
console.log('Eventi caricati:', response.length, response);
|
||||||
|
},
|
||||||
|
failure: function(error) {
|
||||||
|
console.error('Errore:', error);
|
||||||
|
console.log('XHR:', error.xhr);
|
||||||
|
alert('Errore nel caricamento degli eventi. Controlla la console per dettagli.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
eventClick: function(info) {
|
||||||
|
info.jsEvent.preventDefault();
|
||||||
|
window.location.href = info.event.url;
|
||||||
|
},
|
||||||
|
eventDisplay: 'block',
|
||||||
|
displayEventTime: true,
|
||||||
|
displayEventEnd: true,
|
||||||
|
nowIndicator: true,
|
||||||
|
height: 'auto',
|
||||||
|
expandRows: true,
|
||||||
|
stickyHeaderDates: true,
|
||||||
|
dayMaxEvents: true,
|
||||||
|
eventTimeFormat: {
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
hour12: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
calendar.render();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<?php $__env->stopSection(); ?>
|
||||||
|
<?php echo $__env->make('layouts.adminlte', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH /var/www/html/glastree/resources/views/eventi/calendar.blade.php ENDPATH**/ ?>
|
||||||
Reference in New Issue
Block a user