Skip to content

Infrastructure

Full homelab infrastructure map. Updated April 2026 after k3s migration.

Proxmox Host

Property Value
Hostname pve
IP 192.168.1.5
Version Proxmox VE 8.4.14
RAM 64 GB
node_exporter :9100 (scraped by Prometheus on dockerrr)

Storage

Store Type Size Purpose
/dev/mapper/pve-root ext4 94 GB OS
vm LVM-thin 1.84 TB VM disks
apps-nvme ZFS 1.81 TB Apps VM disks
backups Directory 364 GB /mnt/backups → PBS

Backup Schedule

Target: PBS at CT 105 (192.168.1.50) — keep-last=3, keep-daily=7, keep-weekly=4

Schedule: Daily at 02:30 and 22:30

VMs backed up: 100 (homeassistant), 104 (dockerrr), 511 (apps-app1), 512 (apps-data), 515 (apps-edge)

VMs NOT backed up: 102 (unraid), 513 (apps-dev1), 514 (apps-monitoring), 521 (apps-app2)

VMs and LXCs

VMID Name Type IP VLAN RAM Status
100 homeassistant VM 192.168.2.86 IOT (2) 8 GB running
101 plex LXC 192.168.2.10 IOT (2) running
102 unraid VM 192.168.2.6 IOT (2) 4 GB running
103 (destroyed) arr stack migrated to dockerrr
104 dockerrr VM 192.168.1.47 Default 10 GB running
105 pbs LXC 192.168.1.50 Default 2 GB running
106 (destroyed) Immich (unused)
511 apps-app1 VM 192.168.51.10 apps-prod (51) 6 GB running
512 apps-data VM 192.168.51.30 apps-prod (51) 16 GB (balloon=0) running
513 apps-dev1 VM 192.168.51.40 apps-prod (51) 3 GB running
514 apps-monitoring VM 192.168.51.20 apps-prod (51) 2 GB running
515 apps-edge VM 192.168.51.50 apps-prod (51) 4 GB running
521 apps-app2 VM 192.168.51.15 apps-prod (51) 6 GB running

Memory Balloon

Balloon is disabled (balloon: 0) on all k3s VMs. An April 2026 sev-1 MinIO outage was caused by balloon dynamically shrinking RAM and triggering OOMKills.

Docker Host (dockerrr, VM 104)

Standalone Docker host at 192.168.1.47, Default VLAN — can reach all VLANs.

Homelab stack (/opt/docker/homelab/docker-compose.yml):

Service Port/URL
Traefik v3.6 ports 80/443, *.home.jlwaller.com
Homepage home.jlwaller.com
Prometheus prometheus.home.jlwaller.com :9090
Grafana grafana.home.jlwaller.com
Alertmanager alertmanager.home.jlwaller.com :9093
Mosquitto MQTT :1883

Arr stack (/opt/docker/servarrr/): Sonarr, Radarr, Prowlarr, SABnzbd, Jellyseerr

Systemd services: node_exporter (:9100), infra-exporter (:9101), vault-unseal

k3s Cluster

Docker Swarm was fully decommissioned April 2026. All production apps now run on k3s.

Node Roles

Node VMID IP Role
apps-app1 511 192.168.51.10 control-plane + worker
apps-data 512 192.168.51.30 worker (data namespace, all data services)
apps-dev1 513 192.168.51.40 worker + build node
apps-monitoring 514 192.168.51.20 worker (cAdvisor)
apps-edge 515 192.168.51.50 worker (Traefik, ports 80/443)
apps-app2 521 192.168.51.15 worker

Namespaces

Namespace Services
recipicity-production api (2×), frontend (2×), scheduler, images
recipicity-staging api (2×), frontend (2×), scheduler, images
apps jlwaller, quo-integration, uptime-kuma, docs
data postgres, pgbouncer, redis, minio, vault, exporters, backup
traefik traefik (hostNetwork on apps-edge)
cert-manager cert-manager + ClusterIssuers

Manifests

All manifest files live on dockerrr at /opt/docker/homelab/k3s-manifests/.

Apply via pipe (kubectl must run on apps-app1):

cat /opt/docker/homelab/k3s-manifests/<ns>/<file>.yaml | ssh john@192.168.51.10 "kubectl apply -f -"

Registry

Local Docker registry runs as a k3s pod on apps-app1, port 5000.

  • URL: registry.apps.jlwaller.com:5000
  • Storage: /opt/registry/ on apps-app1 (hostPath)
  • Push: from apps-dev1 after building images

Network (UniFi)

Access Points

AP IP 2.4 GHz 5 GHz 6 GHz
Family Room 192.168.1.60 ch 1 ch 44 (160MHz) ch 117
Upstairs 192.168.1.21 ch 6 ch 36 (80MHz) ch 69
Office 192.168.1.8 ch 11 ch 149 (80MHz) ch 37
AC Mesh 192.168.1.165 ch 6 ch 100

VLANs

Name VLAN Subnet
Default untagged 192.168.1.0/24
IOT 2 192.168.2.0/24
Guest 3 192.168.3.0/24
Office 4 192.168.8.0/24
apps-prod 51 192.168.51.0/24

Firewall Rules

  • IOT → Default/Office/apps: blocked
  • Guest → all internal: blocked
  • mDNS reflector: enabled (cross-VLAN discovery)