Inside the homelab

A technical walkthrough of my self-hosted infrastructure — Proxmox, Docker, 30+ services, and how it all fits together.

30+
Active Services
~18 TB
Usable Storage
~80 W
Idle Power

How this started

It all started with a couple of YouTube videos and some threads on r/selfhosted. I dug up an old PC from the basement just to try Docker. No plans for 24/7 uptime, just some quick experiments.

But those quick experiments turned into deploying more and more services. Soon enough, the basement PC was too loud and power-hungry to keep running. I upgraded to a Beelink S13 Pro (N100, 16 GB RAM) for a proper dedicated setup. It worked great for a few months with Nextcloud and Jellyfin, until it completely died — likely an SSD overheating issue. The whole machine was gone.

That failure taught me two things: if the storage is soldered and the board dies, your data dies with it unless you have external backups. And second, software transcoding on the N100 just didn't work for my media needs. Streaming anything on Jellyfin would instantly max out the CPU. For the rebuild, I went with proper desktop hardware, an iGPU, Proxmox for snapshots, and a solid backup strategy.

The hardware

Proxmox VE on a full desktop build. The complete parts list:

Component Model
CaseENDORFY Ventum 200 Air
MotherboardMSI PRO B760-P DDR4
CPUIntel Core i5-12400 (UHD Graphics 730)
RAMCorsair 2 × 16 GB DDR4
PSUMSI MAG A650GLS PCIE5
Boot driveSanDisk Extreme 500 GB M.2 NVMe
Storage (RAIDZ)3 × Seagate IronWolf 8 TB → ~15 TB usable
Storage (media)2 × Seagate IronWolf 4 TB via Terramaster D4-320 → ~3.3 TB usable
UPSEaton 5E Gen2 700 USB DIN

Previous (retired): Beelink MINI-S13 Pro (N100, 16 GB) — died after a few months, likely SSD overheating.

UPS on the far left, Terramaster D4-320 in the middle, and homeserver on the right.
UPS on the far left, Terramaster D4-320 in the middle, and homeserver on the right.

Virtualization & architecture

Proxmox VE handles the hypervisor layer. A single Ubuntu Server VM acts as the Docker host for all services:

Networking & security

External traffic goes through Cloudflare Tunnel (cloudflared). The tunnel connects outbound from the server to Cloudflare's edge — no inbound firewall rules are needed. Behind the tunnel, Nginx Proxy Manager routes traffic to the appropriate container based on domain. This also makes Cloudflare Access policies available for additional authentication on sensitive services.

For admin interfaces and SSH, Tailscale provides a WireGuard-based mesh VPN. The server also acts as an exit node for my devices when needed.

Security stack: Cloudflare filters edge traffic → tunnel terminates at Nginx Proxy Manager → CrowdSec analyzes requests for malicious patterns → Pi-hole handles DNS-level blocking on the LAN. Management interfaces stay on the Tailscale mesh.

Services

Everything runs in Docker containers across several compose stacks. Here's what I use daily:

Cloud & storage

Service Purpose
NextcloudFile sync, calendar, contacts — Google Drive replacement
ImmichPhoto and video backup with ML-powered search and face recognition
AFFiNEKnowledge base and workspace — this documentation lives here

Media

Service Purpose
JellyfinStream movies and TV to any device (hardware transcoding via Intel QSV)
NavidromePersonal music streaming, compatible with any Subsonic client
KiwixOffline Wikipedia and ZIM library reader

Monitoring & admin

Service Purpose
GlancePersonal dashboard showing all service statuses
BeszelLightweight system-wide resource monitoring
Uptime KumaService health checks with Telegram notifications
Pi-holeNetwork-wide ad blocking and local DNS
CrowdSecCollaborative intrusion prevention
Speedtest TrackerInternet speed history and trends

Productivity & utilities

Service Purpose
Home AssistantHome automation — lights, sensors, smart home control
Stirling PDFPDF merge, split, compress, convert (all client-side, no upload)
FreshRSSRSS feed aggregator
Anki Sync ServerSpaced-repetition flashcard sync across devices
Whisper UILocal AI audio transcription, no data sent externally
Super ProductivityTime tracking and task management

Data flow: Services that handle personal data (photos, documents, audio) run completely locally. No file leaves the server unless explicitly shared. The only outbound path is through Cloudflare's encrypted tunnel.

Docker networking

Each compose stack gets its own isolated bridge network. Docker's default address pool is configured with two /16 blocks (10.10.0.0/16 and 10.20.0.0/16), providing 512 usable /24 subnets — enough headroom to avoid subnet conflicts as new stacks are added.

Storage & backups

Data follows a three-tier model:

Backups follow a layered strategy:

Old dumps older than 30 days are cleaned automatically.

What I learned

Practical takeaways from building and running this:

What's next

The setup has been stable for months. Idle power draw sits around 45–55 W for the whole stack (server + DAS + switch), which is low enough that I don't think about it. No hardware upgrades planned — the RAIDZ pool has plenty of headroom at 8% used, and the i5 handles everything I throw at it.

Some ideas I'm sitting on:

Back to homepage