Self-hosted home server
- When
- 2024 โ present
- Hardware
- ThinkPad T470, 7 GB RAM, Ubuntu Server
- Stack
- Docker Compose, Caddy, Tailscale, WireGuard, ufw, systemd, Python, Bash
- Code
- github.com/fellobello/homeserver (addresses and names replaced)
- Docs
- Architecture, networking and wiring diagram
What it runs
Several Docker containers: media streaming, file sync, a reverse proxy, a VPN and automation. Each service was added one at a time with a pinned version, and the whole setup lives in git, so a clean install plus one checkout brings it back.
A network with two doors
No ports are open on the router. Housemates can reach only the media server on the local network. Admin tools are reachable only over Tailscale, with real HTTPS certificates through Caddy.
Problems I ran into
Docker bypasses the firewall
Docker writes its own firewall rules, so ports it publishes skip ufw
entirely. Instead of relying on ufw, I bound each container's port to a
specific network interface and then checked every port by connecting from both the
local network and the tailnet.
Keeping the download service on the VPN
The download service runs inside the VPN container's network namespace, so its only route out is the tunnel.
Living in 7 GB of RAM
Every container has a memory cap, so nothing can starve media playback.
Automation
- A Python script that renames new media and files it into the library from qbittorrent.
- A health-check script and nightly backups, both on systemd timers.