## Changes - Created comprehensive NPM + Pi-hole setup documentation - Added DNS sync script to automatically sync NPM proxy hosts to Pi-hole - Updated hosts.yml with npm-pihole host entry ## Features - Automatic local DNS resolution for homelab services - Fixes 403 errors with "Internal Only" access lists - Hourly cron sync keeps Pi-hole updated with NPM changes - Cloudflare real IP configuration for proper IP detection ## Files Added - server-configs/networking/nginx-proxy-manager-pihole.md - server-configs/networking/scripts/npm-pihole-sync.sh ## Files Modified - server-configs/hosts.yml (added npm-pihole host) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
75 lines
1.8 KiB
Bash
Executable File
75 lines
1.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# NPM to Pi-hole DNS Sync
|
|
# Syncs Nginx Proxy Manager proxy hosts to Pi-hole local DNS
|
|
# All domains point to NPM's IP, not the forward destination
|
|
|
|
set -e
|
|
|
|
DRY_RUN=false
|
|
if [[ "$1" == "--dry-run" ]]; then
|
|
DRY_RUN=true
|
|
fi
|
|
|
|
# NPM's IP address (where all domains should point)
|
|
NPM_IP="10.10.0.16"
|
|
|
|
echo "NPM → Pi-hole DNS Sync"
|
|
echo "============================================================"
|
|
|
|
# Query NPM database for all enabled proxy hosts
|
|
DOMAINS=$(docker exec nginx-proxy-manager_app_1 python3 -c '
|
|
import sqlite3
|
|
import json
|
|
|
|
conn = sqlite3.connect("/data/database.sqlite")
|
|
cursor = conn.cursor()
|
|
cursor.execute("SELECT domain_names FROM proxy_host WHERE enabled = 1")
|
|
|
|
domains = []
|
|
for (domain_names,) in cursor.fetchall():
|
|
for domain in json.loads(domain_names or "[]"):
|
|
domains.append(domain)
|
|
|
|
for domain in sorted(domains):
|
|
print(domain)
|
|
|
|
conn.close()
|
|
')
|
|
|
|
# Count records
|
|
RECORD_COUNT=$(echo "$DOMAINS" | wc -l)
|
|
echo "Found $RECORD_COUNT enabled proxy hosts"
|
|
echo ""
|
|
echo "All domains will point to NPM at: $NPM_IP"
|
|
echo ""
|
|
echo "Domains to sync:"
|
|
echo "$DOMAINS" | awk -v ip="$NPM_IP" '{printf " %-15s %s\n", ip, $0}'
|
|
|
|
if [ "$DRY_RUN" = true ]; then
|
|
echo ""
|
|
echo "[DRY RUN] Not applying changes"
|
|
exit 0
|
|
fi
|
|
|
|
# Build new custom.list
|
|
NEW_DNS="# Pi-hole Local DNS Records
|
|
# Auto-synced from Nginx Proxy Manager
|
|
# All domains point to NPM at $NPM_IP
|
|
|
|
"
|
|
|
|
while IFS= read -r domain; do
|
|
NEW_DNS+="$NPM_IP $domain"$'\n'
|
|
done <<< "$DOMAINS"
|
|
|
|
# Write to Pi-hole
|
|
echo "$NEW_DNS" | docker exec -i pihole tee /etc/pihole/custom.list > /dev/null
|
|
|
|
# Reload Pi-hole DNS
|
|
docker exec pihole pihole restartdns reload > /dev/null
|
|
|
|
echo ""
|
|
echo "✓ Updated $RECORD_COUNT DNS records in Pi-hole"
|
|
echo "✓ All domains now point to NPM at $NPM_IP"
|
|
echo "✓ Reloaded Pi-hole DNS"
|