my-homelab-configs/infra/rpi-services
jv dce4fa6022 Edge matrix vhost, node-exporter scrape, arr/rpi refinements
- bootstrap/edge: add matrix-vhost template + matrix.conf mount
  (isolated cert path), config_hash includes matrix.conf so tofu
  regenerates edge config when it changes; add node-exporter sidecar
- bootstrap/platform: prometheus additionalScrapeConfigs for rpi-node
  and oci-edge-node targets, plus node-exporter edge port 9100
- apps/homelab-alerts: host filesystem >85% alert
- infra/arr-stack + rpi-services: compose refinements
- .gitignore: ignore tofu tfstate backups (*.tfstate.*.backup)
2026-09-16 11:37:35 -05:00
..
README.md Update docker root dir in rpi 2026-07-02 09:02:52 -06:00
adlists.txt Add RPi DNS services stack 2026-06-27 16:18:17 -06:00
bootstrap.sh Update docker root dir in rpi 2026-07-02 09:02:52 -06:00
cname-records.txt Centralize homelab inventory preflight and pihole state 2026-06-27 16:55:28 -06:00
docker-compose.yml Edge matrix vhost, node-exporter scrape, arr/rpi refinements 2026-09-16 11:37:35 -05: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.

Docker data for the Raspberry Pi is expected under /nvme-storage/docker when that path is an active mount point and writable. If the NVMe is missing or reset, the bootstrap 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.