# 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: ```bash ./jeannie rpi-services ``` Useful overrides: ```bash LAB_RPI_HOST=192.168.100.89 ./jeannie rpi-services PIHOLE_WEBPASSWORD='' ./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.