{"id":10,"date":"2026-04-05T21:30:00","date_gmt":"2026-04-05T19:30:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/blog\/disaster-recovery-piccolo-homelab\/"},"modified":"2026-05-30T14:05:53","modified_gmt":"2026-05-30T12:05:53","slug":"disaster-recovery-piccolo-homelab","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=10","title":{"rendered":"Disaster Recovery per il mio Homelab"},"content":{"rendered":"<p>Disaster Recovery suona come una di quelle parole che gli enterprise usano per fare bei diagrammi. In un homelab significa una cosa molto pi\u00f9 pragmatica: se domani brucia il modem, sparisce il NAS, mi rubano il portatile, in quanto tempo posso ricostruire e quanto ho perso? Per me la risposta deve essere: poche ore di lavoro, al massimo una settimana di dati.<\/p>\n<p>Qui descrivo come ho messo in piedi un piano DR per il mio piccolo homelab, costo annuale qualche euro, recupero garantito.<\/p>\n<h2>Cosa salvare<\/h2>\n<p>Prima ancora di scegliere strumenti, ho fatto la lista di cosa &#8220;duole&#8221; davvero perdere:<\/p>\n<p>&#8211; <strong>Configurazioni di sistema<\/strong>: <code>\/etc<\/code> dei vari host, unit systemd custom, vhost nginx\/apache, certificati Let&#8217;s Encrypt<\/p>\n<p>&#8211; <strong>Dati di servizi<\/strong>: database (Snipe-IT, Vikunja, Grafana, InfluxDB), volumi Docker persistenti<\/p>\n<p>&#8211; <strong>Foto e documenti personali<\/strong>: archivio storico, scansioni, materiale di lavoro<\/p>\n<p>&#8211; <strong>Codice sorgente<\/strong>: progetti personali, repo git che non vivono su forge remote<\/p>\n<p>&#8211; <strong>Note e wiki<\/strong>: knowledge base personale<\/p>\n<p>ci\u00f2 che invece NON salvo: ISO di OS (riscaricabili), cache di servizi, snapshot intermedi di backup (sarebbe ridondante).<\/p>\n<h2>Strumenti<\/h2>\n<p>Tre soli, ben rodati:<\/p>\n<p>&#8211; <strong>rsync<\/strong> per copie incrementali rapide, locali e su NAS<\/p>\n<p>&#8211; <strong>restic<\/strong> per backup cifrati deduplicati, locali e remoti<\/p>\n<p>&#8211; <strong>rclone<\/strong> per portare backup verso object storage cloud su tier gratuiti<\/p>\n<p>Niente custom script complicati, niente backup tool esotici. Cose che funzionano da quindici anni e funzioneranno tra quindici.<\/p>\n<h2>Layer 1: snapshot locali con rsync<\/h2>\n<p>Ogni notte alle 02:00 un job cron fa snapshot delle directory critiche su un disco USB attaccato al server principale. Il comando:<\/p>\n<pre><code class=\"language-bash\">\nrsync -aH --delete --link-dest=\/mnt\/usb\/backup\/yesterday \\\n  \/etc \/home\/user\/Documenti \/var\/lib\/docker\/volumes \\\n  \/mnt\/usb\/backup\/today\n<\/code><\/pre>\n<p><code>--link-dest<\/code> fa hardlink ai file invariati rispetto a ieri: 30 giorni di snapshot occupano circa lo spazio di uno solo, pi\u00f9 i delta. Ruoto <code>today<\/code> su <code>yesterday<\/code> con un secondo job mattutino.<\/p>\n<p>\u00e8 il &#8220;recovery time&#8221; pi\u00f9 veloce: copio indietro con <code>cp -a<\/code> e sono operativo in minuti.<\/p>\n<h2>Layer 2: restic verso NAS<\/h2>\n<p>Una volta al giorno, dopo gli snapshot rsync, lancio restic verso un repository sul NAS:<\/p>\n<pre><code class=\"language-bash\">\nrestic -r \/mnt\/nas\/restic backup \/mnt\/usb\/backup\/today \\\n  --exclude-caches --tag daily\n<\/code><\/pre>\n<p>Restic \u00e8 incrementale, cifrato con chiave persistente, deduplicato a livello blocco. La password del repo sta in due posti: gestore password e supporto offline cartaceo. Senza, nessun ripristino \u00e8 possibile, neanche fisicamente.<\/p>\n<h2>Layer 3: rclone verso object storage<\/h2>\n<p>Settimanalmente sincronizzo il repo restic verso un bucket S3-compatibile su tier gratuito di un cloud provider:<\/p>\n<pre><code class=\"language-bash\">\nrclone sync \/mnt\/nas\/restic OFFSITE_S3:dr-restic \\\n  --transfers 4 --bwlimit 5M\n<\/code><\/pre>\n<p><code>--bwlimit 5M<\/code> evita che il backup notturno saturi la mia banda. <code>OFFSITE_S3<\/code> \u00e8 un alias generico in <code>~\/.config\/rclone\/rclone.conf<\/code>, configurato con credenziali read-write per un singolo bucket, niente account-level.<\/p>\n<h2>Layer 4: copia fredda offline<\/h2>\n<p>Ogni due mesi giro un disco USB cifrato con LUKS, contenente l&#8217;ultima snapshot restic, e lo deposito a casa di un familiare. \u00e8 il vero off-site, indipendente da qualunque cloud. Se domani tutti i miei cloud provider mi cancellassero l&#8217;account, avrei comunque una copia rilevante.<\/p>\n<h2>Un caso reale<\/h2>\n<p>Un marted\u00ec sera, verso le 21:00, l&#8217;SSD USB del mio server principale ha smesso di rispondere. SMART pulito fino al giorno prima, ma il dispositivo era diventato read-only per un crash del controller. Servizi gi\u00f9: Snipe-IT, Vikunja, dashboard Grafana, repo git locali. Ho sostituito il disco con uno nuovo il mattino dopo, installato Debian fresco, ripristinato <code>\/etc<\/code> e <code>\/var\/lib\/docker\/volumes<\/code> con un <code>restic restore latest --target \/<\/code> dal repo NAS, e in due ore e mezza tutto era di nuovo online. RPO finale: 18 ore di dati persi (l&#8217;ultimo snapshot era della notte precedente). RTO: due ore e mezza dal momento del primo comando. Senza i tre layer mi sarei trovato a reinstallare e riconfigurare ogni servizio a mano, una giornata buona.<\/p>\n<h2>Cosa funziona bene<\/h2>\n<p>Pi\u00f9 layer = pi\u00f9 tranquillit\u00e0. Anche se un layer si compromette (ransomware su cloud, NAS che muore, password persa), gli altri reggono. Restic deduplica e cifra in modo trasparente: il bucket cloud non vede mai dati in chiaro. Tutto \u00e8 scriptabile e testabile fuori dall&#8217;emergenza.<\/p>\n<h2>Limiti<\/h2>\n<p>Il DR test \u00e8 il pezzo che si tende a saltare. Una volta l&#8217;anno faccio un ripristino simulato su una macchina nuova, partendo solo dalla password restic e dall&#8217;accesso al bucket cloud. \u00e8 scomodo, ma \u00e8 l&#8217;unico modo per sapere se il piano funziona davvero. Restic verifica integrit\u00e0 via <code>check<\/code>, ma non garantisce che tu sappia ancora come usarlo dopo dieci mesi che non lo lanci.<\/p>\n<h2>In pratica<\/h2>\n<p>DR per un homelab non \u00e8 un progetto enterprise, \u00e8 una disciplina quotidiana di tre comandi automatizzati e un disco da ruotare ogni tanto. Costa meno di un servizio SaaS, d\u00e0 pi\u00f9 garanzie, ed \u00e8 l&#8217;unica cosa che si parla davvero quando il disco fisico decide che oggi non gli va pi\u00f9 di rispondere.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con Cloudflare Workers AI \/ FLUX.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Disaster Recovery suona come una di quelle parole che gli enterprise usano per fare bei diagrammi. In un homelab significa una cosa molto pi\u00f9 pragmatica: se domani brucia il modem, sparisce il NAS, mi rubano il portatile, in quanto tempo posso ricostruire e quanto ho perso? Per me la risposta deve essere: poche ore di [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":184,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-10","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-storage-e-backup"],"_links":{"self":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=10"}],"version-history":[{"count":9,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10\/revisions"}],"predecessor-version":[{"id":359,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/10\/revisions\/359"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/184"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}