Architecture
Design decisions
No inbound ports
All external traffic enters via Cloudflare Tunnel. The home router exposes nothing; the origin never needs a public IP.
One hostname everywhere
Public DNS resolves to Cloudflare; Pi-hole local rewrites map the same names to internal IPs on the LAN. Same URLs, TLS, and auth — at home or away.
Auth at the edge
Cloudflare Access enforces SSO/OAuth for humans; service tokens and mTLS for machines. Origins additionally validate Cloudflare’s signed JWT / client cert.
Layered monitoring
Uptime Kuma (liveness), Beszel (resources), Better Stack (public path + deadman heartbeat) — all alerts converge on self-hosted ntfy.
Secrets stay out of Git
Every stack is compose-as-code with `.env.example` templates. Runtime secrets live only in ignored env files; config is reproducible, credentials are not.
Stack
- ImmichPhoto / video library and phone backup
- OpenCloudFile sync and collaboration
- Plex / PlexampMedia (runs on the NAS; not in the repo)
- Cloudflare TunnelOutbound-only ingress, Access, mTLS
- Nginx Proxy ManagerTLS termination and per-host routing
- Pi-holeDNS, ad blocking, LAN hostname rewrites
- DockgeCompose stack manager
- Uptime KumaContainer and HTTP liveness probes
- BeszelCPU, RAM, disk, temperature metrics
- ntfyPush alert sink for every monitoring layer
Depth lives in the Homelab Infrastructure README — this page is the portfolio view.