My home NAS setup: a dive into the unknown
Building a silent TrueNAS server for family photos, films and backups, and how it has changed since: Jellyfin on the NAS only, Storj's new pricing and an honest look at RAIDZ1.
There’s a lot going on in the world, and it feels like time to become that little bit more self-reliant with my personal data, and a little less reliant on big tech hosted mainly overseas (he says, typing into Notion on a MacBook).
Info
Updated October 2026: Changes reflect TrueNAS SCALE rename to TrueNAS Community Edition, Storj pricing changes, and updates to how I host Jellyfin.
Like many of us, I’ve got years of digital detritus: thousands of photos stored across cloud services, digitised family VHS tapes, personal files and a growing media collection. It’s time to get organised.
So here are the goals:
- Organise family photos and videos in a centralised, self-hosted location
- Ensure both my family and my girlfriend’s family can access them easily
- Store personal files, media and code repositories
- Ensure it’s all safely and regularly backed up
Now, obviously, I can’t just buy a NAS. That would be too easy. I need to build it myself: hardware, software, networking, the lot.
The hardware
After a little research and a lot of procrastination, I started to commit to buying hardware. I knew I wanted a server with a relatively small form factor, and most of all, it needed to be silent.
I didn’t want an off-the-shelf black box. I wanted something I’d understand inside and out, something I could tinker with and feel proud of. That meant building it myself, from the ground up.
Components
- Motherboard: MSI PRO B550M-VC. A Micro ATX board, which suits a server with a smaller form factor.
- CPU: AMD Ryzen 5 PRO 4650G
- CPU cooler: Thermalright AXP90-X36
- Memory: Kingston Server Premier 16GB x2
- Case fans: ARCTIC P12 PWM PST. These were a steal on Amazon, at £34 for a pack of five.
- PSU: Cooler Master MWE 550 Bronze 230V V2
- Storage: Seagate IronWolf Pro x4
- SSD: Verbatim Vi3000 NVMe M.2 Internal SSD
I tracked down a neat-looking case and started putting it together. The PSU wasn’t modular, so managing the spaghetti of unused cables was more work than expected. I picked up some ultra-thin SATA cables for the HDDs, as the case required them to be routed through some small openings in the divider between the motherboard and the drives.
The case fans chain together, which meant I only had to connect two of them to the motherboard and chain the other two on.
Sure, it wasn’t cheap. The build came to just under £2,000, but this isn’t just storage. It’s a long-term hobby and the foundation for years of self-hosted services.
The software
I chose TrueNAS SCALE as the OS, as it’s Linux-based and has great support for Docker containers. It has since been renamed TrueNAS Community Edition (from version 25.04), and since 24.10 its apps have run as plain Docker containers. For the pool I went with RAIDZ1, ZFS’s single-parity layout, which survives one failed drive and offers a good compromise between usable space and fault tolerance.
My drives are all 10 TB or larger, and when one fails, ZFS has to read everything stored on the other three to rebuild onto the replacement. That resilver can take a day or more, and for all of it the pool has no redundancy left. Drives bought together tend to age together, so a second failure mid-rebuild isn’t as unlikely as it sounds, and on RAIDZ1 that takes the pool with it. At these sizes RAIDZ2 is the safer default, at the cost of another drive’s worth of space. For now, the cloud backup below is what stands between a bad week and lost data.
One thing that has improved since I built it is RAIDZ expansion. TrueNAS can now extend an existing RAIDZ vdev one disk at a time, so adding a fifth drive no longer means rebuilding the pool from scratch. It doesn’t change the parity level, though. A RAIDZ1 extended to five disks is still a RAIDZ1, with more data relying on a single disk’s worth of parity.
TrueNAS also supports scheduled cloud backups to a range of providers. I opted for Storj, which charges for the storage you use and the data you download. That’s cheap if you’re purely using it as a backup and rarely pull anything back. Storj changed its pricing in July 2026, and the Standard tier is now $7/TB a month for storage and $7/TB for egress, with a $5 monthly minimum and a 30-day minimum retention on objects. For a backup that mostly sits there, it’s still cheap.
The backup itself is a Cloud Sync task pushing to Storj in COPY mode. COPY uploads new and changed files but never deletes anything at the destination, so if I delete something on the NAS by mistake, the copy in Storj survives. (SYNC would happily mirror the deletion.) TrueNAS now also offers TrueCloud Backup tasks built around Storj, but the plain Cloud Sync task does what I need.
Organisation was important from the start, especially given the amount of media I wanted to share with both families. I also wanted a private file store, and a shared one with my girlfriend, Emily.
The final dataset structure I settled on looks like this:
- Main
- Media
- Family
- [my] Family
- [girlfriend] Family
- Movies
- TV Shows
- Family
- Private
- Daniel
- Emily
- Shared
- Media
This structure made it easy to expose SMB shares for each of the two family folders, and for Emily’s and my private folders.
I also set up a Jellyfin media server, running in Docker on the NAS. Every member of both families now has their own Jellyfin user, with access to Movies, TV Shows and their own family’s folder.
All this might sound like overkill for what’s essentially a glorified file server, but there’s something very satisfying about knowing your memories and media live in your own home, under your control. Plus, there’s always more to tinker with. A few months later, in February 2026, Immich joined the party for photos, which got its own post.
The networking
So, we’ve set up a server. We’ve configured RAID and got it backing up to the cloud. I’ve set up a Jellyfin media server, which I love (I don’t know why I hadn’t set one up before). But what happens when I leave the house?
It’s time to mess with some networking. To access SMB shares remotely, and host apps like Jellyfin and Home Assistant, I needed a VPN and a cleaner way to navigate my internal network. I wanted to give each app a friendly hostname instead of remembering which port it lives on.
It was time to introduce Tailscale. It’s built on WireGuard, a fast and modern VPN protocol, but Tailscale takes care of the fiddly bits behind the scenes, such as key management and NAT traversal. You install it on your devices, log in, and voilà, they can all talk to each other securely.
Actually, it wasn’t entirely plug-and-play, but overall it was surprisingly painless. I installed it on a Raspberry Pi 5 to keep it separate from my main server, and paired it with Pi-hole for local DNS and Caddy as a reverse proxy, which gives each service a clean, friendly domain name.
The first version of this setup had a couple more Raspberry Pis (see how addictive this project is?), one in each of our families’ homes. Each ran Tailscale and its own Jellyfin, with the relevant SMB shares mounted, acting as a bridge between the TVs, which aren’t on the Tailscale network, and the NAS.
That didn’t last. Jellyfin often has to transcode video on the fly when a TV or phone can’t play the original format, and the Pis simply weren’t powerful enough to keep up. So the Pis are gone. Jellyfin now runs only on the NAS, which has the grunt for it, and it’s tunnelled out to the internet (I’ll keep the details of how to myself), so anyone in the family can sign in with their own user from wherever they are.
A Cloudflare Tunnel was the first idea I ruled out for that. Cloudflare’s CDN terms don’t allow serving video, or a disproportionate share of large media files, without one of their paid media services, and traffic through a tunnel is served by that same network. Fair enough. I’m still a big Cloudflare fan, mind: this site runs on Cloudflare Workers.
I’m not going to lie, I spent days fixing networking issues, but we can skim over that detail.
Final thoughts
This project started as a simple desire to tidy up my digital life, but like most good nerdy side quests, it spiralled into a fully-fledged home lab. It now handles everything from media to backups, through encrypted tunnels and custom domains, and I find it deeply satisfying.
There were mistakes, of course. I lost hours chasing phantom networking bugs, redoing permissions and yelling at routers, and the household Pis taught me exactly how much a Raspberry Pi can transcode. But I’ve learned more in a few weeks than I would in months of passive tinkering, and I’ve got a setup I fully understand that does exactly what I want it to do.
Would I recommend others do this? Absolutely. Just maybe start with a slightly smaller ambition. Or don’t. Part of the fun is seeing just how deep the rabbit hole goes.
And if you’re reading this from a calmer future where your data is safe, your Jellyfin is thriving and you’re settled in your own self-hosting spiral — welcome. You’re in good company.
Further reading
- TrueNAS Community Edition announcement
- OpenZFS documentation: RAIDZ
- OpenZFS zpool-attach (RAIDZ expansion)
- TrueNAS ZFS capacity calculator
- Storj simplified pricing
- Jellyfin documentation: hardware acceleration
- How Tailscale works
- Caddy reverse proxy quick-start
- Pi-hole documentation
- Taking control: self-hosting my photo library with Immich
- Why I'm hosting personal projects on Cloudflare Workers in 2026
Related posts
Why I'm hosting personal projects on Cloudflare Workers in 2026
Workers, D1, R2, AI Search and Zero Trust: a tour of the Cloudflare stack behind this site and its AI chat, and why the bill comes to about the price of a coffee.
Taking control: self-hosting my photo library with Immich
Why I moved my photo library off Google Photos and onto Immich on my own NAS, and how the setup, the folder albums and the Google Takeout import went.