my-homelab-configs/infra/rpi-services
juvdiaz 3e23b794e7 Fix Pi-hole v6 LAN DNS mode 2026-06-29 14:10:50 -06:00
..
README.md Fix Pi-hole v6 LAN DNS mode 2026-06-29 14:10:50 -06:00
adlists.txt Add RPi DNS services stack 2026-06-27 16:18:17 -06:00
bootstrap.sh Fix Pi-hole v6 LAN DNS mode 2026-06-29 14:10:50 -06:00
cname-records.txt Centralize homelab inventory preflight and pihole state 2026-06-27 16:55:28 -06:00
docker-compose.yml Fix Pi-hole v6 LAN DNS mode 2026-06-29 14:10:50 -06:00
local-dns-records.txt Centralize homelab inventory preflight and pihole state 2026-06-27 16:55:28 -06:00
seed-uptime-kuma.js Clean up RPi service reload output 2026-06-29 14:00:42 -06:00
static-dhcp-hosts.txt Centralize homelab inventory preflight and pihole state 2026-06-27 16:55:28 -06:00
uptime-kuma-monitors.json Seed Uptime Kuma monitors 2026-06-27 16:43:51 -06:00

README.md

RPi Services

This stack runs lightweight always-on services on the Raspberry Pi outside the Kubernetes cluster:

  • Pi-hole on DNS port 53 and web port 8081
  • Unbound as Pi-hole's first upstream resolver
  • Uptime Kuma on port 3001
  • Uptime Kuma monitor seeds for public edge, Gitea, Traefik, RPi DNS, Pi-hole, and Debian-host ARR services

Pi-hole also keeps public fallback upstreams in its config, so DNS can continue to resolve through 1.1.1.1 and 9.9.9.9 if the Unbound container stops. For Pi-hole v6, the stack sets FTLCONF_dns_interface=ALL and FTLCONF_dns_listeningMode=ALL through PIHOLE_DNS_INTERFACE and PIHOLE_DNS_LISTENING_MODE so LAN clients such as the Debian control host are not rejected as non-local networks.

The bootstrap script prefers Docker data under /nvme-storage/docker only when that path is an active mount point and writable. If the NVMe is missing or reset, it rewrites Docker's data-root to /var/lib/docker and restarts Docker, allowing the services to come up from the SD/root filesystem instead.

Service config lives under /opt/homelab-rpi-services/data by default. Backup storage is intentionally not placed on the NVMe until the disk has proven stable.

Deploy from the Debian homelab server:

./jeannie rpi-services

Useful overrides:

LAB_RPI_HOST=192.168.100.89 ./jeannie rpi-services
PIHOLE_WEBPASSWORD='<password>' ./jeannie rpi-services
PIHOLE_DNS_INTERFACE=ALL PIHOLE_DNS_LISTENING_MODE=ALL ./jeannie rpi-services
PIHOLE_WEB_PORT=8081 UPTIME_KUMA_PORT=3001 ./jeannie rpi-services
LAB_RPI_STOP_LEGACY_PIHOLE=false ./jeannie rpi-services

If PIHOLE_WEBPASSWORD is not provided, the bootstrap generates one and keeps it in /opt/homelab-rpi-services/.env for future runs.

Managed Pi-hole state is stored in:

  • adlists.txt
  • local-dns-records.txt
  • cname-records.txt
  • static-dhcp-hosts.txt

The bootstrap inserts adlists without deleting existing manual Pi-hole lists. It renders local DNS, CNAME, and optional static DHCP entries into /etc/dnsmasq.d/02-homelab-managed-dns.conf inside the Pi-hole container, then reloads DNS.

Managed Uptime Kuma monitors are stored in uptime-kuma-monitors.json. The bootstrap seeds them after the Uptime Kuma database exists. If Uptime Kuma has not completed initial admin setup yet, the seed step skips cleanly; rerun ./jeannie rpi-services after creating the first user.