This is my home server. It's a Raspberry Pi 5 in a case I designed and printed myself, running OpenMediaVault and 17 services in Docker. It replaced Google Photos, Google Drive and a drawer full of external hard drives.
I started it because I was running out of space on my phone and didn't want to pay a subscription for photo storage. It grew from there.
Two things I'm proud of: it runs off one power cable (the PSU and the step-down converter are inside the case), and I can reach it from anywhere without opening a single port on my router.
| Board | Raspberry Pi 5, 8 GB |
| Storage | 512 GB NVMe + 2 × 2 TB HDD in RAID 1 (2 TB usable) |
| OS | OpenMediaVault |
| Services | 17, all in Docker |
| Remote access | Tailscale |
| Power | 15 W measured, so about 130 kWh a year |
| Case | My own design, printed in PETG |
flowchart TB
PH[Phone] --> TS
PC[My PC] --> TS
LT[Laptop] --> TS
TS[Tailscale] --> AG[AdGuard Home<br/>DNS + ad blocking]
AG --> NPM[Nginx Proxy Manager<br/>HTTPS]
NPM --> APPS[17 containers]
APPS --> NVME[(NVMe<br/>system + volumes)]
APPS --> HDD[(2 x 2 TB<br/>media + data)]
NVME -->|rsync over SSH| PC
HDD -->|rsync over SSH| PC
PC -->|system image| HDD
Everything goes through Tailscale. Nothing is exposed to the internet.
The containers are other people's software. I installed and configured them. The parts I actually made:
- the case — designed in CAD, printed, assembled (STL files here)
- the power setup — 12 V for the drives, stepped down to 5 V for the Pi, sized so the drives don't brown it out when they spin up
- the network setup — DNS pointing at Tailscale addresses, HTTPS certificates without any open ports
- figuring out what actually needs backing up, and what doesn't
I wrote these mostly so I'd remember how things work when something breaks at 2 a.m.
| Hardware | The case, power, PCIe, cooling |
| Network | AdGuard, Tailscale, reverse proxy |
| Services | What all 17 things do |
| Backups | What's protected and what isn't |
| Automation | Update script and cron |
| Git server | Using the NAS as my own Git remote |
| Decisions | Why I picked what I picked |
I build my own sensor devices, and right now the readings go into InfluxDB and I look at them through Home Assistant. What I actually want is my own web page on the server showing all of it — live values from each device, history, graphs, laid out how I want rather than how someone else's dashboard does it.
That's the next project, and it's the part where I'll be writing the code rather than configuring someone else's.
- No offsite backup. Both copies are in my flat, so a fire takes both.
- AdGuard is a single point of failure — if the Pi dies, DNS dies for everything on my tailnet, including my phone outside the house.
- The PSU is 60 W and both drives spinning up at once gets close to that.
- The daily
apt upgrade -yin cron should really beunattended-upgradeslimited to security patches.
The Git repo for this documentation lives on the NAS itself. GitHub is just a mirror.
Domains and hostnames in here are made up. The 192.168.x and 100.x
addresses are private ranges, so I left them alone.
Code and docs are MIT. The case models are CC BY-SA — see hardware/.
