Skip to content

NCC-1704

NCC-1704 is a tertiary Pi-Hole instance running in Docker, now paired with Unbound as a recursive DNS resolver.

pihole-screenshot

Rather than forwarding DNS queries to an upstream provider like Cloudflare or Google, Unbound resolves them directly by walking the DNS hierarchy from the root nameservers. This means no third-party resolver ever sees your query traffic — Pi-hole handles ad/tracker blocking, and Unbound handles the resolution itself.

The two services share a private Docker network (phobos-network) with static IPs. External devices send DNS queries to Pi-hole at the Docker host's IP on port 53 (exposed via the ports: mapping). Pi-hole then forwards upstream queries to Unbound internally at unbound#53 (172.20.0.4), which external devices never interact with directly.

docker-compose.yml

networks:
  phobos-network:
    external: true

services:
  unbound:
    image: mvance/unbound:latest
    container_name: unbound
    restart: unless-stopped
    networks:
      phobos-network:
        ipv4_address: "172.20.0.4"
    volumes:
      - /ssd/docker/appdata/pihole/unbound/root.hints:/opt/unbound/etc/unbound/root.hints:ro

  pihole:
    container_name: pihole3
    hostname: ncc-1704
    image: pihole/pihole:latest
    depends_on:
      - unbound
    networks:
      phobos-network:
        ipv4_address: "172.20.0.3"
    ports:
      - 80:80
      - 443:443
      - 53:53/tcp
      - 53:53/udp
      - 123:123/udp
    environment:
      - TZ=Europe/London
      - FTLCONF_webserver_api_password=
      - FTLCONF_dns_upstreams=unbound#53
    volumes:
      - /ssd/docker/appdata/pihole/etc-pihole:/etc/pihole
      - /ssd/docker/appdata/pihole/etc-dnsmasq.d:/etc/dnsmasq.d
    restart: unless-stopped
    cap_add:
      - SYS_TIME
      - SYS_NICE

Dynamic File

To ensure I can use my domain to reach the dashboard, I have added the regex middleware config to the dynamic file called config.yml and have also created a dynamic file that specifies the domain and calls the middleware.

You can see these in the Traefik - Dynamic Files page

I have also updated the config for Nebula-Sync to ensure this is also kept in sync with the other 2 Pi-Holes