<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anarch157a's Blog (Posts about homelab)</title><link>https://www.anarch157a.com/</link><description></description><atom:link href="https://www.anarch157a.com/categories/cat_homelab.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2026 &lt;a href="mailto:anarch+nospam@replace_this_by_the_blog_domain.com"&gt;Anarch157a&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Sat, 07 Nov 2026 04:03:44 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Do you even backup ?</title><link>https://www.anarch157a.com/posts/do-you-even-backup/</link><dc:creator>Anarch157a</dc:creator><description>&lt;h4&gt;A tale of a near disaster&lt;/h4&gt;
&lt;p&gt;A couple of weeks ago I had a scare that shook me to my core. It happened when I, for some random reason, logged into my homelab server from work, an for some even more random reason, typed &lt;code&gt;zpool status&lt;/code&gt;. For the two of you who don't know what the zpool command does, it's the tool to manage ZFS, a most amazing filesystem, created by the much missed Sun Microsystems.&lt;/p&gt;
&lt;p&gt;By now you should be starting to have an idea of where this is going, but first a quick description of my homelab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hardware&lt;/li&gt;
&lt;li&gt;An El-cheapo desktop motherboard with a Ryzen 3600 CPU and 32 GB of RAM&lt;/li&gt;
&lt;li&gt;Two add-in network cards for the firewall&lt;/li&gt;
&lt;li&gt;A M.2 SSD for boot, a small-ish SATA SSH for local files&lt;/li&gt;
&lt;li&gt;Two 8 TB spinning rust SATA disks in a ZFS pool&lt;/li&gt;
&lt;li&gt;Software&lt;/li&gt;
&lt;li&gt;Proxmox on bare metal as Hypervisor&lt;/li&gt;
&lt;li&gt;OPNSense firewall in a virtual machine, using the two ad-in NICs&lt;/li&gt;
&lt;li&gt;Home Assistant on a VM&lt;/li&gt;
&lt;li&gt;Assorted LCX containers (SearxNG, Pihole, Forgejo, Jellyfin, Arr suite, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, anyone with a Jellyfin instance running at home undertands why 8TB storage is necessary. Imagine how awfull it would be if all that was gonne in a puff of smoke...&lt;/p&gt;
&lt;p&gt;And that's what almost happened. Or could have happened. Because on that random day, the status of the pool was &lt;strong&gt;DEGRADED&lt;/strong&gt;!!! One of the disks had failed and there lots and lots of scarry messages in syslog, like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="nl"&gt;T23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;59.780603&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxymoxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;360017.678925&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sdb&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tag#10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Result&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hostbyte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DID_BAD_TARGET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;driverbyte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DRI&lt;/span&gt;
&lt;span class="n"&gt;VER_OK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cmd_age&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="nl"&gt;T23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;59.780626&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxymoxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;360017.678944&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sdb&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tag#10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;CDB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ATA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;through&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;e5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="nl"&gt;T23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;59.809459&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxymoxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pve&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;firewall&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1747&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;update&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;iptables_restore_cmdlist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;`&lt;/span&gt;&lt;span class="n"&gt;ip6tables&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;restore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="s1"&gt;' or '&lt;/span&gt;&lt;span class="n"&gt;ip6t&lt;/span&gt;
&lt;span class="n"&gt;ables&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;restore&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--help' for more information.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Fortunatelly, those are non-fatal errors. Most likelly a temporary issue whith a SATA cable. After getting home, I turned the server off, shuffled and reseated the cables and the disk came back online, the pool automatically resilvered the affected disk and everything ended up fine, right ? Right ?&lt;/p&gt;
&lt;h4&gt;No, it was not fine&lt;/h4&gt;
&lt;p&gt;What if the faillure had been catastrophic ? I can´t fathom losing terabytes of &lt;del&gt;hentai&lt;/del&gt;, &lt;del&gt;porn&lt;/del&gt;, films, series, music and other suff that I hoarded over the &lt;del&gt;years&lt;/del&gt;decades...&lt;/p&gt;
&lt;p&gt;What to do then ? Well, get off my ass and eat my own dog food. Time to set up automated, regular &lt;strong&gt;backups&lt;/strong&gt;!&lt;/p&gt;
&lt;h4&gt;How, and most important, where&lt;/h4&gt;
&lt;p&gt;Backing up on a local disk, no matter if it's inside the "server" itself or a USB enclosure, is not enough by itself. The same event that destroys the computer can make a USB drive unavailable too (floods, fire, theft, stupidity, etc.). A good backup strategy puts a copy outside the premisses. It's the famous "3-2-1 rule": 3 copies, 2 media types, 1 of them off-site.&lt;/p&gt;
&lt;p&gt;Ok, then, so how do we do it in a home lab ? Well, my solution was involved first buying a new HDD, the same size as the two on my ZFS pool. The idea is that two drives of the exact same age have a high probability of failling within a short timeframe. Mine are almost 4 years old, so they should be considered a moderate risk. A new drive on the pool will make it less likelly to be completely destroyed on a single event, and releases one of the old drives to be used as backup media. But, but, but... use and &lt;em&gt;internal&lt;/em&gt; drive for backups ? Yes. I configured the SATA ports to hot-swap mode, so the extra HDD can be considered removable media. No problem here, it's job is to help with the recovery of accidentally deleted data, not recovery from massive hardware loss or other types of catastrophic events.&lt;/p&gt;
&lt;p&gt;That's the job of Hetzner.&lt;/p&gt;
&lt;p&gt;I moved my personal VPS to Hetzner about a year ago, and they've been pretty good so far. One of the products they offer fits my backup needs like a glove, it's called &lt;a href="https://www.hetzner.com/storage/storage-box/"&gt;Storage Box&lt;/a&gt; and besides being reasonably priced, it supports an impressive list of acces methods, including native to suport for &lt;a href="https://www.borgbackup.org/"&gt;Borg Backup&lt;/a&gt;, which means no need for hacks or kludges or sync scripts. Just point Borg to the Storage Box and that's it. Plus, I can backup this very website and the other stuff hosted in the same VPS (Nextcloud, Mailcow and Vaultwarden being the the more important) at no extra cost.&lt;/p&gt;
&lt;p&gt;As for the details of &lt;em&gt;how&lt;/em&gt;, well, Borg Backup, of course. But the nitty-gritty deets will be on a post of their own. They're boring, they're technical and they're even longer than this post already is.&lt;/p&gt;
&lt;p&gt;So, if you're really insterest in all that, stay tunned.&lt;/p&gt;</description><category>backup</category><category>homelab</category><category>selfhosting</category><category>tech</category><guid>https://www.anarch157a.com/posts/do-you-even-backup/</guid><pubDate>Thu, 05 Nov 2026 17:37:26 GMT</pubDate></item></channel></rss>