{"id":4,"date":"2026-01-18T20:53:00","date_gmt":"2026-01-18T20:53:00","guid":{"rendered":"https:\/\/rpi.temporiti.net\/wordpress\/blog\/strategia-backup-hot-warm-cold\/"},"modified":"2026-05-30T14:05:21","modified_gmt":"2026-05-30T12:05:21","slug":"strategia-backup-hot-warm-cold","status":"publish","type":"post","link":"https:\/\/rpi.temporiti.net\/wordpress\/?p=4","title":{"rendered":"Strategia backup Hot\/Warm\/Cold per chi parte da zero"},"content":{"rendered":"<p>Il backup, per chi gestisce un homelab, \u00e8 la prima cosa che ci si dimentica di fare e l&#8217;ultima che si vorrebbe avere quando serve davvero. Io ci sono passato: ho perso una collezione di foto del 2014 perch\u00e9 &#8220;tanto era sul NAS&#8221; e il NAS era l&#8217;unica copia. Da quella volta ho adottato un modello hot\/warm\/cold un po&#8217; rigido ma che mi tiene sereno la notte.<\/p>\n<h2>Cos&#8217;\u00e8 hot\/warm\/cold<\/h2>\n<p>\u00e8 un modo di classificare i dati in base a quanto spesso ti servono e quanto in fretta li devi rivedere:<\/p>\n<p>&#8211; <strong>Hot<\/strong>: dati che cambiano spesso e che ti servono entro minuti. File di lavoro corrente, configurazioni di servizi, snapshot recenti di database. Storage veloce, locale o quasi.<\/p>\n<p>&#8211; <strong>Warm<\/strong>: dati importanti ma non urgenti. Backup settimanali completi, archivi recenti. Object storage standard.<\/p>\n<p>&#8211; <strong>Cold<\/strong>: archivi storici, snapshot vecchi, materiale che serve &#8220;se brucia la casa&#8221;. Archive tier, costo bassissimo, ripristino lento e con costo di estrazione.<\/p>\n<p>Idealmente i dati esistono in tre copie su due supporti diversi con una copia fuori sede: la regola 3-2-1. Hot\/warm\/cold \u00e8 un modo pratico di implementarla.<\/p>\n<h2>Tier HOT con Restic su HOT_LOCAL<\/h2>\n<p>Restic fa snapshot incrementali deduplicati e cifrati. Lo uso verso un repository locale che chiamo categoricamente <code>HOT_LOCAL<\/code>, montato dal NAS in LAN: \u00e8 veloce, locale, retention lunga senza pagare nulla in pi\u00f9.<\/p>\n<p>Init del repository:<\/p>\n<pre><code class=\"language-bash\">\nrestic -r \/mnt\/HOT_LOCAL\/restic init\n<\/code><\/pre>\n<p>Backup notturno della cartella dati di un servizio:<\/p>\n<pre><code class=\"language-bash\">\nrestic -r \/mnt\/HOT_LOCAL\/restic backup \/var\/lib\/mio-servizio\n<\/code><\/pre>\n<p>Retention policy che applico settimanalmente:<\/p>\n<pre><code class=\"language-bash\">\nrestic -r \/mnt\/HOT_LOCAL\/restic forget \\\n  --keep-daily 14 --keep-weekly 8 --keep-monthly 12 --prune\n<\/code><\/pre>\n<p>Il <code>prune<\/code> libera spazio davvero, perch\u00e9 senza di lui i dati cancellati restano nel repo finch\u00e9 non passa il garbage collector.<\/p>\n<h2>Tier WARM su WARM_NFS e WARM_S3<\/h2>\n<p>La copia warm vive in due sottocategorie. Lo snapshot settimanale del repo Restic finisce su un mount NFS dedicato in rete locale (<code>WARM_NFS<\/code>) e una copia compressa va su un bucket S3-compatibile (<code>WARM_S3_GLACIER<\/code>) configurato come alias rclone:<\/p>\n<pre><code class=\"language-bash\">\nrclone sync \/mnt\/HOT_LOCAL\/restic WARM_S3_GLACIER:backup-restic \\\n  --transfers 4 --checkers 8\n<\/code><\/pre>\n<p><code>sync<\/code> riflette esattamente lo stato sorgente, quindi i file eliminati nel repo vengono eliminati anche sul bucket. Quando voglio mantenere una storia indipendente uso <code>copy<\/code> invece di <code>sync<\/code>.<\/p>\n<h2>Tier COLD su COLD_S3_GLACIER<\/h2>\n<p>Una volta al mese sposto i blocchi pi\u00f9 vecchi di sei mesi in un bucket con storage class archive. Il comando rclone, con alias categoriale <code>COLD_S3_GLACIER<\/code>:<\/p>\n<pre><code class=\"language-bash\">\nrclone move \/mnt\/HOT_LOCAL\/restic\/snapshots-old COLD_S3_GLACIER:archivio \\\n  --min-age 180d\n<\/code><\/pre>\n<p>In cold paghi pochissimo per lo storage e tanto per l&#8217;estrazione. Lo uso per cose che spero di non rivedere mai (foto del 2010, vecchi log archiviati per audit). Per i dati totalmente offline tengo anche un tier ulteriore che chiamo <code>ICE_TAPE<\/code>: un disco USB cifrato che giro ogni due mesi e tengo a casa di un familiare fidato. \u00e8 il vero off-site, slegato da qualunque cloud.<\/p>\n<h2>Un caso reale<\/h2>\n<p>Un mercoled\u00ec sera, verso le 21:15, stavo refactoring uno script di import dati e ho lanciato un <code>rm -rf<\/code> su una sottocartella sbagliata: 180 GB di dataset analitico spariti. Restic mi ha salvato in 14 minuti netti. Ho lanciato <code>restic restore latest --target \/tmp\/recover --include \/var\/lib\/dataset<\/code> puntando al repo HOT_LOCAL sul NAS, e ho ripreso il lavoro senza dover andare a tirare gi\u00f9 copie warm o cold. Il giorno dopo ho aggiunto un check periodico che verifica l&#8217;integrit\u00e0 del repo:<\/p>\n<pre><code class=\"language-bash\">\nrestic -r \/mnt\/HOT_LOCAL\/restic check --read-data-subset=10%\n<\/code><\/pre>\n<p>Lo lancio ogni due settimane: legge il 10% dei blocchi e verifica gli hash. Mi protegge da repository corrotti silenziosamente, che \u00e8 il peggior tipo di problema con i backup.<\/p>\n<h2>Cosa funziona bene<\/h2>\n<p>I tre tier sono autonomi e si validano a vicenda. Se mi muore il NAS, ho ancora warm. Se mi cancellano l&#8217;account cloud, ho ancora hot e cold offline. La cifratura Restic ha chiave persistente che tengo in due posti (gestore password + supporto offline), e senza quella nessun ripristino \u00e8 possibile, neanche per chi possiede fisicamente i bucket.<\/p>\n<h2>Limiti<\/h2>\n<p>Restic ha un costo CPU notevole sul Raspberry Pi che fa da NAS, e una verifica completa di un repo da 1 TB richiede ore. La latenza di restore da tier cold \u00e8 nell&#8217;ordine delle ore, talvolta della giornata. Bisogna pianificare un DR test almeno una volta l&#8217;anno, altrimenti sei sicuro di avere backup solo finch\u00e9 non provi a ripristinarli.<\/p>\n<h2>In pratica<\/h2>\n<p>Hot\/warm\/cold non \u00e8 una architettura, \u00e8 un modo di pensare ai dati. Lo applico anche a un homelab piccolo, perch\u00e9 obbliga a chiedersi &#8220;quanto in fretta deve tornare questo?&#8221; prima di scegliere lo strumento. Il risultato \u00e8 che dormo bene, e nessun rm distratto mi pu\u00f2 pi\u00f9 rovinare un weekend.<\/p>\n<hr>\n<blockquote>\n<p>Immagine generata con Cloudflare Workers AI \/ FLUX.<\/p>\n<\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Il backup, per chi gestisce un homelab, \u00e8 la prima cosa che ci si dimentica di fare e l&#8217;ultima che si vorrebbe avere quando serve davvero. Io ci sono passato: ho perso una collezione di foto del 2014 perch\u00e9 &#8220;tanto era sul NAS&#8221; e il NAS era l&#8217;unica copia. Da quella volta ho adottato un [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":191,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-4","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\/4","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=4"}],"version-history":[{"count":8,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4\/revisions"}],"predecessor-version":[{"id":354,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/4\/revisions\/354"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=\/wp\/v2\/media\/191"}],"wp:attachment":[{"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpi.temporiti.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}