pihole-dns-setup
npx skills add https://github.com/dawiddutoit/custom-claude --skill pihole-dns-setup
Agent 安装分布
Skill 文档
Pi-hole DNS Setup Skill
Configure Pi-hole local DNS records for local network resolution of temet.ai domains.
Quick Start
Run automated DNS setup from domains.toml:
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply
Or manually add a single DNS record:
# Get Pi IP
PI_IP=$(hostname -I | awk '{print $1}')
# Test DNS resolution
dig @localhost pihole.temet.ai +short
Table of Contents
- When to Use This Skill
- What This Skill Does
- Instructions
- 3.1 Detect Pi IP Address
- 3.2 Get Domains from Configuration
- 3.3 Apply DNS Changes
- 3.4 Verify DNS Resolution
- 3.5 Router DNS Reminder
- Supporting Files
- Expected Outcomes
- Requirements
- Red Flags to Avoid
When to Use This Skill
Explicit Triggers:
- “Set up Pi-hole DNS”
- “Configure local DNS”
- “Add DNS record for [domain]”
- “Set up DNS entries”
- “Make [service].temet.ai resolve locally”
Implicit Triggers:
- After adding a new service to domains.toml
- When local resolution fails for temet.ai domains
- Setting up a fresh Pi-hole installation
- Migrating services to new IP addresses
Debugging Triggers:
- “DNS not resolving”
- “Can’t access [service].temet.ai on local network”
- “dig returns wrong IP”
- “Works remotely but not locally”
What This Skill Does
- Detects Pi IP – Auto-discovers the Raspberry Pi’s local IP address
- Reads Configuration – Gets domain list from domains.toml
- Updates DNS – Configures Pi-hole with local DNS entries via docker-compose.yml
- Verifies Resolution – Tests DNS resolution works correctly
- Provides Guidance – Reminds about router DNS configuration
Instructions
3.1 Detect Pi IP Address
Get the Pi’s local IP automatically:
hostname -I | awk '{print $1}'
Expected output: 192.168.68.135 (or similar)
Alternative methods if needed:
# From network interface
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
# From Pi-hole container environment
docker exec pihole printenv | grep PIHOLE_INTERFACE
3.2 Get Domains from Configuration
Read domains from domains.toml:
# List all configured services with DNS entries
./scripts/manage-domains.sh list
Or parse directly:
grep -E "^subdomain = |^dns_ip = " /home/dawiddutoit/projects/network/domains.toml
Current domains defined in domains.toml:
| Service | Domain | DNS IP |
|---|---|---|
| Pi-hole | pihole.temet.ai | 192.168.68.135 |
| Jaeger | jaeger.temet.ai | 192.168.68.135 |
| Langfuse | langfuse.temet.ai | 192.168.68.135 |
| Home Assistant | ha.temet.ai | 192.168.68.135 |
| Code Server | code.temet.ai | 192.168.68.135 |
| Sprinkler | sprinkler.temet.ai | 192.168.68.105 |
| Webhook | webhook.temet.ai | 192.168.68.135 |
| Root | temet.ai | 192.168.68.135 |
3.3 Apply DNS Changes
Automated Method (Recommended):
cd /home/dawiddutoit/projects/network && ./scripts/manage-domains.sh apply
This runs generate-pihole-dns.py which:
- Reads domains.toml
- Updates
FTLCONF_dns_hostsin docker-compose.yml - Restarts Pi-hole to apply changes
Manual DNS Entry (Single Domain):
If you need to add a single entry without full apply:
# Edit docker-compose.yml FTLCONF_dns_hosts section
# Then restart Pi-hole
docker compose -f /home/dawiddutoit/projects/network/docker-compose.yml restart pihole
How DNS Configuration Works:
Pi-hole v6 uses FTLCONF_dns_hosts environment variable for custom DNS:
environment:
FTLCONF_dns_hosts: |
192.168.68.135 pihole.temet.ai
192.168.68.135 jaeger.temet.ai
192.168.68.105 sprinkler.temet.ai
3.4 Verify DNS Resolution
After applying changes, verify DNS works:
Test individual domain:
dig @localhost pihole.temet.ai +short
# Expected: 192.168.68.135
Test all configured domains:
for domain in pihole jaeger langfuse ha code webhook; do
echo -n "$domain.temet.ai -> "
dig @localhost $domain.temet.ai +short
done
Test from another device on the network:
# Replace 192.168.68.135 with Pi's IP
dig @192.168.68.135 pihole.temet.ai +short
Check Pi-hole DNS logs:
docker exec pihole pihole -t
# Watch live DNS queries
3.5 Router DNS Reminder
Important: For DNS to work network-wide, configure your router:
-
Set router’s DHCP to use Pi-hole as primary DNS:
- Primary DNS:
192.168.68.135(Pi’s IP) - Secondary DNS:
1.1.1.1(fallback)
- Primary DNS:
-
Or configure each device individually to use Pi-hole DNS
Verify device is using Pi-hole:
# On the device, check what DNS server it's using
cat /etc/resolv.conf
# Should show: nameserver 192.168.68.135
Supporting Files
| File | Purpose |
|---|---|
references/reference.md |
DNS configuration deep-dive, Pi-hole internals, troubleshooting |
examples/examples.md |
Common scenarios and configurations |
scripts/verify-dns.sh |
DNS verification script |
Expected Outcomes
Success:
- All domains resolve to correct IPs locally
dig @localhost domain.temet.aireturns expected IP- Services accessible at
https://domain.temet.aion local network
Partial Success:
- DNS works from Pi but not from other devices
- Cause: Router not configured to use Pi-hole as DNS
Failure Indicators:
digreturns NXDOMAIN -> DNS entry not configureddigreturns wrong IP -> Stale configuration- Pi-hole not responding -> Container not running
Requirements
Environment:
- Pi-hole container running:
docker ps | grep pihole - Docker Compose available
- domains.toml configured
Tools needed:
- Read (configuration files)
- Bash (dig, docker commands)
- Grep (parsing domains)
Red Flags to Avoid
- Do not add DNS entries directly to Pi-hole web UI (use domains.toml)
- Do not forget to restart Pi-hole after config changes
- Do not skip the router DNS configuration reminder
- Do not use
127.0.0.1as DNS IP (use actual Pi IP) - Do not assume DNS propagates instantly (may take 1-2 minutes)
- Do not forget IoT devices may need different IPs (sprinkler -> 192.168.68.105)
Notes
- DNS entries are stored in docker-compose.yml
FTLCONF_dns_hosts - The
generate-pihole-dns.pyscript reads domains.toml and updates docker-compose.yml - Local DNS resolution allows fast LAN access without internet roundtrip
- Remote access uses Cloudflare DNS (separate from Pi-hole)
- Always verify DNS after changes with
dig @localhost domain +short