my-homelab-configs/infra/rpi-services/README.md

2.4 KiB

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.