Stato e storia

Com’è fatta la piattaforma

29 Settembre 2026 emanuele 3 minuti di lettura
Architettura di web1 Dal PC, attraverso il tunnel SSH, si raggiunge il pannello su web1; il pannello chiede le operazioni all’agente, che lancia gli script; gli script gestiscono i siti come utente del sito e usano Storage Box, wordpress.org e Wordfence. I timer lanciano gli stessi script. web1 · Debian 13 · Hetzner Il tuo PC browser + chiave SSH localhost:8765 tunnel SSH Pannello Docker senza rete, FastAPI sessione di 8 ore, ruoli, CSRF operazioni in elenco Agente root, socket unix registro, lavori in background Script site.sh · restore-site.sh site-scan.py · server-scan.py integrity-check.sh nightly-backup.sh · storage-box.py Siti, uno per utente nginx: anteprima e regole PHP-FPM: un pool per sito MariaDB: un database per sito codice in sola lettura in uscita: solo DNS, web, posta come utente del sito (wp-cli, mai root) Timer 03:15 backup notturno 06:30 controllo completo ogni ora (:20) controllo leggero lunedì 05:00 aggiornamenti ogni 5 minuti: amministrazione Storage Box backup cifrati (restic) copie della migrazione wordpress.org core, plugin, temi checksum ufficiali Wordfence Intelligence vulnerabilità note un elenco al giorno
Le frecce dicono chi chiama chi. Il pannello non esegue comandi: chiede all’agente una delle operazioni che conosce.

I pezzi

PezzoCosa faPerché così
PannelloLe pagine della dashboard e l’API.Gira in un container senza rete, con il disco in sola lettura: anche se qualcuno lo forzasse, non potrebbe chiamare fuori né eseguire comandi.
AgenteEsegue le operazioni, come root.Conosce solo un elenco chiuso di operazioni, ognuna con i suoi controlli sugli argomenti; niente shell, niente comandi liberi. Scrive tutto nel registro.
ScriptFanno il lavoro vero.La stessa logica per la dashboard, per i timer e per chi lavora da shell: un pulsante è sempre un comando che si può ripetere a mano.
ImportazioniArchivi e dump di siti di produzione da portare in sviluppo.Sono file di altri: li apre un utente senza privilegi, il dump passa da un filtro e da un database temporaneo, nessun PHP dell’archivio viene eseguito, e il sito nasce solo dopo la conferma.
SitiWordPress, uno per utente Linux.PHP, database e cartella propri: un sito compromesso non vede gli altri.
CassaforteCredenziali dei fornitori e chiavi dei server di produzione.Cifrata con age: si apre per poco tempo, solo per chi l’ha aperta e solo se la notifica arriva; chiusa, nessuno ne legge i valori, nemmeno root.
Strumenti firmatiGli script che vanno sui server di produzione.Un server li installa solo con la firma della chiave di rilascio dell’amministratore, che non sta su nessun server: un server di sviluppo compromesso non porta codice suo in produzione.
TimerBackup, controlli, aggiornamenti, scadenze.Il server si sorveglia da solo, anche quando nessuno guarda la dashboard.

Difese a strati

  1. Rete: SSH solo a chiave, dashboard raggiungibile solo dal tunnel, firewall che blocca le uscite dei siti.
  2. Server web: anteprima, limiti sulla pagina di accesso, sonde respinte, amministrazione chiusa.
  3. fail2ban: chi insiste resta fuori, chi ritorna resta fuori una settimana.
  4. PHP: ogni sito chiuso nella sua cartella, funzioni pericolose disattivate.
  5. File: codice in sola lettura, nessun PHP eseguibile fuori da plugin e temi.
  6. Controlli: impronta, database, vulnerabilità, ogni notte e ogni ora.
  7. Backup: cifrati, fuori dal server, verificati ogni settimana.

Nessuno strato è perfetto da solo: servono tutti, perché chi attacca deve superarli tutti.

Dietro un clic: «Aggiorna» su un plugin

  1. Il browser manda la richiesta nel tunnel SSH, con il codice anti-falsificazione.
  2. Il pannello controlla sessione, ruolo e nome del plugin, poi chiede all’agente l’operazione site.plugin.update.
  3. L’agente controlla di nuovo gli argomenti, scrive nel registro chi l’ha chiesta e avvia un lavoro: site.sh update-plugin.
  4. Lo script sblocca il codice, aggiorna il plugin con wp-cli come utente del sito, senza caricare plugin e temi, e verifica i checksum ufficiali.
  5. Riblocca il codice e approva la nuova impronta.
  6. Il log arriva nel browser riga per riga; alla fine il riepilogo dice cosa è cambiato, e il registro l’esito.