#!/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"