51 06/04/2026 07/04/2026 11 min

Obiettivo architetturale

Se vuoi mettere Postfixadmin e Roundcube in alta affidabilità, il punto non è solo “replicare i server”. Il nodo vero è eliminare i single point of failure su web, database, storage condiviso, sessioni e, per Roundcube, anche sulla parte mail backend che resta fuori dal perimetro applicativo ma incide sulla disponibilità percepita dagli utenti.

Lo stato atteso è semplice: se cade un nodo web, l’altro continua a servire la UI; se cade un nodo database, l’app non deve degradare in modo imprevedibile; se cade il bilanciatore, gli utenti devono avere un punto di ingresso alternativo o un meccanismo di failover rapido; se viene applicato un aggiornamento, va fatto senza fermare l’accesso alla posta e alla gestione account più del necessario.

Per un setup serio, l’architettura minima sensata è: due nodi web, database in replica o cluster, storage condiviso solo dove serve davvero, sessioni esternalizzate, DNS e TLS gestiti in modo coerente, monitoraggio e backup testati. Se manca uno di questi punti, non sei in HA: hai solo due server che fanno la stessa cosa.

Separare bene i ruoli: Postfixadmin e Roundcube non hanno le stesse priorità

Postfixadmin è un pannello amministrativo. In produzione la sua disponibilità è importante, ma di solito non è un servizio “utente finale” nel senso stretto. Roundcube invece è il webmail che impatta direttamente gli utenti. Questo cambia la priorità dei componenti.

Per Postfixadmin conta soprattutto la continuità operativa per gli admin, la consistenza del database e la sicurezza dell’accesso. Per Roundcube contano anche la latenza, le sessioni e la stabilità del backend IMAP/SMTP. Se i due servizi condividono la stessa macchina, il rischio è che un problema di webmail o una manutenzione del pannello amministrativo impatti entrambi.

La scelta migliore è spesso separare almeno il livello applicativo: un virtual host o container per Roundcube, uno per Postfixadmin, con backend comuni ma indipendenti lato web. Questo ti consente di fare deploy e rollback separati. Se il carico è basso, puoi anche tenerli sullo stesso cluster di web server, ma non sullo stesso singolo nodo.

Database: il vero punto critico

Postfixadmin e Roundcube usano entrambi un database. Nel caso di Postfixadmin, il database contiene domini, mailbox, alias, quote e configurazioni. Nel caso di Roundcube, il database spesso contiene address book, preferenze, cache, identità, plugin state e, in alcune configurazioni, anche sessioni o dati temporanei.

Se il database si ferma, l’impatto è immediato: Postfixadmin perde la console di gestione, Roundcube può smettere di autenticare o degradare in modo importante. Quindi il database non va trattato come componente “di supporto”, ma come parte centrale del servizio.

Per l’alta affidabilità hai tre strade, in ordine di complessità:

  1. Replica primaria-secondaria con failover controllato, se tolleri una breve interruzione in caso di switch.
  2. Cluster sincrono se ti serve ridurre al minimo il rischio di perdita dati e hai maturità operativa per gestirlo.
  3. Servizio database gestito se l’obiettivo è ridurre la manutenzione interna, purché il provider garantisca SLA, backup e failover chiari.

Per ambienti classici LAMP/LEMP, una replica MySQL/MariaDB con orchestrazione del failover è spesso il compromesso migliore. Ma va testato: il failover non è affidabile per definizione, lo diventa solo dopo prova di disconnessione, promozione del secondario e riconnessione delle app.

Sessioni Roundcube: se restano locali, l’HA è finta

Roundcube in cluster soffre un problema classico: se le sessioni sono salvate localmente sul singolo web server, il bilanciatore può mandare l’utente su un altro nodo e la sessione sparisce. Risultato: logout improvvisi, errori casuali, percezione di instabilità anche quando i nodi sono sani.

La soluzione corretta è esternalizzare le sessioni. Le opzioni più comuni sono:

  1. Redis, con TTL e persistenza adeguata se vuoi affidabilità e velocità.
  2. Memcached, se ti serve solo cache volatile e accetti la perdita delle sessioni in caso di restart.
  3. Sessioni su database, più semplici da capire ma meno eleganti e spesso più pesanti sul DB già critico.

Per Roundcube, Redis è di solito la scelta migliore se il volume lo giustifica. Il punto non è solo la tecnologia: è la configurazione coerente su tutti i nodi web. Se un nodo scrive sessioni su Redis e l’altro ancora su filesystem locale, l’HA non esiste.

Controllo minimo da fare: verificare che il parametro di session handling di PHP e quello specifico di Roundcube puntino allo stesso backend su tutti i nodi, e che il TTL copra la durata reale delle sessioni utente. Se il TTL è troppo corto, gli utenti vengono buttati fuori; se è troppo lungo, accumuli dati inutili.

Storage condiviso: usarlo solo dove serve

Molti setup HA falliscono perché cercano di condividere tutto con NFS senza chiedersi cosa debba davvero essere condiviso. Per Postfixadmin, in genere non serve storage condiviso per i contenuti applicativi: codice e configurazioni vanno distribuiti in modo identico sui nodi, tramite deploy o configurazione automatizzata.

Per Roundcube, il codice applicativo dovrebbe essere anch’esso distribuito in modo identico. Il contenuto dinamico utile è limitato: upload temporanei, cache, eventuali plugin che richiedono directory scrivibili, log locali. Queste aree possono stare su storage locale replicato o su storage condiviso, ma va evitato l’uso indiscriminato di NFS per tutto, perché introduce latenza e un altro possibile collo di bottiglia.

Se proprio devi condividere directory scrivibili, separa con precisione:

  • directory di cache;
  • directory di upload temporanei;
  • directory di log, se centralizzi male;
  • eventuali file di configurazione generati dall’app, se davvero necessari.

Ogni directory condivisa è un punto di attenzione su permessi, locking e performance. Il principio guida è: codice distribuito, stato esternalizzato, filesystem condiviso solo come eccezione.

Bilanciamento e failover: il front-end va progettato prima del back-end

In alta affidabilità, il bilanciatore è spesso il primo componente che diventa SPOF se lo si tratta come commodity. Hai almeno tre approcci:

  1. Load balancer esterno gestito, se hai un servizio affidabile davanti ai nodi web.
  2. Coppia di bilanciatori con failover, ad esempio con IP virtuale e health check.
  3. DNS failover, utile come fallback ma non ideale come meccanismo primario per via della cache dei resolver.

Per Roundcube e Postfixadmin, il bilanciamento L7 con health check HTTP è in genere la scelta migliore. Puoi far verificare al bilanciatore una pagina di health dedicata che controlli almeno web server, PHP-FPM e accesso al database. Non basta un file statico che risponde “200 OK”: quello dice solo che Apache o Nginx è vivo, non che l’app funziona.

Se usi sticky session, fallo solo se sei costretto da plugin o configurazioni non stateless. La soluzione più pulita resta sessioni esternalizzate e bilanciamento senza sticky, perché semplifica il failover e distribuisce meglio il carico.

Database e applicazioni: gestione delle connessioni

Quando il database viene replicato o spostato dietro un VIP, le applicazioni devono gestire bene il riaggancio. Roundcube e Postfixadmin non devono aspettarsi che la connessione rimanga valida per sempre. Se il nodo DB viene promosso, le app devono riconnettersi senza richiedere intervento manuale.

Questo significa configurare:

  • timeout sensati sulle connessioni;
  • retry limitati ma presenti;
  • pooling se usato, con parametri compatibili con il failover;
  • account DB con privilegi minimi necessari.

Evita credenziali troppo permissive. Per Postfixadmin basta l’accesso ai soli schemi e tabelle necessari alla gestione. Per Roundcube, separa l’utente del database dall’utente amministrativo, e non riusare credenziali tra servizi diversi. In caso di incidente, la separazione riduce il blast radius.

Deploy coerente: stesso codice, stessa configurazione, stessi plugin

Un cluster web si rompe spesso per divergenza di configurazione. Un nodo ha un plugin Roundcube in più, l’altro no. Un nodo ha un file di configurazione aggiornato, l’altro no. Un nodo usa una versione diversa di PHP. Risultato: comportamento non deterministico e bug difficili da leggere.

La regola è semplice: immagini, pacchetti o release identiche su tutti i nodi. Se usi Ansible, Puppet, Salt o un sistema di deploy, codifica tutto. Se fai deploy manuale, il rischio di drift cresce molto e l’HA si deteriora nel tempo.

Per Roundcube, attenzione ai plugin. Devono essere versionati e distribuiti in modo atomico. Se aggiorni un plugin che cambia schema o comportamento, verifica la compatibilità con la versione dell’app e con il database. Per Postfixadmin, lo stesso principio vale per eventuali customizzazioni e template.

TLS, DNS e certificati: dettagli che fanno cadere il servizio percepito

Un’installazione può essere tecnicamente “up” e risultare comunque non usabile per colpa di TLS o DNS. Certificati scaduti, catena incompleta, SAN errati o record DNS puntati al nodo sbagliato sono errori banali ma molto frequenti.

In HA, il certificato deve essere valido per il nome pubblico usato dagli utenti e deve essere installato in modo coerente su tutti i nodi o gestito centralmente sul bilanciatore. Se il bilanciatore termina TLS, semplifichi i nodi web. Se invece TLS termina sui web server, devi assicurarti che tutti abbiano la stessa chiave e lo stesso certificato, con rotazione coordinata.

Per DNS, non usare TTL troppo alti se prevedi failover rapido. Però non abbassarlo senza motivo: valori troppo bassi aumentano il traffico DNS e non eliminano del tutto il caching. La scelta corretta dipende dal tuo RTO. Se vuoi failover in pochi minuti, pianifica TTL compatibili con quel target e testalo davvero.

Backup e restore: l’HA non sostituisce il ripristino

È un errore comune pensare che la replica basti. La replica protegge da certi guasti, non da cancellazioni accidentali, corruzione logica, aggiornamenti sbagliati o compromissioni. Devi avere backup separati e restore testati.

Per questa coppia di applicazioni, i backup minimi devono includere:

  • dump database coerenti e verificati;
  • configurazioni applicative e web server;
  • eventuali template, plugin e customizzazioni;
  • chiavi e certificati, trattati in modo sicuro e con accesso ristretto.

Il test che conta non è il backup riuscito, ma il restore riuscito in ambiente di test. Se non hai mai ripristinato Postfixadmin e Roundcube in un ambiente pulito, non sai davvero quanto tempo impiegherai in emergenza.

Regola pratica: se il ripristino richiede passaggi manuali non documentati, non è un piano di disaster recovery, è una speranza.

Monitoraggio minimo utile

Per un’architettura HA servono metriche che distinguano “server acceso” da “servizio funzionante”. Le metriche minime da osservare sono:

  • HTTP 2xx/5xx e tempi di risposta del front-end;
  • latenza verso il database e stato della replica;
  • errori PHP-FPM o del web server;
  • spazio disco e inode sui nodi web e DB;
  • stato session store, se usi Redis o altro backend esterno;
  • stato certificati TLS e scadenza residua.

Per Roundcube conviene avere un synthetic check che esegua login o almeno una richiesta autenticata di test in ambiente controllato. Per Postfixadmin, un check HTTP semplice può bastare per il front-end, ma il vero indicatore è la capacità di leggere e scrivere sul DB. Se il DB è degradato, la pagina può anche rispondere ma l’operatività è compromessa.

Sequenza consigliata di implementazione

Se devi costruire o rifare il sistema, non partire dal bilanciamento. Parti dallo stato e dalle dipendenze.

  1. Metti in sicurezza il database con replica o cluster e definisci il meccanismo di failover.
  2. Esternalizza le sessioni di Roundcube e verifica la coerenza su tutti i nodi.
  3. Distribuisci codice e configurazioni in modo identico su due nodi web.
  4. Inserisci health check che controllino davvero dipendenze applicative.
  5. Solo alla fine metti il bilanciatore e verifica il failover end-to-end.

Questo ordine riduce gli errori di progettazione. Molti implementano prima il load balancer e poi scoprono che l’app non è stateless o che il DB non regge il cambio di nodo. È l’inversione sbagliata: prima rendi il servizio spostabile, poi lo fai bilanciare.

Scelte pragmatiche per ambienti piccoli e medi

Se il tuo ambiente non è enorme, la soluzione più equilibrata spesso è questa: due web server con configurazione identica, database MySQL/MariaDB in replica primaria-secondaria, Redis per le sessioni Roundcube, bilanciatore davanti ai web server con health check applicativo, backup automatici e test di restore periodici.

Per Postfixadmin, l’alta affidabilità è soprattutto affidabilità del database e del front-end web. Per Roundcube, oltre a questo, conta la tenuta delle sessioni e la qualità del bilanciamento. Se vuoi ridurre la complessità, puoi anche mettere Roundcube dietro un reverse proxy centralizzato e Postfixadmin dietro un percorso separato, ma la logica di base non cambia: niente stato locale critico, niente dipendenze nascoste, niente drift di configurazione.

Se invece hai già un’infrastruttura virtualizzata o containerizzata, puoi usare quella come base per il failover, ma senza confondere orchestrazione e HA applicativa. Spostare una VM non basta se il database resta fermo o se le sessioni spariscono.

Checklist finale di validazione

Prima di dire che il sistema è davvero in alta affidabilità, verifica questi punti in modo esplicito:

  1. un nodo web può cadere senza interrompere l’accesso;
  2. il failover del database funziona e l’app riconnette;
  3. le sessioni Roundcube sopravvivono al cambio di nodo;
  4. i certificati sono validi su tutti i punti di terminazione TLS;
  5. i backup si ripristinano davvero;
  6. monitoraggio e alert distinguono guasto applicativo da guasto infrastrutturale.

Se anche uno solo di questi punti è incerto, l’architettura va considerata ancora in fase di hardening, non di piena affidabilità.

Assunzione: scenario classico Linux con web server Apache o Nginx, PHP-FPM e database MySQL/MariaDB; se usi stack diversi, i principi restano gli stessi ma cambiano i dettagli operativi.