Internal
LAN DNS resolution
LAN client
Pi-hole
Unbound
Root / TLD / authoritative servers
Pi-hole handles client-facing DNS while Unbound performs recursive resolution with DNSSEC validation rather than relying on a public upstream resolver.
Homelab Infrastructure
How the virtualisation, storage, container, DNS, routing, monitoring and GPU layers of my homelab fit together.
This represents the environment I actually operate rather than an idealised reference architecture. Internal hostnames, addresses and credentials are deliberately left out.
Overview
One Proxmox host, one storage VM that doubles as the Docker host, and the services that run on it.
Platform
Dedicated homelab hardware providing compute, storage connectivity and an NVIDIA RTX A2000 that is passed through to a virtual machine rather than used by the host.
Proxmox VE provides the VM layer, with ZFS as the host storage backend. Bridged networking with consistent IP assignments keeps core systems reachable at known addresses. Linux and Windows VMs run alongside the storage VM for lab and administrative workloads.
OpenMediaVault runs as a virtual machine and provides the mdadm RAID1 storage and SMB file services. It is also the main Docker host, and it receives the RTX A2000 via PCI passthrough.
Docker Compose runs the infrastructure and application services with persistent storage and repeatable configuration: DNS, reverse proxy, monitoring, Ollama and the published web applications.
physical → virtualisation → operating system → containers
Paths
Internal DNS resolution, externally published services and the GPU follow different paths through the environment.
Internal
LAN client
Pi-hole
Unbound
Root / TLD / authoritative servers
Pi-hole handles client-facing DNS while Unbound performs recursive resolution with DNSSEC validation rather than relying on a public upstream resolver.
External
Internet user
Cloudflare
Cloudflare Tunnel
Nginx Proxy Manager
Target Docker service
Cloudflare handles the public edge, the tunnel provides the path into the environment and Nginx Proxy Manager routes the request to the right internal service.
Hardware
RTX A2000 on the Proxmox host
PCI passthrough
OpenMediaVault VM
Docker NVIDIA runtime
Ollama container
The driver inside the VM is a DKMS module, so it has to build against every new kernel. A failed build after a routine upgrade is the subject of the GPU passthrough recovery case study.
Core services
Pi-hole · Unbound
Pi-hole provides internal DNS, filtering and query visibility. Unbound performs full recursive resolution with DNSSEC validation rather than forwarding to a public resolver.
Nginx Proxy Manager · Cloudflare
Nginx Proxy Manager handles TLS certificates and HTTPS routing to the Docker services. Cloudflare DNS and Cloudflare Tunnel provide the external path in, so no container is exposed directly.
Prometheus · Grafana
Prometheus collects metrics from Node Exporter, cAdvisor and a Pi-hole exporter. Grafana dashboards cover host resources, containers, disk usage and RAID status.
OpenMediaVault · mdadm · SMART · SMB
A two-disk mdadm RAID1 mirror for critical data with a separate disk for non-critical media, shared over SMB and monitored with SMART.
NVIDIA RTX A2000 · Ollama
The RTX A2000 is passed through from the Proxmox host to the OpenMediaVault VM, where the Docker NVIDIA runtime makes it available to Ollama for GPU-accelerated models.
Tailscale
Tailscale provides remote administrative access to the Linux environment, with the Windows 11 client configured as well. It is separate from the published-service path through Cloudflare.
Observability
Monitoring is kept separate from the applications being observed.
EXPORTERS
Node Exporter
cAdvisor
Pi-hole Exporter
COLLECTION
Prometheus
VISUALISATION
Grafana
exporters → Prometheus → Grafana
Dashboards provide visibility into host resources, Docker containers, disk usage, RAID status and DNS-related metrics.
Example workload
waqasmohammad.com is a Next.js application built into a Docker image and run as a container within the same environment. It is published through the Cloudflare Tunnel and Nginx Proxy Manager layers described above rather than exposing the container directly to the internet, and analytics run on self-hosted Umami.
Reality check
It is a working homelab. The systems shown here run real services and are where I practise infrastructure administration and troubleshooting.
It is not a highly available platform. Core services depend on a single Proxmox host and a single storage VM, so host-level failure remains a single point of failure.
Backups are real but not automated. Backup and migration work has been carried out and validated by hand. I do not present it as a mature automated backup strategy with scheduled jobs and routine restore testing.
There is no network segmentation. The environment uses bridged networking with consistent IP assignments. No VLAN design is shown because none is implemented.
Kubernetes is not part of this architecture. My k3s work remains an incomplete learning experiment and is documented separately on the Projects page.
Terraform use is limited. I have used it to manage seven Cloudflare DNS records with AI-assisted guidance, not to define this environment as code.
Implementation
The Projects page breaks these layers down into the systems, tools and practical work used to build them, including what broke and how it was recovered.