PD Pi-hole / Unbound / Keepalived Stack
Primary-node stack for the Pi-hole HA plan.
- Repo stack path:
/home/fizzlepoof/repos/truenas-stacks/pihole - Live PD stack path:
/mnt/docker-ssd/docker/compose/pihole - Node role: PD primary / MASTER
- VIP target:
10.5.1.53/24
This stack intentionally covers the PD primary only:
- Pi-hole
- Unbound
- Keepalived
Serenity and RPi4 replicas still need their own deployment steps.
Files
docker-compose.yaml— primary-node stack.env.example— required variablesunbound.conf— shared recursive resolver configkeepalived.conf.template— rendered intokeepalived.confbin/render_keepalived_conf.py— generateskeepalived.conffrom.envbin/prepare_pd.sh— creates appdata dirs, downloads root hints, renders config, validates compose, optional--up
First-time setup on PD
cd /mnt/docker-ssd/docker/compose/pihole
cp .env.example .env
nano .env # set real passwords + verify LAN_INTERFACE
/usr/bin/bash bin/prepare_pd.sh
If that validates cleanly, bring it up:
/usr/bin/bash bin/prepare_pd.sh --up
Important notes
KEEPALIVED_PASSWORDmust be 8 chars or fewer because VRRP PASS auth is annoying and old.- Verify
LAN_INTERFACEon PD before deployment (ip link show). FTLCONF_dns_listeningMode=LOCALis set because TrueNAS binds loopback on port 53.- This stack does not include Nebula Sync yet. Add that after Serenity/RPi replicas are live.
keepalived.confis generated and should stay local/untracked.