3 voti, quorum 2, token 1000 millisecondi. Sono i tre numeri che tengono in piedi il mio cluster Proxmox a 2 nodi. Tre numeri che decidono, ogni due secondi, se i container sono vivi o morti. Se il cluster resiste o si spezza in due.
Nella Parte 1 ho spiegato perché tratto il mio homelab come un datacenter. Qui entro nel come: Corosync, QDevice su un Raspberry Pi 5, High Availability su 4 container, replica ZFS ogni 15 minuti. E soprattutto, i limiti che nessun tutorial vi mostra.
Cluster Proxmox a 2 nodi e lo split-brain: il problema reale
Un cluster Proxmox a 2 nodi ha un problema strutturale. Quando i nodi perdono contatto, ognuno crede di essere l'unico sopravvissuto. Entrambi provano a prendere il controllo delle risorse. Il risultato si chiama split-brain: due nodi che scrivono sugli stessi volumi, due istanze dello stesso container, corruzione dati.
Proxmox risolve con il quorum: serve una maggioranza di voti per operare. Con 2 nodi hai 2 voti. La maggioranza è 2. Se un nodo muore, l'altro ha 1 voto su 2 richiesti. Nessuno può operare. Cluster bloccato.
Serve un terzo voto — un arbitro esterno che rompa il pareggio.
Corosync e knet: come i nodi si parlano
Corosync è il cuore della comunicazione cluster. Nel mio setup usa il transport knet con autenticazione cifrata, ip_version ipv4-6 e link_mode passive. Il token è impostato a 1000 millisecondi: se un nodo non risponde entro due cicli, viene dichiarato morto.
Due secondi. È il tempo che passa tra "tutto ok" e "failover in corso".
È anche il tempo in cui un falso positivo può mandare a terra il cluster. Token troppo basso e avrai failover fantasma. Troppo alto e un nodo morto resterà lì a marcire mentre i servizi sono giù.
La sezione quorum mostra il punto chiave: expected_votes 3 con un QDevice che aggiunge il terzo voto. L'algoritmo ffsplit assegna il voto al sottoinsieme che mantiene il maggior numero di nodi attivi. Nel nostro caso, con 2 nodi, il voto va sempre al sopravvissuto.
Iscriviti alla newsletter per ricevere i migliori articoli direttamente nella tua inbox.
Self-Hosting
Monitoring: raccolgo tutto e non avviso di niente — l'ultimo pezzo del homelab
Prometheus con 8 job, Grafana, node-exporter su ogni nodo e container, blackbox HTTP probe. E zero alert configurati. Il monitoring che raccoglie tutto ma non ti sveglia quando serve.
QDevice su Raspberry Pi: l'arbitro a costo zero
Il QDevice Proxmox gira su un Raspberry Pi 5 con 8 GB di RAM, all'indirizzo 10.0.10.1. Il servizio corosync-qnetd è attivo dal 14 aprile 2026 e non ha mai dato problemi. Il Pi ha risorse in abbondanza per questo ruolo: 1.4 GB di RAM usati su 7.9 disponibili.
Ma il Pi non fa solo da arbitro. È anche il gateway di rete per tutte e tre le subnet (10.0.10.0/24, 10.10.10.0/24, 10.20.20.0/24) e ospita AIWALL, il mio IDS. Tre ruoli critici su un singolo dispositivo. Ci torno tra poco, nella sezione sui compromessi — che in un cluster Proxmox a 2 nodi è la parte più importante.
HA e replica ZFS: cosa proteggo e perché
Non tutti i container meritano il failover automatico. Ho scelto 4 su 10, in base a un criterio semplice: se va giù, qualcuno se ne accorge subito?
CT104
Nomedocker-proxy
Cores2
RAM512 MB
RuoloReverse proxy per tutti i servizi
CT110
Nomehlabz-wb
Cores4
RAM1536 MB
RuoloSito homelabz.cc (produzione)
CT112
Nomedifferenziata-facile
Cores2
RAM768 MB
RuoloApp pubblica, utenti attivi
CT121
Nomeauthentik
Cores4
RAM3072 MB
RuoloSSO per tutti i servizi interni
CT
Nome
Cores
RAM
Ruolo
104
docker-proxy
2
512 MB
Reverse proxy per tutti i servizi
110
hlabz-wb
4
1536 MB
Sito homelabz.cc (produzione)
112
differenziata-facile
2
768 MB
App pubblica, utenti attivi
121
authentik
4
3072 MB
SSO per tutti i servizi interni
Totale: 12 core e 5888 MB di RAM. Ogni risorsa HA ha max_restart 2 e max_relocate 2: Proxmox prova a riavviare in-place due volte, poi migra sul nodo secondario.
Teniamo a mente quel numero — 5888 MB — perché tra poco diventa un problema.
La replica ZFS copre un perimetro più ampio. Otto container su dieci vengono replicati da pve a pve2 ogni 15 minuti tramite ZFS send/receive incrementale. L'ultimo sync ha richiesto circa 2.3 secondi per container, con zero errori.
I backup vzdump aggiungono un ulteriore livello. Cinque job separati per criticità: i CT critici (forgejo, intervento-facile, MyTrainingApp, n8n) hanno backup giornaliero alle 21:00 con retention a 7 giorni, 4 settimane e 2 mesi. Quelli infrastrutturali (grafana, docker-proxy, authentik) vanno al sabato alle 3 di notte. La domenica alle 4, un job offsite replica tutto su pve2.
Una nota su knet e la tolleranza ai link degradati. Il transport knet di Corosync supporta link multipli con failover automatico tra di essi. Nel mio caso uso un singolo link in modalità passive: il cluster non tenta di bilanciare il traffico tra più interfacce, ma usa quella configurata e basta.
Con link_mode passive e un singolo link, stai scommettendo tutto su una NIC e un cavo. Se pve ha la RTL8125 2.5GbE su enp9s0 che salta, il nodo diventa irraggiungibile anche se la secondaria enp4s0 (RTL8111 1GbE) è fisicamente collegata e funzionante. knet la ignora perché non è configurata come link alternativo.
È un compromesso consapevole: configurare un secondo link richiede una seconda subnet dedicata, e con il Pi già sovraccarico di ruoli non volevo aggiungere complessità di routing.
Limiti e compromessi del mio cluster Proxmox a 2 nodi
Eccoci alla parte che nessuno scrive. Ho riletto decine di tutorial su cluster Proxmox a 2 nodi con QDevice. Tutti mostrano come configurarlo. Nessuno torna sei mesi dopo a dire cosa non va.
Io lo faccio.
La RAM del nodo failover non regge il carico. I quattro container HA richiedono 5888 MB. Il nodo pve2 ha 7.7 GB totali, di cui 4.5 GB disponibili. C'è già 1.3 GB di swap attivo. Se pve muore e tutti e quattro i CT migrano su pve2, servono 5.75 GB su una macchina che ne ha 4.5 liberi. Il risultato probabile: OOM killer. Il failover che dovrebbe salvare i servizi li ammazza.
In produzione, il mio nodo principale pve (Ryzen 7 1800X, 47 GB di RAM) non suda. Ha 31 GB disponibili e zero swap. Il nodo failover, un i7-6700K con 7.7 GB, è stato comprato come macchina da stress test e riciclato nel cluster. Il test termico con Noctua NH-D15 e Thermal Grizzly Duronaut ha dimostrato che regge 300 secondi a pieno carico restando a 61 gradi. Ma i gradi non sono il collo di bottiglia. La RAM lo è.
ParametroCPU
pve (master)Ryzen 7 1800X (8C/16T)
pve2 (failover)i7-6700K (4C/8T)
ParametroRAM totale
pve (master)47 GB
pve2 (failover)7.7 GB
ParametroRAM disponibile
pve (master)31 GB
pve2 (failover)4.5 GB
ParametroSwap usato
pve (master)0 GB
pve2 (failover)1.3 GB
ParametroRAM richiesta HA
pve (master)5.75 GB
pve2 (failover)5.75 GB
ParametroBridge di rete
pve (master)vmbr0, vmbr1, vmbr2
pve2 (failover)solo vmbr0
Parametro
pve (master)
pve2 (failover)
CPU
Ryzen 7 1800X (8C/16T)
i7-6700K (4C/8T)
RAM totale
47 GB
7.7 GB
RAM disponibile
31 GB
4.5 GB
Swap usato
0 GB
1.3 GB
RAM richiesta HA
5.75 GB
5.75 GB
Bridge di rete
vmbr0, vmbr1, vmbr2
solo vmbr0
Il Raspberry Pi è un single point of failure triplo. Il Pi è gateway di rete, QDevice Corosync e IDS (AIWALL). Se il Pi muore, perdi il routing tra le subnet, perdi il terzo voto del quorum, perdi il sistema di intrusion detection. Tre funzioni critiche, un solo hardware. Non è ridondanza. È concentrazione di rischio.
I bridge mancanti su pve2. Il nodo master ha tre bridge: vmbr0 (management, 10.0.10.0/24), vmbr1 (backend, 10.10.10.0/24) e vmbr2 (docker, 10.20.20.0/24). Il nodo failover ha solo vmbr0. Tutti e quattro i CT sotto HA usano vmbr0, quindi oggi funziona. Ma se domani sposto un servizio su vmbr1 e dimentico di creare il bridge su pve2, il failover fallisce in silenzio. Nessun errore a priori. Scopri il problema solo quando serve.
Sei container senza protezione HA. Grafana, Forgejo, AIWALL, n8n-automation, intervento-facile, MyTrainingApp. Sono replicati (quasi tutti) ma non protetti dal failover automatico. Se pve muore, restano giù finché non li avvio manualmente su pve2. Ho fatto questa scelta di proposito: aggiungere HA aumenterebbe la domanda di RAM su pve2, che è già insufficiente. Un circolo vizioso.
Backup solo locale, senza protezione geografica. I cinque job vzdump salvano su dischi locali. Il job offsite della domenica replica su pve2, ma pve2 è nella stessa stanza, attaccato allo stesso UPS, sotto lo stesso tetto. Un incendio, un'alluvione, un furto: perdi tutto. Zero backup cloud, zero replica geografica.
Nessun HA group configurato. Il file groups.cfg è vuoto. Non ho definito preferenze di nodo per le risorse HA. Proxmox decide da solo dove migrare, senza sapere che pve è il nodo preferito per via della RAM. Se un failover va a buon fine e poi pve torna online, i CT non tornano automaticamente indietro. Serve un intervento manuale per ribilanciare.
Tutto questo lavoro di rete — Corosync, knet, bridge — gira su hardware che ho testato prima di metterlo in cluster. La NIC RTL8125 2.5GbE su entrambi i nodi e lo switch MokerLink reggono il traffico di replica ZFS senza sudare. Ma il collo di bottiglia non è mai stato la rete.
È sempre la RAM.
Roadmap: come correggo i limiti
Non li correggo tutti. Alcune cose costano più di quanto valgono per un homelab. Ma tre interventi sono già pianificati.
Upgrade RAM pve2 a 32 GB: il singolo intervento con il maggior impatto. Sblocca failover reale e permette di aggiungere HA sui CT mancanti.
Separare i ruoli del Pi: QDevice su un container dedicato con IP proprio, gateway e IDS su hardware separato. Elimina il single point of failure triplo.
Backup offsite su cloud: un job vzdump settimanale verso un bucket S3-compatible. Anche solo i CT critici.
I bridge mancanti su pve2 sono una correzione da 5 minuti che non ho ancora fatto per pigrizia. I gruppi HA idem. Sono nel backlog sotto la voce "cose ovvie che rimandi perché non hanno ancora rotto nulla".
Aggiornamento — aprile 2026
Dalla pubblicazione di questo articolo, tre dei sei limiti documentati sono stati risolti. Li aggiorno qui invece di riscrivere il pezzo — i compromessi originali restano come documentazione di quello che c'era.
Bridge allineati tra i nodi. Aggiunti vmbr1 (10.10.10.0/24) e vmbr2 (10.20.20.0/24) su pve2, ora identico a pve. Un failover non fallisce più silenziosamente per subnet mancanti.
HA rules al posto dei groups. Proxmox 9.1 ha sostituito i groups con il sistema rules. Configurata la regola prefer-pve con priorità pve:2, pve2:1 e tipo node-affinity. I 4 CT HA (104, 110, 112, 121) tornano automaticamente su pve quando il nodo primario rientra online.
Replica ZFS completa: 10 container su 10. Aggiunti alla replica anche CT 114 (intervento-facile) e CT 115 (MyTrainingApp), prima esclusi. Tutti i 10 container attivi sono replicati ogni 15 minuti su pve2 con zero errori. I CT storici girano in ~2,3 secondi per sync, i due nuovi in ~18-25 secondi (primo sync più pesante, si stabilizzeranno).
Punti ancora aperti:
RAM insufficiente su pve2 per failover completo — richiede upgrade hardware a 32 GB
Single point of failure triplo sul Raspberry Pi 5 — in attesa della sostituzione con MikroTik hEX S + LattePanda Alpha
Sei CT senza HA — subordinato alla risoluzione del problema RAM
Backup senza protezione geografica — la replica ZFS e il job backup-offsite-pve2 migliorano la resilienza locale, ma pve e pve2 condividono stanza e UPS
10 container replicati ogni 15 minuti, 2.3 secondi per sync, zero errori. 4 container sotto HA, 5888 MB di RAM richiesti su un nodo che ne ha 4500 disponibili. 6 limiti documentati, 3 già risolti.
La serie completa
Questa è la seconda di sei parti. Ognuna copre un aspetto dell'infrastruttura con configurazioni reali, output dal mio cluster e i problemi che ho incontrato.
Perché trattare il homelab come produzione — la filosofia e l'hardware
Cluster Proxmox con 2 nodi: Corosync, QDevice e HA — questo post
3 subnet, un Pi come firewall e VPN — segmentazione di rete e accesso remoto
SSO e 2FA su tutto con Authentik — un unico login per tutte le applicazioni
ZFS, backup e disaster recovery — proteggere i dati con budget limitato
Monitoring: sapere tutto prima che si rompa — dashboard, alert e automazioni
Ogni post è autonomo. Ma insieme raccontano una storia: si può costruire in casa un'infrastruttura di produzione affidabile senza spendere migliaia di euro e senza un datacenter.
Nella prossima parte passo alla rete: tre subnet, un Raspberry Pi come gateway/firewall, e NetBird come VPN mesh per raggiungere tutto da remoto senza esporre porte.