Home Lab
Why
No subscriptions. No dependency on Google. And a lot of fun learning how everything fits together.
It started when I found two 6 TB SAS drives on eBay for cheap. A PCIe HBA card for 30 EUR later, I had enough storage to replace Google Photos, Google Drive, and most cloud services I was paying for — all running on hardware I own.
Architecture
The server runs Proxmox as the hypervisor. A single Ubuntu VM hosts all services via Docker Compose, with Traefik as the reverse proxy handling routing based on Docker labels.
Since the server sits behind CGNAT (no public IPv4), all services are exposed through a Cloudflare Tunnel — no open ports, no VPS needed. Everything is accessible under *.johannes-kling.de.
Browser → Cloudflare → cloudflared (tunnel)
→ Traefik (reverse proxy)
├── immich.johannes-kling.de → Immich (photos)
├── cloud.johannes-kling.de → OpenCloud (files + office)
├── collabora.johannes-kling.de → Collabora (document editing)
└── mcp.johannes-kling.de → MCP servers (AI knowledge base)
Hardware
- 12-core CPU, 23 GB RAM
- NVMe for Proxmox OS
- ZFS SSD pool (928 GB) for VM root and databases
- ZFS HDD mirror (2 × 6 TB SAS) for photos, files, and backups
- NVIDIA Quadro P2000 for future ML workloads
Services
- Immich — Google Photos replacement with ML-powered search and face recognition
- OpenCloud — file sync with Collabora Online for document editing and Radicale for calendar/contacts
- Traefik — reverse proxy with automatic Docker service discovery, protected by Cloudflare Access
- MCP Servers — custom Model Context Protocol servers giving AI assistants read/write access to a shared knowledge base via WebDAV
Remote administration is handled via Tailscale.
Blog Posts
I’m documenting the setup of each service in detail — check the blog for individual write-ups.