Pi-hole on a Mini PC — Complete DNS Ad Blocking Guide | Mini PC Lab
By Mini PC Lab Team · January 7, 2026 · Updated March 27, 2026
This article contains affiliate links. If you purchase through our links, we may earn a commission at no extra cost to you. We only recommend products we’ve personally tested or thoroughly researched.

Pi-hole blocks ads at the DNS level for every device on your network — phones, TVs, gaming consoles — without installing anything on those devices. A mini PC running Pi-hole in Docker is more reliable, faster, and easier to maintain than a Raspberry Pi. This guide covers installation, configuration, and the advanced settings that most guides skip.
Before You Start
Requirements:
- Mini PC running Linux with Docker installed
- Static IP on your mini PC (required — DHCP address can change and break DNS)
- 512MB RAM allocated (Pi-hole is extremely lightweight)
- Estimated time: 15–20 minutes
The cheapest way to get started: A Beelink EQ14 at ~$190 runs Pi-hole, Vaultwarden, Home Assistant, Nginx Proxy Manager, Uptime Kuma, and several other services simultaneously at ~6W idle. If you only want Pi-hole, any Intel N-series mini PC works — the EQ14 is the best value option.
Already have a server? Pi-hole runs alongside other Docker containers without conflict. It only needs port 53 (DNS) and optionally 80/443 (admin UI).
Step 1: Set a Static IP
Pi-hole must have a consistent IP address — your router will point DNS to it. If your server’s IP changes, DNS breaks for the entire network.
Option A — DHCP reservation on your router (easiest):
- Find your mini PC’s MAC address:
ip link show | grep "link/ether" - In your router admin panel, find “DHCP reservations” or “address reservation”
- Assign your chosen static IP (e.g.,
192.168.1.53) to that MAC
Option B — Static IP in Debian:
nano /etc/network/interfaces
iface enp2s0 inet static
address 192.168.1.53
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 1.1.1.1
sudo systemctl restart networking
Step 2: Install Pi-hole via Docker
mkdir -p ~/services/pihole
cd ~/services/pihole
Create docker-compose.yml:
services:
pihole:
image: pihole/pihole:2024.07.0
container_name: pihole
hostname: pihole
environment:
TZ: 'America/New_York' # Your timezone
WEBPASSWORD: 'your-secure-password'
PIHOLE_DNS_: '1.1.1.1;1.0.0.1' # Upstream DNS servers
DNSSEC: 'true' # Enable DNSSEC validation
VIRTUAL_HOST: 'pihole.home' # Optional: local hostname
CORS_HOSTS: 'pihole.home'
volumes:
- ./etc-pihole:/etc/pihole
- ./etc-dnsmasq.d:/etc/dnsmasq.d
ports:
- "53:53/tcp"
- "53:53/udp"
- "8080:80/tcp"
restart: unless-stopped
cap_add:
- NET_ADMIN
docker compose up -d
docker compose logs -f pihole
# Wait for "FTL started" in the logs — Pi-hole is ready
Access the admin UI at http://[YOUR-IP]:8080/admin.
Step 3: Configure Your Router to Use Pi-hole
This is what makes Pi-hole work for every device on your network. Change your router’s DNS settings to point to your mini PC’s IP.
Access your router admin panel (usually 192.168.1.1 or 192.168.0.1).
Find the DNS settings — typically under: LAN Setup, DHCP Server, or Advanced DNS.
Set:
- Primary DNS:
192.168.1.53(your Pi-hole’s IP) - Secondary DNS: Leave blank or set to
1.1.1.1as a backup
Save and let clients renew their DHCP leases. This may take a few minutes, or you can disconnect and reconnect devices manually.
Test it’s working:
# From another device on your network
nslookup ads.google.com 192.168.1.53
# Should return 0.0.0.0 — ad domain blocked
nslookup google.com 192.168.1.53
# Should return a real IP — legitimate domain passes through
Step 4: Set Up Pi-hole v6 (Major Update)
Pi-hole v6, released in early 2026, completely rewrites the admin interface and adds a new blocking engine. If you’re running v5 (from 2024 or earlier), update:
# Pull the latest image
docker compose pull
docker compose up -d
# Verify version
docker exec pihole pihole version
Pi-hole v6 changes:
- New REST API replaces the old API
- Redesigned dashboard with real-time query graphs
- Better regex blocklist support
- Improved group management for per-device blocking rules
Step 5: Add More Blocklists
The default blocklist blocks about 70,000 domains. More lists block more ads and trackers.
In the Pi-hole admin UI: Adlists → Add URL
Recommended blocklists for 2026:
| List | Domains | Focus |
|---|---|---|
| Steven Black (default) | ~70K | Ads, malware |
| HaGeZi Multi Normal | ~150K | Ads, trackers, malware |
| OISD Big | ~270K | Comprehensive |
| Hagezi Pro | ~350K | Most comprehensive |
| EasyList | ~60K | Browser-focused ads |
| EasyPrivacy | ~40K | Trackers |
Start with HaGeZi Multi Normal — it’s comprehensive without false positives. Add OISD Big if you want maximum blocking.
After adding lists, go to: Tools → Update Gravity
# Or via terminal:
docker exec pihole pihole -g
Check your blocking rate: The Pi-hole dashboard shows the percentage of DNS queries blocked. Typical home networks: 15–30% blocked. Higher than 40% may indicate over-aggressive lists causing false positives.
Step 6: Set Up DNS-over-HTTPS (Encrypted DNS)
Standard DNS queries are sent unencrypted — your ISP and anyone on your network can see what domains you’re looking up. DNS-over-HTTPS (DoH) encrypts these queries.
Method: cloudflared as a DoH proxy
Add cloudflared as a container that runs alongside Pi-hole:
# Add to your docker-compose.yml, in the services section:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
command: proxy-dns --port 5053 --upstream https://1.1.1.1/dns-query --upstream https://1.0.0.1/dns-query
restart: unless-stopped
Then update your Pi-hole environment variable to use cloudflared as the upstream:
PIHOLE_DNS_: '172.x.x.x#5053' # cloudflared container's IP on port 5053
To get cloudflared’s container IP:
docker inspect cloudflared | grep IPAddress
Restart both containers. Now Pi-hole → cloudflared → Cloudflare DoH. Your DNS queries are encrypted to the upstream resolver.
Step 7: Configure Per-Device Rules (Advanced)
Pi-hole groups let you apply different blocklists to different devices — useful if some devices need stricter blocking (kids’ devices) or fewer blocks (smart TVs that break with aggressive lists).
Create a group:
Group Management → Groups → Add → name it “Kids” or “IoT”
Add a client to the group:
Group Management → Clients → Add → enter device’s IP or MAC → assign to “Kids” group
Assign blocklists to the group:
Group Management → Adlists → for each list, check/uncheck which groups it applies to
Now the “Kids” group gets the standard lists plus a YouTube adult content blocklist; the “IoT” group gets only malware lists (avoiding false positives on smart TVs).
Step 8: Set Up Local DNS Records
Pi-hole can resolve custom local hostnames — so you can type proxmox.home instead of 192.168.1.50:
Local DNS → DNS Records → Add:
- Domain:
proxmox.home - IP:
192.168.1.50
Now all devices on your network resolve proxmox.home to your Proxmox server.
Quick Price Summary
- Beelink EQ14 — Budget Pi-hole host, 6W idle
Troubleshooting
Specific sites not loading after enabling Pi-hole
The site’s domain is probably on a blocklist — a false positive. Check the Query Log in Pi-hole for the blocked domain. Whitelist it: Domains → Whitelist → Add.
# Or via terminal:
docker exec pihole pihole -w example.com
DNS port 53 conflict — container won’t start
Another service is using port 53. On Ubuntu 24.04, systemd-resolved listens on 53. Fix:
# Disable systemd-resolved's stub listener
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
Then restart the Pi-hole container.
Queries still going through even though Pi-hole is running
Your devices may be using hardcoded DNS servers (common on Android phones and Google devices) that bypass the router’s DNS setting. Solution: On your router, add a DNS redirect rule that forces all port 53 traffic to your Pi-hole IP. This varies by router firmware — look for “firewall rules” or “port redirect” in your router admin panel.
Pi-hole admin shows no statistics
Verify Pi-hole is actually being used. Check the Query Log — if it’s empty, your devices aren’t using Pi-hole as their DNS. Re-verify router DNS settings.
What to Do Next
- Add Unbound as a local recursive DNS resolver (DNS queries resolve directly without upstream resolver privacy concerns)
- Integrate with OPNsense — OPNsense’s built-in Unbound DNS can replace Pi-hole for networks running OPNsense. See our OPNsense setup guide
- Monitor stats — Pi-hole’s built-in dashboard shows blocked queries per client, top blocked domains, and query history
See also: best mini PC for Pi-hole guide | mini PC home server beginner’s guide
Recommended Hardware
→ Check Current Price: Beelink EQ14 on Amazon — Intel N150, 6W idle, runs Pi-hole + 10 other containers simultaneously