← Homelab

Mijn homelab: een klein datacenter op zolder

Een overzicht van mijn thuisomgeving: Proxmox met ZFS, een Raspberry Pi als edge, PostgreSQL met Patroni, single sign-on met Zitadel, lokale AI op een RTX 3060, monitoring als code en alles uitgerold via Gitea Actions.

Waarom een homelab

Mijn homelab is mijn proeftuin. Wat ik op het werk tegenkom (high availability, monitoring, GitOps, security, AI), probeer ik thuis eerst zelf uit, zonder dat er iets kan breken wat niet van mij is. Tegelijk draait er van alles dat thuis echt gebruikt wordt: media, foto's, bestanden, wachtwoorden, mail, energie en verwarming. Dat houdt me scherp: als het stuk is, merkt het hele huishouden het.

Hardware

RolHardware
HypervisorZelfbouw met AMD Ryzen 5 5500GT, 128 GB RAM, NVIDIA RTX 3060 12 GB
Opslag hypervisorProxmox zelf op twee NVMe-schijven in een ZFS-mirror; VM-opslag op een ZFS-pool van 8 TB
Edge en NASRaspberry Pi 4 in een Argon-behuizing, met ruim 7 TB opslag die via NFS wordt gedeeld
NetwerkGlasvezel, een segment voor het thuisnetwerk en WireGuard voor toegang van buiten

Opbouw

internet ─► edge (Pi, Argon-behuizing): reverse proxy · DNS-filter · WireGuard · NFS-opslag
              │
              ▼
          Proxmox VE (ZFS-mirror op 2× NVMe, VM-opslag op ZFS)
          ├─ AI en media     llama.cpp op de RTX 3060, Open WebUI, Jellyfin
          ├─ monitoring      Prometheus, Alertmanager, Grafana, Loki, meldingen
          ├─ database        PostgreSQL met Patroni (2 nodes + witness)
          ├─ identiteit      Zitadel (single sign-on)
          ├─ ontwikkeling    Gitea met Actions-runners
          ├─ cloud en mail   bestanden, foto's, wachtwoordmanager, mailserver
          └─ canary          testmachine voor wijzigingen

Elke VM heeft één taak. Dat maakt het overzichtelijk: een probleem in de mediastack raakt de database niet, en een update aan de monitoring raakt de AI niet.

Ontwerpkeuzes

  • Geheugen statisch toegewezen. Ballooning staat op vrijwel alle VM's uit. Een host met weinig elasticiteit kun je het best voorspelbaar maken. Ik meet het werkelijke gebruik en pas de toewijzing daarop aan, en niet op de RSS van qemu: die laat zien welke pagina's ooit zijn aangeraakt, niet wat nu nodig is.
  • Database met een echte witness. PostgreSQL draait met Patroni op twee nodes, met een aparte witness-VM als derde etcd-lid. Niet op de Pi: etcd heeft een lage fsync-latency nodig, en zonder SSD zet één filmavond met veel I/O het cluster in read-only.
  • De Pi doet al genoeg. Reverse proxy, DNS-filter, VPN en NFS voor de mediabibliotheek. Monitoring gaat er bewust niet bij: met 4 GB RAM pakt de OOM-killer dan de DNS-filter, en zonder DNS valt het hele huis stil.
  • CPU-discipline. Builds en batchjobs op de AI-VM krijgen een cgroup-quota van vier cores. Anders loopt de steal time op en voelt de hele host het.

Single sign-on met Zitadel

Zitadel is de identity provider voor de webapplicaties, waaronder de AI-omgeving. Eén account, één keer inloggen, en tweestapsverificatie op één plek. Wat ik daarvan leerde:

  • De issuer-URL zit overal. In elke client en in elk token. Kies het domein van je issuer dus zorgvuldig: verhuizen is duur.
  • Een DNS-filter kan je SSO breken, ook als de applicatie zelf bereikbaar is. Zie Waarom mijn SSO overal werkte, behalve op kantoor.
  • API's los van SSO. Voor machine-tot-machine-verkeer (mijn CLI, de editor) gebruik ik API-sleutels via een aparte ingang, zodat automatisering niet afhangt van een browserlogin.

Alles als code

  • Gitea is de bron van waarheid, met Gitea Actions-runners voor CI/CD.
  • De reverse proxy: een vhost per dienst in Git. Een merge naar main valideert en rolt uit. Beheerinterfaces staan op allow <thuisnetwerk>; deny all;.
  • Monitoring: alertregels met unittests en een runbook per alert. Zie Monitoring als code.
  • Agents op alle hosts staan als Ansible-inventory en -rollen in Git. De automatische uitrol lag een tijd stil en zet ik opnieuw op. Daarna geldt weer: met de hand aanpassen op een host wordt bij de volgende run overschreven, en dat is de bedoeling.
  • Deze website is net zo opgezet: een push naar development, een groene pipeline met lint, typecheck, contentcontrole en een containerscan, een pull request naar main, en een reconciler op de server rolt hem uit met rollback bij een mislukte nacontrole.

Lokale AI

Het pronkstuk: een 35B-model op de RTX 3060 met ~40 tokens per seconde, bereikbaar vanuit de browser, de terminal en VS Code. Het hele verhaal staat in Mijn eigen AI-platform op een RTX 3060.

Huis en energie

Zonnepanelen, een thuisaccu, de slimme meter en de verwarming staan allemaal in Prometheus. Zie Energie en verwarming in Grafana.

Beveiliging

  • Alleen de reverse proxy staat aan internet; al het andere is intern of via WireGuard.
  • PHP-applicaties kregen bij een kritiek lek binnen een dag een tussenmaatregel en hardening op de proxy. Zie php2shell.
  • Geheimen staan in bestanden met beperkte rechten op de host, niet in Git.