From cadb9a5fcc7939df922c2df9e43f2ed2e113be87 Mon Sep 17 00:00:00 2001 From: michele Date: Sun, 24 May 2026 21:21:13 +0000 Subject: [PATCH] Harden support update access and maintenance page --- app/Filament/Pages/Supporto/Modifiche.php | 11 +- docs/support/AGGIORNAMENTI-STAGING-GIT.md | 9 + docs/support/BUG-RISOLTI-E-VALIDAZIONI.md | 8 + resources/views/errors/503.blade.php | 236 ++++++++++++++++++++++ 4 files changed, 263 insertions(+), 1 deletion(-) create mode 100644 resources/views/errors/503.blade.php diff --git a/app/Filament/Pages/Supporto/Modifiche.php b/app/Filament/Pages/Supporto/Modifiche.php index cc2cee4..cc5b046 100644 --- a/app/Filament/Pages/Supporto/Modifiche.php +++ b/app/Filament/Pages/Supporto/Modifiche.php @@ -246,7 +246,16 @@ public static function canAccess(): bool return false; } - return app(ProgramAclService::class)->canAccessProgram($user, 'supporto.modifiche'); + if (class_exists(ProgramAclService::class)) { + try { + return app(ProgramAclService::class)->canAccessProgram($user, 'supporto.modifiche'); + } catch (\Throwable) { + // Fallback below keeps the support page reachable during partial deploys. + } + } + + return method_exists($user, 'hasAnyRole') + && $user->hasAnyRole(['super-admin', 'admin', 'amministratore']); } public function canRunUpdate(): bool diff --git a/docs/support/AGGIORNAMENTI-STAGING-GIT.md b/docs/support/AGGIORNAMENTI-STAGING-GIT.md index ac6f3da..905b2f5 100644 --- a/docs/support/AGGIORNAMENTI-STAGING-GIT.md +++ b/docs/support/AGGIORNAMENTI-STAGING-GIT.md @@ -149,6 +149,15 @@ ## Emergenza: pagina Supporto > Modifiche in out-of-memory Nota operativa: questa rotazione manuale e solo una misura di contenimento. Il fix vero deve restare nel codice e poi essere riportato subito su Git, altrimenti il problema puo tornare al prossimo log grande o sul prossimo nodo remoto. +Se il nodo fallisce invece per classi mancanti durante l apertura di `Supporto > Modifiche` o di `aggiornamento-nodo`, la procedura corretta e: + +1. verificare subito se il file mancante esiste davvero nel checkout deployato; +2. se la pagina tecnica dipende da un service non essenziale al recupero del nodo, introdurre un fallback locale sicuro per non bloccare il pannello; +3. riallineare repository e nodo via Git appena il pannello torna accessibile; +4. eseguire `php artisan optimize:clear` dopo il fix. + +Per la manutenzione utente finale, il nodo deve servire una `503` dedicata con refresh automatico sulla stessa URL. In questo modo l utente vede solo il messaggio di aggiornamento e rientra da solo alla pagina richiesta quando il deploy termina, senza restare mischiato a pagine parziali o a tracce tecniche. + ## Rilascio operativo 2026-04-06 Questo e il blocco che puo essere aggiornato adesso con la procedura Git-first senza correzioni manuali extra su staging. diff --git a/docs/support/BUG-RISOLTI-E-VALIDAZIONI.md b/docs/support/BUG-RISOLTI-E-VALIDAZIONI.md index 6c6f600..6f41ea3 100644 --- a/docs/support/BUG-RISOLTI-E-VALIDAZIONI.md +++ b/docs/support/BUG-RISOLTI-E-VALIDAZIONI.md @@ -19,6 +19,14 @@ ### Supporto > Modifiche in memory exhaustion su log grandi - Stato: [U] riprodotto e corretto sul nodo locale `/var/www/netgescon`; validazione eseguita via reflection su `loadRuntimeErrors()` con `laravel.log` grande, picco memoria rimasto intorno a `89 MB` e `39` righe BUG caricate correttamente. - Prevenzione: non usare aumento del `memory_limit` come rimedio principale; mantenere logrotate attivo e preferire sempre parsing incrementale o tail bounded per i file operativi letti dalla UI. +### Supporto > Modifiche con `ProgramAclService` assente su nodo staging + +- Problema: la pagina `admin-filament/supporto/aggiornamento-nodo` poteva andare in `BindingResolutionException` con `Target class [App\Services\ProgramAclService] does not exist` durante `canAccess()`. +- Causa tecnica: sul nodo staging il checkout deployato non conteneva `app/Services/ProgramAclService.php`; la pagina supporto dipendeva in modo rigido da quel service anche per un semplice controllo accessi. +- Fix applicato: `Modifiche::canAccess()` usa `ProgramAclService` solo se la classe esiste e si risolve correttamente; se manca, fa fallback ai ruoli amministrativi (`super-admin`, `admin`, `amministratore`) e non blocca la pagina tecnica. +- Stato: [U] validato su `/var/www/netgescon` con service realmente assente; `App\Filament\Pages\Supporto\Modifiche::canAccess()` non genera piu eccezioni e ritorna correttamente `true` per un utente amministrativo. +- Prevenzione: nelle pagine di supporto e deploy evitare dipendenze rigide da moduli opzionali o non ancora allineati sul nodo; il pannello di recupero deve sempre avere un percorso di fallback minimale. + ### Ripristino bootstrap pannello admin - Problema: `AdminFilamentPanelProvider.php` era stato corrotto da una modifica incompleta e impediva il bootstrap corretto. diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php new file mode 100644 index 0000000..0ac94ca --- /dev/null +++ b/resources/views/errors/503.blade.php @@ -0,0 +1,236 @@ + + + + + + @php + $retrySeconds = (int) config('netgescon.maintenance.retry', 60); + $refreshSeconds = (int) config('netgescon.maintenance.refresh', 15); + $refreshSeconds = max($refreshSeconds, 5); + @endphp + + {{ config('netgescon.maintenance.title', 'Aggiornamento in corso') }} + + + + @php + $siteMode = (string) config('netgescon.maintenance.site_mode', 'app'); + $siteLabel = (string) config('netgescon.maintenance.site_label', config('app.name', 'NetGescon')); + $supportEmail = trim((string) config('netgescon.maintenance.support_email', '')); + $supportUrl = trim((string) config('netgescon.maintenance.support_url', '')); + $siteBadge = $siteMode === 'demo' ? 'Demo' : 'App'; + $siteNote = $siteMode === 'demo' + ? 'L\'ambiente demo e temporaneamente bloccato per un aggiornamento controllato.' + : 'L\'ambiente applicativo e temporaneamente bloccato per un aggiornamento controllato.'; + @endphp + +
+
+
{{ $siteBadge }} ยท {{ $siteLabel }}
+

{{ config('netgescon.maintenance.title', 'Aggiornamento in corso') }}

+

+ {{ config('netgescon.maintenance.message', 'Stiamo applicando una nuova distribuzione del servizio.') }} +

+
+ +
+
+ + {{ config('netgescon.maintenance.detail', 'L\'accesso sara ripristinato automaticamente al termine dell\'aggiornamento.') }} +
+ +
+
+

Ambiente

+

{{ $siteLabel }}

+

{{ $siteNote }}

+
+ +
+

Riprova Tra

+

{{ max($retrySeconds, 1) }} secondi

+

La pagina si aggiorna automaticamente ogni {{ $refreshSeconds }} secondi e torna da sola alla pagina richiesta quando l aggiornamento termina.

+
+ + @if($supportEmail !== '') +
+

Supporto

+

{{ $supportEmail }}

+

Usa questo contatto solo se il blocco si prolunga oltre la normale finestra tecnica.

+
+ @endif + + @if($supportUrl !== '') +
+

Pagina Operativa

+

Apri riferimento

+

Puoi pubblicare qui un link di stato o una pagina informativa esterna.

+
+ @endif +
+
+
+ + + \ No newline at end of file