<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Dane Wang&#39;s Blog</title>
    <subtitle>Dane Wang 的个人博客，分享技术、思考与生活</subtitle>
    <link rel="self" type="application/atom+xml" href="https://danewalters.github.io/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://danewalters.github.io/blog"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-11T10:00:00+08:00</updated>
    <id>https://danewalters.github.io/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>Backing up a NAS from SSD to HDD with restic and Backrest</title>
        <published>2026-08-11T10:00:00+08:00</published>
        <updated>2026-08-11T10:00:00+08:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://danewalters.github.io/blog/posts/nas-backup-restic-backrest/"/>
        <id>https://danewalters.github.io/blog/posts/nas-backup-restic-backrest/</id>
        
        <content type="html" xml:base="https://danewalters.github.io/blog/posts/nas-backup-restic-backrest/">&lt;p&gt;I recently designed and rolled out a backup scheme for an Ubuntu NAS: four NVMe data drives (about 13 TB of data) backed up automatically every day to two 16 TB hard drives. I ended up with &lt;strong&gt;restic&lt;/strong&gt; as the backup engine and &lt;strong&gt;Backrest&lt;/strong&gt; as the web interface. There were a fair number of architectural trade-offs and real pitfalls along the way, so here is the record.&lt;/p&gt;
&lt;h2 id=&quot;background-and-goals&quot;&gt;Background and goals&lt;a class=&quot;zola-anchor&quot; href=&quot;#background-and-goals&quot; aria-label=&quot;#background-and-goals&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The hardware, roughly:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Part&lt;/th&gt;&lt;th&gt;Spec&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;CPU&lt;/td&gt;&lt;td&gt;2× Xeon E5 (16 cores, 32 threads)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Memory&lt;/td&gt;&lt;td&gt;32 GB&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Data drives (SSD)&lt;/td&gt;&lt;td&gt;3× 4 TB NVMe + 1× 7.68 TB NVMe&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Backup drives (HDD)&lt;/td&gt;&lt;td&gt;2× 16 TB enterprise hard drives&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The four data drives are mounted at &lt;code&gt;/nas/disk1&lt;/code&gt; to &lt;code&gt;/nas/disk4&lt;/code&gt;, about &lt;strong&gt;13 TB&lt;/strong&gt; in total to back up. The largest, a 7 TB drive, is already 96% full.&lt;/p&gt;
&lt;p&gt;The goals were clear:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Automatic daily backups to the two hard drives.&lt;/li&gt;
&lt;li&gt;History: a file deleted by mistake can be recovered from a version several days back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A web UI&lt;/strong&gt; to see whether backups succeeded, browse snapshots and restore single files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Room to grow&lt;/strong&gt;: adding an SSD or HDD later must not mean redoing the structure.&lt;/li&gt;
&lt;li&gt;An alert when a backup fails.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;choosing-the-tools&quot;&gt;Choosing the tools&lt;a class=&quot;zola-anchor&quot; href=&quot;#choosing-the-tools&quot; aria-label=&quot;#choosing-the-tools&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;After comparing the options I chose &lt;strong&gt;restic + Backrest&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Against plain rsync: a UI, alerts, deduplication and compression to save space, automated retention.&lt;/li&gt;
&lt;li&gt;Against Duplicati, UrBackup and the like: Backrest is a single binary, so it is the cheapest to maintain, and restic has a mature, reliable community.&lt;/li&gt;
&lt;li&gt;The cost: backups are stored in a repository format, so restores go through the UI or the restic command. In the UI it is a matter of clicking, so it isn&#39;t much of a burden.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;overall-architecture&quot;&gt;Overall architecture&lt;a class=&quot;zola-anchor&quot; href=&quot;#overall-architecture&quot; aria-label=&quot;#overall-architecture&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&quot;storage-layout-no-raid-two-independent-file-systems&quot;&gt;Storage layout: no RAID, two independent file systems&lt;a class=&quot;zola-anchor&quot; href=&quot;#storage-layout-no-raid-two-independent-file-systems&quot; aria-label=&quot;#storage-layout-no-raid-two-independent-file-systems&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Each hard drive is &lt;strong&gt;one complete, independent file system&lt;/strong&gt;. No RAID, no merging into a big volume:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/dev/sdb1  →  /backup/hdd1   (14.6T, xfs)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/dev/sdc1  →  /backup/hdd2   (14.6T, xfs)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reasoning:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Failure isolation&lt;/strong&gt;: if one drive dies, only half the backups are lost and the other half is intact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No one-to-one mapping&lt;/strong&gt;: backup jobs are assigned to drives by free space, so a new SSD is just a new job.&lt;/li&gt;
&lt;li&gt;I dropped the earlier layout of two partitions per drive. Splitting brought no benefit and only capped the space available to a single job.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;assigning-backup-jobs&quot;&gt;Assigning backup jobs&lt;a class=&quot;zola-anchor&quot; href=&quot;#assigning-backup-jobs&quot; aria-label=&quot;#assigning-backup-jobs&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/nas/disk3 (6.3T)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; --&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;01:00&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; R1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;hdd1/repo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/nas/disk4 (1.0T)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; --&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;03:00&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; R1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    C&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/nas/disk1 (3.0T)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; --&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;01:00&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; R2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;hdd2/repo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    D&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;/nas/disk2 (2.7T)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; --&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;03:00&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; R2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Plan&lt;/th&gt;&lt;th&gt;Source&lt;/th&gt;&lt;th&gt;Size&lt;/th&gt;&lt;th&gt;Repository&lt;/th&gt;&lt;th&gt;Schedule&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;plan-disk3&lt;/td&gt;&lt;td&gt;/nas/disk3&lt;/td&gt;&lt;td&gt;6.3T&lt;/td&gt;&lt;td&gt;/backup/hdd1/repo&lt;/td&gt;&lt;td&gt;daily at 01:00&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;plan-disk4&lt;/td&gt;&lt;td&gt;/nas/disk4&lt;/td&gt;&lt;td&gt;1.0T&lt;/td&gt;&lt;td&gt;/backup/hdd1/repo&lt;/td&gt;&lt;td&gt;daily at 03:00&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;plan-disk1&lt;/td&gt;&lt;td&gt;/nas/disk1&lt;/td&gt;&lt;td&gt;3.0T&lt;/td&gt;&lt;td&gt;/backup/hdd2/repo&lt;/td&gt;&lt;td&gt;daily at 01:00&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;plan-disk2&lt;/td&gt;&lt;td&gt;/nas/disk2&lt;/td&gt;&lt;td&gt;2.7T&lt;/td&gt;&lt;td&gt;/backup/hdd2/repo&lt;/td&gt;&lt;td&gt;daily at 03:00&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A few points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;One restic repository per HDD; a repository holds snapshots from several plans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The two plans on the same HDD are staggered&lt;/strong&gt; (01:00 and 03:00) so that concurrent writes don&#39;t slow a mechanical drive down.&lt;/li&gt;
&lt;li&gt;The two HDDs can run at the same time without affecting each other.&lt;/li&gt;
&lt;li&gt;restic compresses and deduplicates, so actual usage is usually less than the source. The table sizes capacity for the worst case (nothing compressible), and it still fits.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;retention&quot;&gt;Retention&lt;a class=&quot;zola-anchor&quot; href=&quot;#retention&quot; aria-label=&quot;#retention&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;One policy everywhere: &lt;strong&gt;the last 7 daily, 4 weekly and 6 monthly snapshots&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That is, any day in the past week, one version per week within a month, and one per month within half a year. It is set per plan in the Backrest UI, and expired snapshots are pruned automatically.&lt;/p&gt;
&lt;h2 id=&quot;deployment&quot;&gt;Deployment&lt;a class=&quot;zola-anchor&quot; href=&quot;#deployment&quot; aria-label=&quot;#deployment&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&quot;rebuilding-the-hard-drive-partitions&quot;&gt;Rebuilding the hard drive partitions&lt;a class=&quot;zola-anchor&quot; href=&quot;#rebuilding-the-hard-drive-partitions&quot; aria-label=&quot;#rebuilding-the-hard-drive-partitions&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Once I had confirmed the old data on both drives was no longer needed, I rebuilt them from scratch (&lt;strong&gt;destructive; check twice before running any of this&lt;/strong&gt;):&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; After unmounting the old partitions and removing their entries from /etc/fstab:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Rebuild the partition table (one whole-disk partition per drive)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;parted&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdb&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; mklabel&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; gpt&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; mkpart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backup&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; xfs&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 0%&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 100%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;parted&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdc&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; mklabel&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; gpt&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; mkpart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backup&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; xfs&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 0%&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 100%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Format as xfs (good with large files, supported natively by Ubuntu)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;mkfs.xfs&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdb1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;mkfs.xfs&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdc1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Create mount points and add them to fstab (use UUIDs; device names can move)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;mkdir&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /backup/hdd1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /backup/hdd2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;blkid&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdb1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/sdc1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;     #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; note the two UUIDs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; Append to /etc/fstab (with the real UUIDs):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; UUID=xxxx-xxxx  /backup/hdd1  xfs  defaults,noatime  0 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; UUID=yyyy-yyyy  /backup/hdd2  xfs  defaults,noatime  0 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; daemon-reload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;mount&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;df&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /backup/hdd1&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /backup/hdd2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; each should show about 15T free&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;installing-backrest-three-pitfalls&quot;&gt;Installing Backrest: three pitfalls&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-backrest-three-pitfalls&quot; aria-label=&quot;#installing-backrest-three-pitfalls&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;This step had the most pitfalls. On a server in mainland China the official install script almost never succeeds on the first try:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Direct connections to GitHub time out&lt;/strong&gt;, so the Backrest binary has to come through a mirror.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On startup Backrest downloads restic from GitHub by itself&lt;/strong&gt;, which fails the same way. restic has to be installed by hand and its path given through an environment variable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;install.sh runs the service as the current user by default.&lt;/strong&gt; To back up every user&#39;s files it has to run as root.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The full install:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; 1. Download Backrest through a mirror (if one fails, try the ghproxy.net / gh-proxy.com prefix)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /tmp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;https://github.com/garethgeorge/backrest/releases/latest/download/backrest_Linux_x86_64.tar.gz&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;https://ghproxy.net/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;mkdir&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest_extract&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; tar&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;xzf&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest.tar.gz&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest_extract&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest_extract&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; ./install.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; 2. Install restic by hand (match the version Backrest expects; it is printed in the startup log)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /tmp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;https://github.com/restic/restic/releases/download/v0.19.1/restic_0.19.1_linux_amd64.bz2&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;https://ghproxy.net/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;O&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; restic.bz2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;bunzip2&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; restic.bz2&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 755&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; restic&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /usr/local/bin/restic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;restic&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; version&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; 3. Replace the systemd unit: run as root and point at the restic binary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; tee&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /etc/systemd/system/backrest.service&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;UNIT&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;[Unit]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Description=Backrest Service&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;After=network.target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;[Service]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Type=simple&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;User=root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Group=root&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;ExecStart=/usr/local/bin/backrest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Restart=on-failure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Environment=&amp;quot;BACKREST_PORT=127.0.0.1:9898&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Environment=&amp;quot;BACKREST_RESTIC_COMMAND=/usr/local/bin/restic&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;[Install]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;WantedBy=multi-user.target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;UNIT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; systemctl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; daemon-reload&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; systemctl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; restart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;systemctl&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; backrest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;ss&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;tlnp&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; 9898&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When running as root, the config file is &lt;code&gt;/root/.config/backrest/config.json&lt;/code&gt; and runtime data and logs live in &lt;code&gt;/root/.local/share/backrest/&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&quot;reaching-the-ui-an-ssh-tunnel&quot;&gt;Reaching the UI: an SSH tunnel&lt;a class=&quot;zola-anchor&quot; href=&quot;#reaching-the-ui-an-ssh-tunnel&quot; aria-label=&quot;#reaching-the-ui-an-ssh-tunnel&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The service listens on &lt;code&gt;127.0.0.1&lt;/code&gt; only and is not exposed to the network. To use it, open a tunnel from your own machine:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-4&quot;&gt;L&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; 9898:localhost:9898&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; user@nas-server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; then open http://localhost:9898 in a browser&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You could also listen on the LAN address with a UI password (the Backrest setup wizard insists on one), but whatever you do, &lt;strong&gt;never expose the port to the public internet&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&quot;repositories-and-plans&quot;&gt;Repositories and plans&lt;a class=&quot;zola-anchor&quot; href=&quot;#repositories-and-plans&quot; aria-label=&quot;#repositories-and-plans&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;Create the two repositories in the UI (Add Repo). The settings that matter:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Field&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Repository URI&lt;/td&gt;&lt;td&gt;/backup/hdd1/repo and /backup/hdd2/repo&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Env Vars&lt;/td&gt;&lt;td&gt;&lt;code&gt;RESTIC_READ_CONCURRENCY=8&lt;/code&gt;, &lt;code&gt;RESTIC_PACK_SIZE=64&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Prune Policy&lt;/td&gt;&lt;td&gt;1st of each month, max unused 10%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Check Policy&lt;/td&gt;&lt;td&gt;1st of each month, structure check&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Advanced&lt;/td&gt;&lt;td&gt;IO priority = IO_BEST_EFFORT_LOW, CPU priority = CPU_LOW&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;A deliberate trade-off on the repository password.&lt;/strong&gt; restic always encrypts and a password is mandatory. But the threat model here is drive failure and accidental deletion; the backup drives sit in the same machine as the sources, so encryption adds no protection. I therefore chose a simple passphrase on purpose and filed it in plain text, reducing the risk of &quot;password lost, all backups useless&quot; to zero. The cost is that if a backup drive leaves the building on its own, anyone who knows the passphrase can read it. That has to be kept in mind before sending a drive for repair or disposing of it.&lt;/p&gt;
&lt;p&gt;Then create the four plans (Add Plan) following the table above. plan-disk3, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repository: &lt;code&gt;hdd1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Paths: &lt;code&gt;/nas/disk3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Schedule: cron &lt;code&gt;0 1 * * *&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Retention: &lt;code&gt;7 daily / 4 weekly / 6 monthly&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, under Settings → Notifications, set up an alert on backup failure (Email, Discord, Slack and webhooks are supported). Don&#39;t skip this. When nobody is watching the UI, failures are buried in silence.&lt;/p&gt;
&lt;h2 id=&quot;the-first-full-backup&quot;&gt;The first full backup&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-first-full-backup&quot; aria-label=&quot;#the-first-full-backup&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;13 TB at a sustained 150 to 250 MB/s onto the hard drives comes to &lt;strong&gt;about 20 hours&lt;/strong&gt;, with the two drives running in parallel.&lt;/p&gt;
&lt;h3 id=&quot;what-about-millions-of-small-files&quot;&gt;What about millions of small files&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-about-millions-of-small-files&quot; aria-label=&quot;#what-about-millions-of-small-files&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;If the number of small files is huge (millions to tens of millions), per-file overhead adds several hours. Run &lt;code&gt;df -i /nas/disk*&lt;/code&gt; first to see each drive&#39;s inode count (the IUsed column is roughly the file count) so you know what to expect.&lt;/p&gt;
&lt;p&gt;Two tuning parameters (set as the repository&#39;s Env Vars):&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RESTIC_READ_CONCURRENCY=8    # default 2; more concurrent reads from the NVMe source, a clear win with small files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RESTIC_PACK_SIZE=64          # pack size from 16M to 64M, fewer files in the repository, kinder to HDDs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;restic packs small files into large blobs and writes them sequentially to the hard drive, so there is no &quot;one small file at a time, seeking like mad&quot; problem. Incremental backups compare metadata only and never re-read unchanged files, so the slow first run is paid once. And &lt;strong&gt;an interrupted first run is not a disaster&lt;/strong&gt;: blobs already in the repository are deduplicated and reused, so re-running is effectively a resume.&lt;/p&gt;
&lt;h3 id=&quot;how-to-run-it&quot;&gt;How to run it&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-to-run-it&quot; aria-label=&quot;#how-to-run-it&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Trigger each plan by hand with &lt;strong&gt;Backup Now&lt;/strong&gt; in the UI rather than waiting for the night&#39;s schedule.&lt;/li&gt;
&lt;li&gt;Progress is visible live in the UI, and an SSH disconnect doesn&#39;t matter because Backrest is a long-running service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Start with the smallest drive (1 TB) alone as a speed benchmark&lt;/strong&gt;: from its duration and file count, estimate the other three, and only trigger them once the rate looks right.&lt;/li&gt;
&lt;li&gt;The two plans that share a repository run &lt;strong&gt;one after the other&lt;/strong&gt;; different repositories run in parallel.&lt;/li&gt;
&lt;li&gt;Meanwhile watch the NVMe drives&#39; await with &lt;code&gt;iostat -x 5&lt;/code&gt; to confirm normal use isn&#39;t affected.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;verifying-the-backup-not-optional&quot;&gt;Verifying the backup (not optional)&lt;a class=&quot;zola-anchor&quot; href=&quot;#verifying-the-backup-not-optional&quot; aria-label=&quot;#verifying-the-backup-not-optional&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;A backup whose restore has never been tested is not a backup.&lt;/strong&gt; After the first full run:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open any snapshot in the UI, browse the file tree, and confirm the directory structure is complete.&lt;/li&gt;
&lt;li&gt;Pick a few files, Restore them to &lt;code&gt;/tmp&lt;/code&gt;, and compare sha256 with the originals.&lt;/li&gt;
&lt;li&gt;Run Prune and Check (restic&#39;s integrity check) once on each repository.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I walked through the whole procedure in a test environment first (Tencent Cloud, Ubuntu 24.04, two loop devices standing in for the HDDs): incremental backups finished in seconds, files restored from an old snapshot were byte-for-byte identical to the pre-incident originals, file names with Chinese characters and spaces and symlinks all came back intact, and &lt;code&gt;restic check&lt;/code&gt; reported no errors on either repository. The three install pitfalls above were all found in that test round.&lt;/p&gt;
&lt;h2 id=&quot;day-to-day-operation&quot;&gt;Day-to-day operation&lt;a class=&quot;zola-anchor&quot; href=&quot;#day-to-day-operation&quot; aria-label=&quot;#day-to-day-operation&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;A weekly glance&lt;/strong&gt;: are the last runs of all four plans green in the UI, and how is free space on the backup drives trending in &lt;code&gt;df -h&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adding an SSD&lt;/strong&gt;: format and mount it as &lt;code&gt;/nas/disk5&lt;/code&gt;, Add Plan in the UI pointing at the repository with more free space, schedule it clear of that repository&#39;s existing plans, and run the first full backup by hand. Nothing existing is touched; about five minutes of configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adding an HDD&lt;/strong&gt;: partition, format and mount it as &lt;code&gt;/backup/hdd3&lt;/code&gt;, Add Repo for a new repository, and point new plans at it. Old repositories and plans stay as they are.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When space runs low&lt;/strong&gt;, in order: tighten retention → prune by hand → add a third HDD.&lt;/p&gt;
&lt;h2 id=&quot;restore-cheat-sheet&quot;&gt;Restore cheat sheet&lt;a class=&quot;zola-anchor&quot; href=&quot;#restore-cheat-sheet&quot; aria-label=&quot;#restore-cheat-sheet&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Situation&lt;/th&gt;&lt;th&gt;What to do&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;A file or directory deleted by mistake&lt;/td&gt;&lt;td&gt;UI → pick a snapshot → browse the tree → Restore&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;A whole SSD failed&lt;/td&gt;&lt;td&gt;Mount the replacement at the original path → Restore the latest snapshot in full&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The Backrest service is down&lt;/td&gt;&lt;td&gt;The backups are unaffected; use the CLI: &lt;code&gt;restic -r /backup/hdd1/repo snapshots&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;The whole server is lost&lt;/td&gt;&lt;td&gt;Plug the hard drives into any Linux machine and restore with restic and the repository password&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;what-this-scheme-does-and-does-not-protect-against&quot;&gt;What this scheme does and does not protect against&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-this-scheme-does-and-does-not-protect-against&quot; aria-label=&quot;#what-this-scheme-does-and-does-not-protect-against&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;It is important to be honest about &lt;strong&gt;what this protects against and what it doesn&#39;t&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Covered&lt;/strong&gt;: drive failure, accidental deletion, file system corruption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not covered&lt;/strong&gt;: whole-machine disasters. A power fault that fries the drives, ransomware encrypting every mounted volume, fire or flood. The SSDs and the backup HDDs are in the same machine.&lt;/p&gt;
&lt;p&gt;If part of the data is irreplaceable, add an off-site layer. restic backs up natively to S3-compatible object storage (Alibaba Cloud OSS, Tencent Cloud COS, Backblaze B2 and others); add a remote repository and a plan in Backrest and the existing structure stays untouched.&lt;/p&gt;
&lt;p&gt;I also recommend drive health monitoring alongside: &lt;code&gt;smartmontools&lt;/code&gt; and &lt;code&gt;nvme-cli&lt;/code&gt; for write endurance and reallocated sectors, or &lt;strong&gt;Scrutiny&lt;/strong&gt; for a web dashboard of SMART health. It complements Backrest: one watches the backups, the other watches the drives.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary&quot; aria-label=&quot;#summary&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The core trade-offs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No RAID, two independent file systems&lt;/strong&gt;: failure isolation in exchange for half the backups always being intact.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A deliberately simple repository password&lt;/strong&gt;: under this threat model encryption adds nothing, and losing the password is the real risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Staggered plans on the same drive, parallel across drives&lt;/strong&gt;: respect the physics of mechanical disks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verifying restores is part of the deployment&lt;/strong&gt;: an unverified backup is not a backup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The tools themselves (restic + Backrest) are the least important part. Swap in a different pair and these decisions still hold.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Home network notes: a side router for transparent proxying</title>
        <published>2026-04-13T14:00:00+08:00</published>
        <updated>2026-04-13T14:00:00+08:00</updated>
        
        <author>
          <name>Unknown</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://danewalters.github.io/blog/posts/soft-router-setup/"/>
        <id>https://danewalters.github.io/blog/posts/soft-router-setup/</id>
        
        <content type="html" xml:base="https://danewalters.github.io/blog/posts/soft-router-setup/">&lt;p&gt;I recently spent some time reworking the network at home. The goal was simple: everyday traffic goes through the main router, and when I need a proxy I switch to the side router&#39;s Wi-Fi. Here is the whole setup and the pitfalls along the way.&lt;/p&gt;
&lt;h2 id=&quot;choosing-an-approach&quot;&gt;Choosing an approach&lt;a class=&quot;zola-anchor&quot; href=&quot;#choosing-an-approach&quot; aria-label=&quot;#choosing-an-approach&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;There are two common ways to proxy a home network:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flash the main router.&lt;/strong&gt; All traffic goes through the proxy, but flashing risks bricking the device, and any problem takes the whole household offline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A side router.&lt;/strong&gt; A separate device does the proxying while the main router stays untouched. Neither affects the other.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I went with the side router. The main router stays stable and serves the whole family; the side router serves only the devices that need a proxy.&lt;/p&gt;
&lt;h2 id=&quot;topology&quot;&gt;Topology&lt;a class=&quot;zola-anchor&quot; href=&quot;#topology&quot; aria-label=&quot;#topology&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt; LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Fibre modem&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; --&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Main router&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    B &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; C&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;GL.iNet BE6500&amp;lt;br/&amp;gt;side router&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    B &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-.-|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Wi&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Fi A&amp;lt;br/&amp;gt;no proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; D&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Phones / TV / ...&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt;    C &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-.-|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Wi&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Fi B&amp;lt;br/&amp;gt;proxied&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-12&quot;&gt; E&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt;Work laptop / ...&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;strong&gt;fibre modem&lt;/strong&gt; dials up (or runs in bridge mode) and feeds the main router.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;main router&lt;/strong&gt; handles DHCP and the everyday Wi-Fi (Wi-Fi A) for everyone.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;GL.iNet BE6500&lt;/strong&gt; is the side router: its uplink plugs into the main router, and it broadcasts its own Wi-Fi (Wi-Fi B).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The end result is two Wi-Fi networks at home:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Wi-Fi&lt;/th&gt;&lt;th&gt;Router&lt;/th&gt;&lt;th&gt;Proxy&lt;/th&gt;&lt;th&gt;Used for&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi A&lt;/td&gt;&lt;td&gt;Main router&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Everyday browsing, video, IoT devices&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Wi-Fi B&lt;/td&gt;&lt;td&gt;GL.iNet BE6500&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Work, development, research&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Need the proxy? Join Wi-Fi B. Don&#39;t? Join Wi-Fi A. Switching costs next to nothing.&lt;/p&gt;
&lt;h2 id=&quot;why-the-gl-inet-be6500&quot;&gt;Why the GL.iNet BE6500&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-the-gl-inet-be6500&quot; aria-label=&quot;#why-the-gl-inet-be6500&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;While picking a side router I considered a small x86 box (an N100 or similar), but settled on the GL.iNet BE6500:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenWrt out of the box.&lt;/strong&gt; The firmware is a customised OpenWrt, so there is nothing to flash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enough hardware.&lt;/strong&gt; Wi-Fi 7 and a 2.5G port, plenty of headroom for a proxy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Small.&lt;/strong&gt; It fits in the network cabinet or on a desk, and unlike a mini PC it doesn&#39;t need a separate access point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in Wi-Fi.&lt;/strong&gt; The side router broadcasts its own network, which saves buying an AP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I didn&#39;t want to flash firmware or maintain another small computer. An OpenWrt device that works out of the box was exactly right for me.&lt;/p&gt;
&lt;h2 id=&quot;configuration-notes&quot;&gt;Configuration notes&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuration-notes&quot; aria-label=&quot;#configuration-notes&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id=&quot;main-router&quot;&gt;Main router&lt;a class=&quot;zola-anchor&quot; href=&quot;#main-router&quot; aria-label=&quot;#main-router&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;The main router barely needs touching. A normal setup is enough:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DHCP enabled&lt;/li&gt;
&lt;li&gt;WAN port to the fibre modem, one LAN port to the BE6500&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;be6500&quot;&gt;BE6500&lt;a class=&quot;zola-anchor&quot; href=&quot;#be6500&quot; aria-label=&quot;#be6500&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;GL.iNet&#39;s admin panel is friendly, but underneath it is still OpenWrt, and you can open LuCI for finer control:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-3&quot;&gt; SSH into the BE6500&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-d-7&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-6&quot;&gt; root@192.168.8.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The settings that matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WAN port&lt;/strong&gt;: connected to the main router&#39;s LAN, getting its IP from the main router&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LAN&lt;/strong&gt;: a different subnet (for example &lt;code&gt;192.168.8.1&lt;/code&gt;) with DHCP enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wi-Fi&lt;/strong&gt;: set the SSID and password. This is your proxied Wi-Fi&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy&lt;/strong&gt;: configure the proxy tool in OpenWrt so that all traffic from Wi-Fi B goes through it automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;dns&quot;&gt;DNS&lt;a class=&quot;zola-anchor&quot; href=&quot;#dns&quot; aria-label=&quot;#dns&quot;&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;DNS is where things go wrong most easily. The side router&#39;s DNS queries have to go through the proxy too, otherwise DNS poisoning will make sites fail to load. Make sure that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the BE6500&#39;s DNS points at the local resolver provided by the proxy tool&lt;/li&gt;
&lt;li&gt;it does not use the main router&#39;s DNS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;living-with-it&quot;&gt;Living with it&lt;a class=&quot;zola-anchor&quot; href=&quot;#living-with-it&quot; aria-label=&quot;#living-with-it&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;After a few weeks I&#39;m happy with it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Easy switching.&lt;/strong&gt; Phones and laptops just change Wi-Fi; no client software needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No interference.&lt;/strong&gt; The family on Wi-Fi A is completely unaffected, with no drop in speed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stable.&lt;/strong&gt; The BE6500 has run for weeks without a reboot. OpenWrt is dependable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The only small downside is one more Wi-Fi network in the house, which hardly counts as a problem.&lt;/p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;a class=&quot;zola-anchor&quot; href=&quot;#summary&quot; aria-label=&quot;#summary&quot;&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;If you have a similar need, the side router approach is worth trying. The main router stays as it is, the family&#39;s connection is untouched, and using the proxy means switching Wi-Fi. For anyone who doesn&#39;t want to flash firmware, the GL.iNet line is a good choice: OpenWrt underneath, with all the extensibility that brings.&lt;/p&gt;
</content>
        
    </entry>
</feed>
