- import gruppi ed eventi + docker

This commit is contained in:
2026-06-06 23:00:07 +02:00
parent 00004d8b50
commit a8c841bdbe
36 changed files with 1484 additions and 7642 deletions
+50 -13
View File
@@ -131,11 +131,17 @@ function createAdminUser(
$userId = $pdo->lastInsertId();
// Assegna ruolo Spatie 'admin' (role_id = 1)
// Assegna ruolo Spatie 'admin' (lookup dinamico per nome)
$stmt = $pdo->prepare("SELECT id FROM roles WHERE name = 'admin' LIMIT 1");
$stmt->execute();
$adminRoleId = (int) $stmt->fetchColumn();
if ($adminRoleId === 0) {
throw new \Exception('Ruolo Spatie admin non trovato');
}
$stmt = $pdo->prepare(
"INSERT INTO model_has_roles (role_id, model_type, model_id) VALUES (1, ?, ?)"
"INSERT INTO model_has_roles (role_id, model_type, model_id) VALUES (?, ?, ?)"
);
$stmt->execute(['App\\Models\\User', $userId]);
$stmt->execute([$adminRoleId, 'App\\Models\\User', $userId]);
return true;
} catch (\PDOException $e) {
@@ -179,6 +185,10 @@ $appName = askRequired('Nome del sito/app (es. Glastree MyChurch)');
$adminName = askRequired('Nome del primo utente amministratore');
$adminEmail = askRequired('Email dell\'amministratore');
$adminPass = askRequired('Password per l\'amministratore');
$adminPass2 = askRequired('Conferma password amministratore');
if ($adminPass !== $adminPass2) {
fail('Le password non corrispondono');
}
$appUrl = askRequired('URL pubblico del sito (es. https://glastree.esempio.it)');
// ── DB params (Apache / Restore) ─────────────────────
@@ -264,7 +274,9 @@ if ($mode === 'Fresh Install su Apache (LAMP tradizionale)') {
}
// APP_KEY
runCapture("{$sudo}php artisan key:generate --force");
if (!run("{$sudo}php artisan key:generate --force", 'Generazione APP_KEY...')) {
fail('Generazione APP_KEY fallita');
}
ok('APP_KEY generata');
// Config
@@ -373,7 +385,9 @@ if ($mode === 'Fresh Install su Apache (LAMP tradizionale)') {
println(color(' 3/7 — INSTALLAZIONE DIPENDENZE', 'yellow'));
println(color('══════════════════════════════════════════', 'yellow'));
run("COMPOSER_ROOT_VERSION=dev-main composer install --no-dev --optimize-autoloader", 'Installazione dipendenze Composer...');
if (!run("COMPOSER_ROOT_VERSION=dev-main composer install --no-dev --optimize-autoloader", 'Installazione dipendenze Composer...')) {
fail('Installazione dipendenze Composer fallita');
}
ok('Dipendenze PHP installate');
// ── Step 4: Package discovery ────────────────────
@@ -397,7 +411,7 @@ if ($mode === 'Fresh Install su Apache (LAMP tradizionale)') {
}
if ($dbType === 'mysql') {
$importCmd = "mysql -h {$dbHost} -P {$dbPort} -u {$dbUser} -p{$dbPass} {$dbName} < {$sqlFile}";
$importCmd = "MYSQL_PWD=" . escapeshellarg($dbPass) . " mysql -h {$dbHost} -P {$dbPort} -u {$dbUser} {$dbName} < {$sqlFile}";
if (!run($importCmd, 'Importazione struttura database e dati base...')) {
fail("Importazione SQL fallita. Verifica il file database/install.sql e le credenziali.");
}
@@ -502,6 +516,12 @@ if ($mode === 'Fresh Install via Docker') {
println(color('══════════════════════════════════════════', 'yellow'));
checkCmd('docker');
$dockerComposeCmd = 'docker compose';
if (trim(shell_exec('command -v docker-compose 2>/dev/null') ?: '') !== '') {
$dockerComposeCmd = 'docker-compose';
} elseif (trim(shell_exec('command -v docker 2>/dev/null && docker compose version 2>/dev/null') ?: '') === '') {
fail('Docker Compose (v1 o v2) non trovato.');
}
println();
println(color('══════════════════════════════════════════', 'yellow'));
@@ -518,10 +538,13 @@ if ($mode === 'Fresh Install via Docker') {
println(color(' INSTALLAZIONE DOCKER', 'yellow'));
println(color('══════════════════════════════════════════', 'yellow'));
if (!run("docker compose -f {$composeFile} build", 'Build immagine Docker...')) {
if (!run("{$dockerComposeCmd} -f {$composeFile} build", 'Build immagine Docker...')) {
fail('Build fallita');
}
// Genera APP_KEY per il container Docker
$appKey = 'base64:' . base64_encode(random_bytes(32));
// Override compose con variabili d'ambiente
$override = [
'services:',
@@ -531,11 +554,12 @@ if ($mode === 'Fresh Install via Docker') {
" - APP_URL={$appUrl}",
' - APP_ENV=production',
' - APP_DEBUG=false',
" - APP_KEY={$appKey}",
];
file_put_contents('docker-compose.override.yml', implode(PHP_EOL, $override) . PHP_EOL);
if (!run(
"docker compose -f {$composeFile} -f docker-compose.override.yml up -d",
"{$dockerComposeCmd} -f {$composeFile} -f docker-compose.override.yml up -d",
'Avvio container...'
)) {
@unlink('docker-compose.override.yml');
@@ -544,7 +568,7 @@ if ($mode === 'Fresh Install via Docker') {
// Attendi container pronto
info('Attendo che il container sia pronto...');
$containerId = runCapture("docker compose -f {$composeFile} ps -q glastree 2>/dev/null");
$containerId = runCapture("{$dockerComposeCmd} -f {$composeFile} ps -q glastree 2>/dev/null");
$adminCreated = false;
if ($containerId !== '') {
@@ -560,6 +584,11 @@ if ($mode === 'Fresh Install via Docker') {
sleep(2);
}
if ($status !== 'running') {
@unlink('docker-compose.override.yml');
fail("Container non pronto dopo 60 secondi (stato: {$status}). Controlla i log con: {$dockerComposeCmd} -f {$composeFile} logs");
}
// Import schema SQL nel container
$sqlFile = $scriptDir . '/database/install.sql';
if (file_exists($sqlFile) && $dockerDb === 'mysql') {
@@ -605,7 +634,11 @@ if ($mode === 'Fresh Install via Docker') {
\$pdo->prepare("DELETE FROM users WHERE email = ?")->execute([{$emailExp}]);
\$pdo->prepare("INSERT INTO users (name, email, password, is_admin, status, permissions, role_preset_id, created_at, updated_at) VALUES (?, ?, ?, 1, 'active', ?, 1, NOW(), NOW())")->execute([{$nameExp}, {$emailExp}, {$hashExp}, '{$perm}']);
\$uid = \$pdo->lastInsertId();
\$pdo->prepare("INSERT INTO model_has_roles (role_id, model_type, model_id) VALUES (1, ?, ?)")->execute(['App\\\\Models\\\\User', \$uid]);
\$stmt = \$pdo->prepare("SELECT id FROM roles WHERE name = 'admin' LIMIT 1");
\$stmt->execute();
\$adminRoleId = (int) \$stmt->fetchColumn();
if (\$adminRoleId === 0) { echo 'ERR:admin_role_not_found'; exit(1); }
\$pdo->prepare("INSERT INTO model_has_roles (role_id, model_type, model_id) VALUES (?, ?, ?)")->execute([\$adminRoleId, 'App\\\\Models\\\\User', \$uid]);
echo "OK:" . \$uid;
PHP;
file_put_contents($adminScriptPath, $adminPhp);
@@ -735,7 +768,9 @@ if ($mode === 'Restore da Backup (Apache)') {
file_put_contents('.env', $dotenv);
// Generate APP_KEY
runCapture("{$sudo}php artisan key:generate --force");
if (!run("{$sudo}php artisan key:generate --force", 'Generazione APP_KEY...')) {
fail('Generazione APP_KEY fallita');
}
ok('APP_KEY rigenerata');
// Import database
@@ -743,7 +778,7 @@ if ($mode === 'Restore da Backup (Apache)') {
$sqlFile = "{$tmpDir}/database.sql";
if (file_exists($sqlFile)) {
info("Importazione database MySQL: {$sqlFile}");
$cmd = "mysql -h {$dbHost} -P {$dbPort} -u {$dbUser} -p{$dbPass} {$dbName} < {$sqlFile}";
$cmd = "MYSQL_PWD=" . escapeshellarg($dbPass) . " mysql -h {$dbHost} -P {$dbPort} -u {$dbUser} {$dbName} < {$sqlFile}";
if (run($cmd, null)) {
ok('Database importato');
} else {
@@ -765,7 +800,9 @@ if ($mode === 'Restore da Backup (Apache)') {
}
// Composer
run("COMPOSER_ROOT_VERSION=dev-main composer install --no-dev --optimize-autoloader", 'Installazione dipendenze Composer...');
if (!run("COMPOSER_ROOT_VERSION=dev-main composer install --no-dev --optimize-autoloader", 'Installazione dipendenze Composer...')) {
fail('Installazione dipendenze Composer fallita');
}
runCapture("{$sudo}php artisan package:discover --ansi 2>/dev/null");
// Storage link + cache