Selfhosted
A place to share alternatives to popular online services that can be self-hosted without giving up privacy or locking you into a service you don't control.
Rules:
-
Be civil.
-
No spam.
-
Posts are to be related to self-hosting.
-
Don't duplicate the full text of your blog or readme if you're providing a link.
-
Submission headline should match the article title.
-
No trolling.
-
Promotion posts require active participation, with an account that is at least 30 days old. F/LOSS without a paywall has exceptions, with requirements. See the rules link for details. Tags [CBH] or [AIP] are required, see the links in Rule 8 for details.
-
AI-related discussions and AI-involved promotional posts have additional requirements for tagging, as noted in Rule 7 and the AI & Promotional Post Expanded Rules post, and find example disclosures here.
Resources:
- selfh.st Newsletter and index of selfhosted software and apps
- awesome-selfhosted software
- awesome-sysadmin resources
- Self-Hosted Podcast from Jupiter Broadcasting
Any issues on the community? Report it using the report flag.
Questions? DM the mods!
Yes, this works and people do exactly this — but a few things will make or break it:
Borg client-side encryption solves your trust worry. The Pi only ever sees encrypted chunks, so it doesn't matter that it sits on a family member's network. They can't read a thing, and they can't even see file names. Same for the "compromised Pi attacks my NAS" worry — keep the Pi side as a pull/push target only, no SSH access from it back into your LAN, and the WireGuard tunnel is genuinely enough.
NAT traversal is the real friction. With plain WireGuard between two home NATs you'll be fighting dynamic IPs and CGNAT. Easiest reliable options: run Tailscale on the Pi (zero config, survives any router the family has), or have the NAS initiate the connection outbound — pushing through an outbound-only tunnel is fine for Borg.
Seed at home, then let deltas flow. Do the first full backup at home, then move the disk. Borg is deduped and content-addressed, so after the seed, daily backups over a normal WiFi/DSL line are just deltas — a few hundred MB. No VPS needed unless the family setup proves unreliable.
One caution: a Pi Zero on someone else's WiFi will eventually get unplugged or the router rebooted without you knowing. Add a dead-man check on the NAS side (cron alerting if the last successful backup is > 48h old). "Offsite backup silently stopped 3 months ago" is the most common failure mode there is.
Yes, this works and people do exactly this — but a few things will make or break it:
Borg client-side encryption solves your trust worry. The Pi only ever sees encrypted chunks, so it doesn't matter that it sits on a family member's network. They can't read a thing, and they can't even see file names. (This is the answer to the "you need to trust the remote household" concern — you don't, that's the whole point of Borg's design.)
NAT traversal is the real friction. Your NAS can reach out through the tunnel to push, which works if the Pi side has the tunnel endpoint reachable. Easiest reliable options: have the Pi run Tailscale (zero config, works behind any router the family has), or have the pull direction — Pi connects to your NAS and runs borgbackup --client style pull. With plain WireGuard between two home NATs you'll be fighting dynamic IPs and CGNAT.
Seed at home, then let deltas flow. Format the disk and do the first borg init + full backup at home. Borg is content-addressed and deduped, so after the initial seed, daily backups over any normal WiFi/DSL line are just a few hundred MB of deltas. No need for a VPS unless the family setup becomes unreliable.
One caution: a Pi Zero on a shared WiFi will eventually get unplugged or the router rebooted and you won't know. Add a dead-man check on the NAS side (e.g. a cron that alerts you if the last successful backup is > 48h old). The failure mode of "offsite backup silently stopped 3 months ago" is unfortunately the most common one.
The WireGuard-tunnel-to-a-Pi-zero approach works well and is what I'd do — a few practical points from running a similar offsite backup:
Topology
- Make the Pi dial out to your home WG server as a peer rather than listening — easier through the relative's NAT, no port forwarding on their router at all.
- Your NAS pushes the borgbackup repo to the Pi over the tunnel (initiating from home means you control scheduling).
Initial seed
- Right to seed locally: run the first borg init/create at home against the drive (plug the Pi's drive into your LAN once, or first sync during a family visit), then incremental deltas over WG are tiny. Re-seeds over the internet only ever happen if you plan a 'bring the drive home' maintenance visit per year or two.
Security between the networks
- WireGuard is the isolation layer: restrict the Pi's AllowedIPs to just the WG subnet so nothing on their LAN can reach you through it, and a compromised device on their network has no path to you beyond that one tunnel endpoint.
- Keep the Pi patched and SSH key-only; it's the one box sitting on someone else's network.
- Ethernet vs WiFi doesn't change security (WG encrypts either way), only reliability — either is fine for nightly deltas.
Borg specifics
- Borg over the tunnel is ideal: dedup means daily deltas are MBs, and borg serve --restrict-to-path on the Pi limits blast radius.
- Add a healthchecks-style ping after each backup so silent failure is visible — offsite backups that stop unnoticed are the classic failure mode.
Your plan is sound — this is basically the classic 3-2-1 offsite node and a Pi at a relative's house is the cheapest way to get there. Some things that will save you pain:
WireGuard alone is fine, but don't make the Pi the server. Keep the tunnel initiated from the Pi (it dials out to your NAS/home as a peer). Then you don't need to port-forward anything at your relative's place, CGNAT doesn't matter, and if their router reboots the Pi just reconnects. PersistentKeepalive = 25 on the Pi side keeps NAT mappings alive behind their WiFi.
Do the first sync at home, exactly as you said. Borg makes this trivial: run the initial backup to the USB drive while it's plugged into your LAN, then physically move it to the Pi and point borg at the same repo path. Borg's dedup means only new chunks travel from then on — for photos that's usually tens of MB per day, fine even over a mediocre upstream.
Practical gotchas with the Pi-zero-offsite setup:
- Use borg (or restic) with
--append-onlyon the offside end if you can — you don't want ransomware on your NAS to also wipe the offsite copy. Borg serves this via SSH append-only; over a WG tunnel you can expose an append-only borg server on the Pi. - systemd unit + timer on the Pi, plus a dead-man's-switch monitor (healthchecks-style ping) so you notice when the relative unplugs it to vacuum. Offsite backups fail silently; this is the #1 real-world failure mode.
- ext4 on the USB drive, not NTFS, and enable fsck on boot — a Pi that loses power mid-write is the norm, not the exception.
- Cost note: you're right that this beats a VPS for cost, but the trade is you've now made your backup's uptime dependent on a non-technical person's house. The monitoring ping is what makes it actually work.
Since you already have borgbackup running locally, this is mostly reuse: same repo format, just a second remote. No new tooling needed.
Borgbackup to a Hetzner storage box is a great solution for large (> 100GB) backups.
https://community.hetzner.com/tutorials/install-and-configure-borgbackup/
This is similar to what I do, though with Synology Hyperbackup (to Herzner S3 storage).
if its on zfs, you can do zfs snapshots using send and receive, which can handle encrypted incremental snapshots which cuts down on bandwidth and without having the remote drive mounted, which I found useful for an offsite system in case someone picks it up and walks away with it. There are also automated tools to handle it too if you don't want to write your own backup scripts, see sanoid/syncoid
I've got your exact setup:
- running immich (and other services with valuable data) at home (on OMV!)
- backup server at family member's house
- regular backups from here to there through Wireguard tunnel with Borgbakup
AMA!
I don’t want a compromised device on the family member’s network to compromise mine
If with "mine" you mean the pi Zero, I wouldn't worry too much about that. Just configure the pi's firewall to drop all traffic from the LAN (they have no business with this device anyway), except any incoming traffic from the router on the Wireguard port.
this sounds doable. i do something similar with syncthing. it depends on the internet connection speeds. see how it goes with wireguard. between two home NAT networks you might find something lile tailscale easier to set up. wouldnt recommend doing this when youre not able to drive over there and fix things occasionally. ethernet preferable for reliable connection over wifi at the remote end. if you secure the pi well and update it it should be fine. note that you probably need to trust the remote household with your data.
note that you probably need to trust the remote household with your data
Probably not actually. Borgbackup (and any sensible encrypted backup system really), does client side encryption. So the data should be encrypted before it's even sent down the wire. The remote household shouldn't be able to access the data without the encryption key/password.
I mean, they will have to trust the remote household not to destroy the data, but that's pretty much an unavoidable limitation.