AdGuard Home is een netwerk-brede DNS server die advertenties, trackers en
malware-domeinen blokkeert voor alle apparaten op het netwerk. Het vervangt
de DNS van de router en filtert alle DNS-verzoeken voordat ze het internet
bereiken.
DNS is kritieke infrastructuur — als de DNS server uitvalt kunnen apparaten
geen verbinding maken (ook al is het internet zelf bereikbaar). Daarom draaien
er twee instanties met automatische failover via Keepalived VRRP.
Apparaten → 192.168.2.5 (VIP) → adguard-01 (master, 192.168.2.151)
↓ failover (~4 sec)
adguard-02 (backup, 192.168.2.152)
↑
AdGuard Home Sync (elke 5 min)
192.168.2.5). Failover ~4 seconden.3000 (niet 80)| Wat | URL | Opmerking |
|---|---|---|
| Web UI (via VIP) | http://192.168.2.5:3000 | Gebruik dit — wijst altijd naar master |
| Web UI adguard-01 | http://192.168.2.151:3000 | Direct op master |
| Web UI adguard-02 | http://192.168.2.152:3000 | Direct op backup (read-only via sync) |
| DNS | 192.168.2.5:53 | VIP — gebruik altijd dit adres |
Na VLAN migratie: IPs worden 192.168.10.5 (VIP), 192.168.10.151 en
192.168.10.152. Router en UDR bijwerken.
secrets/adguard.enc.ymlsops -d secrets/adguard.enc.yml
Wijzigingen altijd via de web UI van adguard-01 (of via de VIP 192.168.2.5:3000).
AdGuard Home Sync kopieert de config automatisch naar adguard-02 binnen 5 minuten.
Nooit direct op adguard-02 wijzigen — die wordt overschreven door Sync.
# Inloggen op master
ssh ubuntu@192.168.2.151
# Container status
sudo docker ps
sudo docker logs adguard --tail 50
sudo docker logs adguard-sync --tail 50 # alleen op adguard-02
# Container herstarten
cd /opt/adguard && sudo docker compose restart
# Config bekijken
sudo cat /opt/adguard/conf/AdGuardHome.yaml
# Sync handmatig triggeren (op adguard-02)
ssh ubuntu@192.168.2.152
cd /opt/adguard && sudo docker compose -f docker-compose.yml -f docker-compose.backup.yml restart adguard-sync
Getest op 2026-09-09 — failover werkt correct.
# Stop adguard-01 container
ssh ubuntu@192.168.2.151 "cd /opt/adguard && sudo docker compose stop"
# Controleer of VIP naar adguard-02 is verplaatst (binnen ~4 sec)
ssh ubuntu@192.168.2.152 "ip addr show | grep 192.168.2.5"
# Verwacht: inet 192.168.2.5/24 scope global secondary eth0
# DNS werkt nog?
dig @192.168.2.5 google.com +short
# Herstel
ssh ubuntu@192.168.2.151 "cd /opt/adguard && sudo docker compose start"
# Wie heeft de VIP momenteel?
ssh ubuntu@192.168.2.151 "sudo systemctl status keepalived"
ssh ubuntu@192.168.2.152 "ip addr show | grep 192.168.2.5"
Na wijziging van de router DNS naar 192.168.2.5 krijgen devices de nieuwe
DNS bij de volgende DHCP lease verlenging (standaard 24 uur).
Forceer directe update op een device:
ipconfig /release gevolgd door ipconfig /renewsudo dhclient -r && sudo dhclientnslookup google.com 192.168.2.5De airco's genereren honderden geblokkeerde DNS-requests per dag naar MELCloud.
Alle vijf zijn toegevoegd als client met logging en statistieken uitgeschakeld.
Zie docs/devices/airco-mitsubishi.md voor
de volledige apparaatdocumentatie, inclusief wat je moet aanpassen bij een IP-wijziging.
Somfy rolluiken hub — genereert continue DNS-verzoeken naar Overkiz cloud.
Logging en statistieken uitgeschakeld.
Zie docs/devices/connexoon-somfy.md voor
details en de procedure bij een IP-wijziging.
Beide laptops hebben aangepaste AdGuard-instellingen (afwijkend van globale defaults).
Zie docs/devices/laptop-kids.md voor details en
de procedure bij een IP-wijziging.
| Bestand | Functie |
|---|---|
infrastructure/opentofu/adguard.tf |
VM provisioning (malachor + pluto) |
infrastructure/ansible/roles/adguard/ |
Ansible role (install + config) |
infrastructure/ansible/playbooks/adguard.yml |
Deploy playbook |
services/adguard/docker-compose.yml |
AdGuard container definitie |
services/adguard/docker-compose.backup.yml |
Sync container (backup node) |
secrets/adguard.enc.yml |
Encrypted credentials (SOPS/age) |
Keepalived detecteert dit (~4 sec) en verplaatst de VIP naar adguard-02.
Geen actie nodig — DNS blijft werken. Herstel adguard-01:
ssh ubuntu@192.168.2.151 "cd /opt/adguard && sudo docker compose start"
Keepalived geeft de VIP automatisch terug aan adguard-01 zodra de health check
slaagt (curl naar localhost:3000).
Proxmox start de VM automatisch opnieuw (start op boot ingesteld). Keepalived
neemt de failover over. Na VM herstart:
# Controleer of container automatisch is gestart
ssh ubuntu@192.168.2.151 "sudo docker ps"
# Zo niet:
ssh ubuntu@192.168.2.151 "cd /opt/adguard && sudo docker compose up -d"
DNS blijft werken via adguard-01. Geen haast, maar herstel zo snel mogelijk:
# Na VM herstel: sync credentials herstellen en containers starten
ssh ubuntu@192.168.2.152 "sudo ls /opt/adguard/.env" # bestaat .env nog?
# Zo niet, opnieuw aanmaken:
PASSWORD=$(sops -d --extract '["adguard_password"]' secrets/adguard.enc.yml)
ssh ubuntu@192.168.2.152 "echo 'ADGUARD_PASSWORD=$PASSWORD' | sudo tee /opt/adguard/.env"
ssh ubuntu@192.168.2.152 "cd /opt/adguard && sudo docker compose -f docker-compose.yml -f docker-compose.backup.yml up -d"
DNS werkt niet meer. Apparaten kunnen geen domeinnamen oplossen.
Snelste tijdelijk herstel (< 2 minuten):
Router DNS tijdelijk terugzetten naar een publieke DNS server (bijv. 9.9.9.9)
zodat het netwerk weer werkt terwijl je de VMs herstart.
Permanent herstel:
# 1. VMs aanmaken via OpenTofu (als VMs weg zijn)
cd infrastructure/opentofu
tofu apply
# 2. Wacht tot VMs bereikbaar zijn (~2 min voor cloud-init)
ansible -m ping dns_ha
# 3. AdGuard deployen via Ansible
cd infrastructure/ansible
export ADGUARD_PASSWORD=$(sops -d --extract '["adguard_password"]' ../../secrets/adguard.enc.yml)
ansible-playbook playbooks/adguard.yml -e "adguard_password=$ADGUARD_PASSWORD"
# 4. Initiële setup adguard-01 (als config verloren is gegaan)
# Ga naar http://192.168.2.151:3000/install.html
# Stel admin wachtwoord in (zie secrets/adguard.enc.yml)
# Wachtwoord instellen op poort 3000:
# sudo sed -i 's/address: 0.0.0.0:80/address: 0.0.0.0:3000/' /opt/adguard/conf/AdGuardHome.yaml
# sudo docker restart adguard
# 5. Sync triggeren
ssh ubuntu@192.168.2.152 "cd /opt/adguard && sudo docker compose -f docker-compose.yml -f docker-compose.backup.yml restart adguard-sync"
# 6. Router DNS bijwerken naar 192.168.2.5 als dat verloren was gegaan
RTO: ~5 minuten als VMs nog bestaan, ~15 minuten bij volledig verlies.
De config wordt niet automatisch gebackupt buiten de VM. Herstelstappen:
# Check of .env correct is op adguard-02
ssh ubuntu@192.168.2.152 "sudo cat /opt/adguard/.env"
# Wachtwoord opnieuw zetten en sync herstarten
PASSWORD=$(sops -d --extract '["adguard_password"]' secrets/adguard.enc.yml)
ssh ubuntu@192.168.2.152 "echo 'ADGUARD_PASSWORD=$PASSWORD' | sudo tee /opt/adguard/.env"
ssh ubuntu@192.168.2.152 "cd /opt/adguard && sudo docker compose -f docker-compose.yml -f docker-compose.backup.yml up -d --force-recreate adguard-sync"
# Controleer Keepalived status op beide nodes
ssh ubuntu@192.168.2.151 "sudo systemctl status keepalived"
ssh ubuntu@192.168.2.152 "sudo systemctl status keepalived"
# Wie heeft de VIP?
ssh ubuntu@192.168.2.151 "ip addr show | grep 192.168.2.5"
ssh ubuntu@192.168.2.152 "ip addr show | grep 192.168.2.5"
# systemd-resolved mag geen stub listener draaien
ssh ubuntu@192.168.2.151 "sudo grep DNSStubListener /etc/systemd/resolved.conf"
# Moet zijn: DNSStubListener=no
# Zo niet: sudo sed -i 's/^#\?DNSStubListener=.*/DNSStubListener=no/' /etc/systemd/resolved.conf
# sudo systemctl restart systemd-resolved