| @@ -1,6 +1,6 @@ | |||
| # Captive Portal CMS — Casa della Scuola | |||
| CMS per portali captive: gestione di card informative, gallerie, flip-book e contenuti kiosk a schermo intero, con un'area di amministrazione locale. Stack: Next.js 16 (App Router, Turbopack), React 19, TypeScript, Tailwind v4. Persistenza su file (nessun database). Pensato per girare su **server Ubuntu offline**. | |||
| CMS per portali captive: gestione di card informative, gallerie, flip-book e contenuti kiosk a schermo intero, con un'area di amministrazione locale. Stack: Next.js 16 (App Router, Turbopack), React 19, TypeScript, Tailwind v4. Persistenza su file (nessun database). Pensato per girare su **server offline**. | |||
| --- | |||
| @@ -36,7 +36,7 @@ npm run build | |||
| npm start | |||
| ``` | |||
| > **Server offline:** la macchina di produzione non ha accesso a internet. NON eseguire `npm install` lì. Installa le dipendenze su una macchina con internet (stesso OS, Linux), poi copia l'intera cartella `node_modules` sul server insieme al progetto buildato. Su Ubuntu basta `npm run build` (se `node_modules` è presente) + `npm start`. | |||
| > **Server offline:** la macchina di produzione non ha accesso a internet. NON eseguire `npm install` lì. Installa le dipendenze su una macchina con internet (stesso OS, Linux), poi copia l'intera cartella `node_modules` sul server insieme al progetto buildato. Sul server basta `npm run build` (se `node_modules` è presente) + `npm start`. | |||
| --- | |||
| @@ -132,6 +132,11 @@ Ogni campo compilabile dall'admin ha un limite (vedi [`TEXT_LIMITS`](#limiti-tes | |||
| Gli URL (`actionUrl`) accettano solo gli schemi `http`, `https`, `mailto`, `tel`. Schemi come `javascript:` vengono rifiutati. | |||
| ### Caratteri non-ASCII (emoji, cirillico, CJK…) | |||
| - **Nei campi di testo**: conservati integralmente (il salvataggio è UTF-8). Due avvertenze: (1) il conteggio caratteri usa le unità UTF-16, quindi un emoji "pesa" 2 o più posizioni del limite (es. `🎉` ne conta 11), mentre cirillico/CJK contano 1 ciascuno; (2) se il font scelto non ha i glifi (es. un font latino con testo cirillico), il browser fa fallback a un font di sistema o mostra quadratini □. | |||
| - **Nei nomi dei file caricati**: i caratteri non-ASCII vengono rimossi dalla normalizzazione del nome (`città_🎉.jpg` → `…-citta.jpg`, `日本語.png` → `…-file.png`). Il file funziona sempre, ma il nome originale non-ASCII non viene preservato. Vedi [Sicurezza degli input → Nomi file](#sicurezza-degli-input). | |||
| --- | |||
| ## Sicurezza degli input | |||
| @@ -245,14 +250,11 @@ Sul server servono alcuni binari di sistema (richiamati direttamente, non via np | |||
| | `zip` | Creazione backup / preset | Pulsante "Scarica backup" e "Salva preset" → `503` | | |||
| | `unzip` | Ripristino backup / factory reset | Pulsanti di ripristino → `503` | | |||
| Verifica su Ubuntu: | |||
| Verifica su server: | |||
| ```bash | |||
| which ffmpeg ffprobe zip unzip | |||
| ``` | |||
| Se mancano: | |||
| ```bash | |||
| sudo apt install ffmpeg zip unzip | |||
| ``` | |||
| Se mancano, installali con il gestore pacchetti del sistema (i nomi dei pacchetti sono `ffmpeg`, `zip`, `unzip`). | |||
| --- | |||