Startpunt: Proxmox cluster "holocron" — 3 nodes: pluto (Intel NUC), malachor + ossus (GMKtec G3)
Pilot node: malachor (192.168.2.231) — hierop draaien alle nieuwe IaaC workflows
Management VM: coruscant (192.168.2.31) op malachor — hierop draait alle tooling
Principe: Niets op de bestaande infra wijzigen totdat het hier stabiel werkt
Stand van zaken: september 2026
| Code | Doel |
|---|---|
| G1 | Makkelijk, veilig en stabiel beheer (IaaC, monitoring, backup) |
| G2 | Familie services altijd beschikbaar (Nextcloud, Vaultwarden, Immich) |
| G3 | Netwerk en DNS veilig (AdGuard HA, Traefik, VLANs) |
| G4 | Home Assistant automatisering |
| G5 | Observability en lokale AI (Grafana stack, Ollama) |
| G6 | Media en foto's (Arr stack, Jellyfin/Plex, Immich) |
| G7 | Veiligheid en encryptie (TLS, CrowdSec, encryptie at rest) |
| G8 | Identity management (Authentik SSO, MFA) |
| G9 | (gereserveerd) |
| G10 | Experimenteerruimte (geïsoleerde sandbox) |
FASE 1 — Fundament
Deel 1: Proxmox pilot node
Deel 2: Lokale tooling
Deel 3: Secrets management
Deel 4: OpenTofu eerste VM
FASE 2 — Netwerk fundament (alles hiervan hangt af)
Deel 5: AdGuard HA
Deel 6: Traefik standalone
FASE 3 — Identiteit en veiligheid
Deel 7: Authentik (SSO)
Deel 8: CrowdSec (IDS)
FASE 4 — Familie services (kritiek, hoge prioriteit)
Deel 9: Vaultwarden + Bitwarden migratie
Deel 10: Nextcloud
Deel 11: Immich
FASE 5 — Observability en backup
Deel 13: Prometheus + Grafana + Loki + Alertmanager
Deel 14: Backup strategie per service (TrueNAS ZFS + Restic offsite)
FASE 6 — Media
Deel 15: Arr stack (Sonarr, Radarr, Prowlarr, Bazarr)
Deel 16: Jellyfin / Plex review
FASE 6b — Wiki en kennisbeheer
Deel 16b: Wiki.js (intern wiki platform)
FASE 7 — AI
Deel 17: Ollama + Home Assistant koppeling
FASE 7b — VPN en remote toegang
Deel 17b: Tailscale (remote toegang zonder Traefik afhankelijkheid)
FASE 8 — Consolidatie (bestaande infra)
Deel 18: Bestaande VMs als code (Ansible playbooks)
Deel 19: VLAN migratie (raakt bestaande infra — apart plannen)
Noot — Home Assistant als code:
HA heeft USB-apparaten (Zigbee stick), 100+ automations en custom components.
Niet geschikt voor standaard VM-rebuild via Ansible. Aanpak: backup-restore via
HA native backup API (dagelijkse backup naar TrueNAS) is voldoende als IaaC-vervanging.
FASE 9 — Apparaatbeheer (laag prioriteit)
Microsoft Family Safety op kinderaccount laptops
Vastgestelde waarden (september 2026):
| Item | Waarde |
|---|---|
| Cluster naam | holocron |
| Pilot node | malachor (192.168.2.231) |
| API endpoint | https://192.168.2.231:8006 |
| VM storage | local-lvm (816 GB LVM thin) |
| ISO storage | local (94 GB) |
| NFS storage | truenas-backup (9.1 TB, TrueNAS) |
| API token | root@pam!opentofu (encrypted in secrets/proxmox.enc.yml) |
Bekende hardware fixes toegepast:
proxmox-node-hardening nog uitvoeren op alle 3 nodes (systemd service)Proxmox draait al op alle 3 nodes. Cluster "holocron" actief.
Tooling draait op management VM coruscant (192.168.2.31, VM ID 100 op malachor).
Coruscant is eenmalig handmatig aangemaakt — bootstrap uitzondering gedocumenteerd in infrastructure/ansible/playbooks/bootstrap-coruscant.yml.
| Tool | Versie | Status |
|---|---|---|
| OpenTofu | 1.12.6 | ✅ |
| Ansible | 2.16.3 (ansible-core) | ✅ |
| SOPS | 3.9.4 | ✅ |
| age | 1.1.1 | ✅ |
| Git + repo gecloned | - | ✅ |
~/.config/sops/age/keys.txt).sops.yaml bijgewerkt met public keysecrets/proxmox.enc.yml aangemaakt met encrypted API token⏳ Nog te doen: Frigate secrets encrypten — wordt opgepakt als Frigate opnieuw wordt ingericht via Ansible (zie Fase 8 / Home Automation blok)
Bijdrage: G1 · Tijd: ~2 uur
1. Ubuntu 24.04 cloud image uploaden naar Proxmox:
ssh root@192.168.2.240
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img \
-O /var/lib/vz/template/iso/ubuntu-24.04-cloud.img
2. infrastructure/opentofu/providers.tf schrijven (Proxmox provider bpg/proxmox ~0.66)
3. infrastructure/opentofu/vms.tf schrijven — eerste test-VM:
VM ID 200 · 1 vCPU · 512MB · 8GB disk · Ubuntu cloud-init
4. Provisioneren:
cd infrastructure/opentofu
tofu init
tofu plan # controleer output
tofu apply
5. Ansible test:
ansible -i infrastructure/ansible/inventory/hosts.yml all -m ping
Klaar als: VM start automatisch op, SSH bereikbaar, tofu plan toont geen drift
Bijdrage: G3, G7 · Tijd: ~2 uur
1. adguard-01 VM aanmaken via OpenTofu:
Draait op pve-pilot (192.168.2.241)
Synchroniseer config van bestaande adguard instantie (als die bestaat)
Of: fresh install met filterlijsten
2. Ansible playbook: infrastructure/ansible/playbooks/adguard.yml
- Docker installeren
- services/adguard/docker-compose.yml deployen
- AdGuard configureren (admin wachtwoord via SOPS secret)
3. Keepalived instellen op beide AdGuard nodes:
services/adguard/keepalived.conf deployen via Ansible
Floating VIP: 192.168.2.245 (tijdelijk, later 192.168.10.5 na VLAN migratie)
Master: adguard-01 · Backup: bestaande adguard
4. UDR DNS omzetten naar floating VIP
5. Failover testen:
systemctl stop keepalived op master
→ DNS moet blijven werken via backup
Klaar als: DNS werkt bij uitval van één node, UDR wijst op floating VIP
Bijdrage: G3, G7 · Tijd: ~2-3 uur
STAP A: Cloudflare instellen voor drice.nl
1. Controleer of drice.nl al op Cloudflare staat:
Kijk bij je domeinregistrar welke nameservers ingesteld zijn.
Als het ns1/ns2.cloudflare.com is → al goed, ga naar stap B.
Als niet: voeg drice.nl toe op cloudflare.com (gratis account),
update nameservers bij je registrar, wacht op propagatie (~24u).
2. In Cloudflare Dashboard voor drice.nl:
- Proxy aan (oranje wolk) voor alle publieke subdomains
- SSL/TLS mode: Full (strict)
- "Always use HTTPS" aan
3. Cloudflare API token aanmaken:
Cloudflare Dashboard → Profile → API Tokens → Create Token
Template: "Edit zone DNS" · Zone: drice.nl
Opslaan in secrets/cloudflare.enc.yml via SOPS
STAP B: Traefik VM in DMZ VLAN 25
4. traefik VM aanmaken via OpenTofu:
VM ID 201 · 1 vCPU · 512MB · 8GB · VLAN 25 (DMZ)
5. Ansible playbook: infrastructure/ansible/playbooks/traefik.yml
- services/traefik/docker-compose.yml deployen
- traefik.yml configureren:
entrypoints: web (80→redirect), websecure (443)
certificatesResolvers: letsencrypt via Cloudflare DNS challenge
providers: docker, file
6. Cloudflare IP-restrictie instellen:
Traefik middleware die alleen Cloudflare CDN-edge-IPs accepteert.
Script downloadt automatisch de actuele Cloudflare IP-lijst (elke 6u via cron).
Zo kan niemand de proxy direct bereiken, alleen via Cloudflare.
7. Eerste service testen:
traefik.drice.nl → Traefik dashboard (intern, Authentik later)
curl -I https://traefik.drice.nl → TLS certificaat aanwezig?
8. NPM in Home Assistant stopzetten (na verificatie)
Klaar als: https://traefik.drice.nl werkt met geldig certificaat, alleen bereikbaar via Cloudflare
Bijdrage: G8, G7 · Tijd: ~3 uur
VM: 208 · Node: malachor · IP: 192.168.2.159 · 2 vCPU · 2 GB RAM · 20 GB
Stack: Authentik server + worker, PostgreSQL 16, Redis.
Traefik termineert TLS op auth.drice.nl (publiek), auth.home.drice.nl (intern).
⚠️ Uitzondering — buiten Authentik SSO:
Vaultwarden en Home Assistant krijgen GEEN Authentik SSO. Beide houden eigen 2FA (TOTP).
Reden: bij SSO-storing moet je nog bij je wachtwoorden en domotica kunnen.
# Op coruscant:
sops secrets/authentik.enc.yml
Voeg toe (gebruik openssl rand -base64 36 voor beide waarden):
authentik_pg_password: "<random 32+ chars>"
authentik_secret_key: "<random 50+ chars>"
Sla ook op in Vaultwarden → Homelab → "Authentik - secrets" (Secure Note).
cd infrastructure/opentofu
tofu plan # controleer: 1 VM toe te voegen
tofu apply
Wacht op SSH (±30 sec), controleer: ssh ubuntu@192.168.2.159
cd infrastructure/ansible
ansible-playbook -i inventory/hosts.yml playbooks/authentik.yml
Dit deployt de stack en start alle containers.
services/traefik/config/services.yml is al bijgewerkt (zie bestand).
Traefik herlaadt automatisch — geen restart nodig.
Voeg AdGuard DNS rewrite toe (intern):
auth.home.drice.nl → 192.168.2.154 (Traefik)Ga naar https://auth.drice.nl/if/flow/initial-setup/
In Authentik UI → Directory → Groups → Create:
| Groep | Wie | Doel |
|---|---|---|
homelab-admin |
jij | toegang tot alle services, Grafana Admin rol |
family |
gezinsleden | toegang tot Nextcloud, Immich, Wiki |
Voeg jezelf toe aan homelab-admin.
In Authentik UI → Flows → default-authentication-flow → Stage bindings:
default-authenticator-totp-setup toe als stagehomelab-admin (verplicht), family (optioneel)Scan de QR-code in je authenticator app (Bitwarden Authenticator / Aegis).
In Authentik UI → Applications → Providers → Create:
grafanahttps://grafana.home.drice.nl/login/generic_oauthopenid, profile, emailMaak Application aan:
Grafanagrafanagrafanahttps://grafana.home.drice.nlVoeg toe aan secrets/observability.enc.yml:
grafana_oauth_client_id: "<client_id uit Authentik>"
grafana_oauth_client_secret: "<client_secret uit Authentik>"
Run daarna observability playbook opnieuw — de Grafana container krijgt de OAuth env vars
(GF_AUTH_GENERIC_OAUTH_*) via de bijgewerkte role template.
https://auth.drice.nl bereikbaarKlaar als: alle bovenstaande checks groen
Bijdrage: G7 · Tijd: ~1 uur
1. CrowdSec installeren op Traefik VM:
apt install crowdsec
crowdsec collections install crowdsecurity/traefik
2. Traefik bouncer instellen:
Traefik middleware → CrowdSec bouncer
Automatisch blokkeren van bekende aanvallers
3. Dashboard: http://192.168.2.x:3000 (of via Traefik intern)
4. Optioneel: CrowdSec central API koppelen voor community blocklists
Klaar als: CrowdSec logt Traefik verkeer, bouncer actief
Bijdrage: G2, G7, G8 · Tijd: ~2 uur + migratie
1. vaultwarden VM aanmaken via OpenTofu:
VM ID 203 · 1 vCPU · 512MB · 10GB
2. Ansible playbook: infrastructure/ansible/playbooks/vaultwarden.yml
services/vaultwarden/docker-compose.yml
Admin token via SOPS secret
3. Traefik route: vault.drice.nl → Vaultwarden (HTTPS verplicht voor Bitwarden apps)
4. Authentik OIDC koppelen (SSO voor gezin)
5. Migratie van cloud Bitwarden:
a. Bitwarden.com → Export vault (JSON, encrypted)
b. Vaultwarden admin → Import
c. Bitwarden apps herpointen naar vault.drice.nl
d. Testen op alle apparaten (iOS, Android, browser extensie)
e. Cloud Bitwarden abonnement opzeggen (na verificatie)
Klaar als: Alle apparaten werken via vault.drice.nl, cloud Bitwarden overbodig
Bijdrage: G2 · Tijd: ~2-3 uur
1. nextcloud VM aanmaken via OpenTofu:
VM ID 204 · 2 vCPU · 2GB RAM · 20GB (OS) + NFS mount voor data
2. Ansible playbook: infrastructure/ansible/playbooks/nextcloud.yml
services/nextcloud/docker-compose.yml
Database (MariaDB) + Redis voor performance
NFS mount van TrueNAS voor user data
3. Traefik route: cloud.drice.nl → Nextcloud
4. Authentik OIDC koppelen (Social Login voor gezin)
5. Nextcloud configureren:
- Calendar + Contacts apps activeren
- Telefoons koppelen (CalDAV/CardDAV)
- Nextcloud Talk activeren (vervangt Discord-webhooks als intern notificatie-kanaal)
- Automatisc updates via cron
6. Notificaties via Nextcloud Talk:
Zodra Nextcloud Talk draait, kunnen Alertmanager en Watchtower hiernaartoe sturen.
Nextcloud Talk heeft een REST API: POST naar /ocs/v2.php/apps/spreed/api/v1/chat/{token}
Dit vervangt de Discord-webhook URL in alle docker-compose .env bestanden.
Voordeel: volledig zelfgehost, geen afhankelijkheid van externe dienst.
Klaar als: Gezin kan bestanden, agenda en contacten synchroniseren
Bijdrage: G2, G6 · Tijd: ~2 uur
1. immich VM aanmaken via OpenTofu:
VM ID 205 · 4 vCPU · 4GB RAM · NFS mount TrueNAS voor foto opslag
(Immich gebruikt ML voor gezichtsherkenning — CPU intensief)
2. services/immich/docker-compose.yml
Traefik route: photos.drice.nl
NFS mount voor library
3. Authentik OIDC koppelen
4. Mobiele apps instellen (iOS + Android):
Automatische backup van camera rol
Selecteer WiFi-only optie voor uploads
5. Bestaande foto's importeren (Google Photos export / bestaande NAS)
Klaar als: Telefoons backuppen automatisch, gezichtsherkenning werkt lokaal
Bijdrage: G1, G5
Draait op observability VM (192.168.2.157):
Nog te doen:
ansible --check run)Bijdrage: G1, G7 · Tijd: ~30 min
Alle secrets opslaan in Vaultwarden (map: Homelab) als Secure Note of Login item,
zodat er altijd een leesbare kopie beschikbaar is naast de SOPS-bestanden.
Te decrypten en over te zetten (sops -d secrets/<naam>.enc.yml):
proxmox.enc.yml → "Proxmox - OpenTofu API token" (Secure Note)
adguard.enc.yml → "AdGuard - admin" (Login, URL: http://192.168.2.5)
watchtower.enc.yml → "Discord - Watchtower webhook" (Secure Note, Shoutrrr formaat)
minecraft.enc.yml → "Minecraft - RCON wachtwoord" (Secure Note)
observability.enc.yml → "Grafana - admin" (Login, URL: http://192.168.2.157:3000)
"Alertmanager - Discord webhook" (Secure Note, HTTPS formaat)
vaultwarden.enc.yml → "Vaultwarden - admin token" (Secure Note, URL: /admin)
Handmatig toe te voegen (staan niet in git):
- Proxmox root wachtwoord (Login, URL: https://192.168.2.231:8006)
- Router UniFi UDR (Login, URL: https://192.168.2.1)
- TrueNAS admin (Login, URL: http://192.168.2.251)
- age private key (Secure Note, volledige inhoud keys.txt)
Op te ruimen na migratie:
git rm secrets/linkwarden.enc.yml (buiten scope)
git rm secrets/restic.enc.yml (verwijderd)
Klaar als: alle secrets vindbaar in Vaultwarden map "Homelab", verouderde bestanden verwijderd
Bijdrage: G7 · Tijd: ~1 uur
Wat uitgeprint en fysiek opgeslagen moet worden (in kluis of op veilige plek):
- age private key (coruscant: ~/.config/sops/age/keys.txt)
- Vaultwarden admin token
- Proxmox root wachtwoord
- Router admin wachtwoord
- Herstelcodes van alle MFA accounts (zodra Authentik actief is)
Aanpak:
Bijdrage: G1, G5, G7
Gekozen aanpak: geen PBS. Twee lagen:
Volledige strategie per service: zie docs/services/backup-strategie.md
Afgerond:
Nog te doen:
Bijdrage: G6 · Tijd: ~2 uur
services/arr/docker-compose.yml met:
- Sonarr (series beheer)
- Radarr (films beheer)
- Prowlarr (indexer management, vervangt Jackett)
- Bazarr (ondertiteling)
NFS mounts van TrueNAS:
- /media/series → Sonarr
- /media/films → Radarr
- /downloads → gedeeld download pad
Traefik routes intern (niet extern bereikbaar)
Authentik forward auth voor toegangsbeveiliging
Bijdrage: G1, G2 · Tijd: ~1 uur
Intern wiki voor technische documentatie, domotica-tricks, en huishoudelijke informatie.
Toegankelijk voor het hele gezin via de browser. Gekozen platform: Wiki.js (markdown-gebaseerd, moderne UI, PostgreSQL backend).
1. wikijs VM aanmaken via OpenTofu:
VM ID 210 · 1 vCPU · 1GB RAM · 16GB
2. services/wikijs/docker-compose.yml:
- Wiki.js
- PostgreSQL (database)
Traefik route: wiki.home.drice.nl (intern netwerk)
3. Authentik OIDC koppelen (Fase 3)
4. Starterstructuur aanmaken:
Sectie: Thuis → Wifi, Apparaten, Huis-informatie
Sectie: Domotica → Home Assistant, Automations, OwnTracks
Sectie: Servers → Services, Backup, Noodprocedure
Sectie: Gezin → Vakanties, Afspraken, Recepten (niet-tech)
Klaar als: wiki.home.drice.nl bereikbaar, starterstructuur aangemaakt
Bijdrage: G3, G7 · Tijd: ~30 min
Remote toegang tot het thuisnetwerk zonder port forwarding. Fallback als Traefik down is.
Vaultwarden en Home Assistant bereikbaar als je buiten bent via Tailscale IP.
1. Tailscale account aanmaken (gratis, max 3 gebruikers gratis)
2. Tailscale installeren op coruscant als subnet router:
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up --advertise-routes=192.168.2.0/24 --accept-dns=false
3. Tailscale activeren op eigen telefoon + laptop
4. In Tailscale admin → Route settings → approve subnet route
5. Test: thuis-services bereikbaar via 192.168.2.x terwijl je buiten bent
Klaar als: externe toegang tot 192.168.2.0/24 werkt via Tailscale tunnel
Bijdrage: G6 · Tijd: ~1 uur
1. Navidrome toevoegen aan services/arr/docker-compose.yml of eigen compose
NFS mount TrueNAS: /media/muziek
Traefik route: music.drice.nl
Authentik OIDC koppelen
2. Subsonic-compatible apps instellen op telefoons:
Symfonium (Android) of play:Sub (iOS) → music.drice.nl
Bijdrage: G6 · Tijd: ~1 uur
1. Calibre-web toevoegen aan services/arr/docker-compose.yml of eigen compose:
- Mount NFS van TrueNAS: /media/ebooks
- Traefik route: books.drice.nl
- Authentik SSO koppelen
2. Readarr toevoegen aan Arr stack:
- Automatisch ebooks ophalen en toevoegen aan Calibre library
- Zelfde NFS mount als Calibre-web
- Intern bereikbaar (geen externe route nodig)
3. Initiële library importeren:
- Bestaande ebooks van TrueNAS of lokale opslag importeren in Calibre
Bijdrage: G6 · Tijd: ~1 uur
Bestaande Plex en/of Jellyfin installatie beoordelen:
- Draait als code (Ansible playbook)? Zo niet, beschrijven
- NFS mount van TrueNAS correct geconfigureerd?
- Traefik route aanwezig?
- Keuze: Plex (beter apps) vs Jellyfin (volledig open source)
→ Beide kunnen naast elkaar draaien, keuze op basis van gebruik
Bijdrage: G5, G4 · Tijd: ~3 uur
1. Ollama VM aanmaken via OpenTofu:
VM ID 209 · 4-8 vCPU · 8-16GB RAM (klein model werkt prima zonder GPU)
2. services/ollama/docker-compose.yml:
- Ollama (model server)
- Open WebUI (chatinterface achter Authentik SSO)
- Wyoming Whisper (STT — spraak naar tekst)
- Wyoming Piper (TTS — tekst naar spraak)
3. Modellen downloaden:
ollama pull llama3.2 # algemeen gebruik
ollama pull nomic-embed-text # embeddings voor RAG/Context Chat
ollama pull qwen2.5:3b # lichtgewicht voor snelle taken
4. Context Chat instellen (RAG over Nextcloud documenten):
Koppeling Nextcloud → vector-DB → Ollama via Open WebUI
Doel: vragen beantwoorden over eigen documenten, lokaal
5. Wyoming integratie in Home Assistant:
HA → Settings → Voice Assistants → Wyoming Whisper + Piper
Volledige spraakpipeline: Whisper (STT) → Ollama (LLM) → Piper (TTS)
Geen Google/Amazon/cloud nodig
6. Ollama koppelen aan Home Assistant als AI backend:
HA → Ollama integratie voor tekst/advies taken in automations
Bijdrage: G1 · Tijd: 4-6 uur (meerdere sessies)
Per bestaande service een Ansible playbook schrijven. Volgorde op risico (laag → hoog):
1. Portainer — eenvoudig, geen state
2. Code-server — eenvoudig
3. Jellyfin/Plex — NFS mounts
4. Nextcloud — database + volumes (al nieuw gezet in Deel 10)
5. Home Assistant — meest complex, USB/Zigbee, voorzichtig
6. Frigate — camera config via SOPS secret, volledig nieuw inrichten
Firefly: wordt niet meer bijgehouden — uit scope gehaald.
Frigate: valt onder Home Automation, niet familie services. Wordt volledig
opnieuw ingericht via Ansible inclusief SOPS encryptie voor camera credentials.
Bijdrage: G3, G7 · Tijd: 4-8 uur · Risico: hoog
Pas aanpakken als:
Aanpak: VLAN voor VLAN, met rollback plan per stap:
Stap 1: VLANs aanmaken in UDR (Management / Servers / IoT / Trusted / Guest)
Stap 2: pve-pilot migreren naar Management VLAN 10
Stap 3: Overige Proxmox nodes migreren
Stap 4: Services VMs migreren naar Servers VLAN 20
Stap 5: IoT apparaten migreren naar IoT VLAN 30
Stap 6: Firewall regels activeren (zie network/firewall-rules.md)
Bijdrage: G1 (cloud-onafhankelijkheid) · Tijd: ~2 uur · Vereiste: VLAN migratie klaar
Forgejo is een lichtgewicht Gitea-fork — volledig zelfgehost alternatief voor gitlab.com.
Draait op 512MB RAM (veel lichter dan GitLab CE).
1. forgejo VM aanmaken via OpenTofu:
VM ID 215 · 1 vCPU · 512MB RAM · 10GB
2. services/forgejo/docker-compose.yml
Traefik route: git.drice.nl
Authentik OIDC koppelen
3. Repo migreren van gitlab.com naar Forgejo:
Forgejo UI → + → Migrate repository → GitLab
Alle branches, tags en issues worden meegenomen
4. Coruscant git remote updaten:
git remote set-url origin git@git.drice.nl:drice/home-automation.git
5. CI/CD optioneel via Forgejo Actions (compatibel met GitHub Actions syntax)
⚠️ Kip-ei overweging: Als Forgejo down is, heb je geen toegang tot je IaaC.
Zorg voor een offline kopie van de repo op coruscant (git pull regelmatig).
Overweeg gitlab.com als read-only mirror te bewaren.
proxmox-node-hardening uitvoeren op alle nodes (systemd service)tofu apply eerste VM succesvol