# Verified compose for AdGuard Home, tested 2026-10-19 by the SelfHostBench lab (3 runs; the figures are the median). # Lab host: AMD EPYC 9V45 96-Core Processor, 2 vCPU, 7.8 GiB RAM, x86_64, Docker 28.0.4. # Floating image tags below were replaced by the version resolved at test time; # the registry digest is in the comment on each image line. # Measurements: adguard-home.json (schema 3). # Lab difference: The lab run publishes no host ports (53, 80 and 3000 of the published file are not mapped): the runner's systemd-resolved listens on 127.0.0.53:53 and Docker's port 53 publishing can clash with it, and the setup and load steps reach AdGuard Home by service name over the Compose network instead. Image and volumes are the published file's. The published file has not been run with its ports mapped in the lab. # AdGuard Home (official image adguard/adguardhome): a network-wide DNS ad blocker with a web interface. # Follows the Docker Hub page https://hub.docker.com/r/adguard/adguardhome and the wiki # https://github.com/AdguardTeam/AdGuardHome/wiki/Docker : two volumes, work and conf, and the port list. # Only the ports for plain DNS and the web interface are published; add the encrypted-DNS, DHCP and DNSCrypt # ports from the wiki if you use those features. # AdGuard Home has no password variable: the first start serves a setup wizard on port 3000 where you choose the # admin user and password. Do that before you expose anything. # Do not expose port 53 to the internet: an open resolver is used for DDoS reflection. name: adguard-home services: adguardhome: image: adguard/adguardhome:v0.107.79 # sha256:aba9e3bf0613be3ba3755e1fc311b126e2c24bec25e18b6483894a88283074f0 (version v0.107.79, from label:org.opencontainers.image.version) restart: unless-stopped ports: # DNS, for the devices on your network. If the host's own DNS (systemd-resolved on Ubuntu and Debian) # already listens on port 53, Docker cannot bind it: see "Port 53 is already in use" in the article. - "53:53/tcp" - "53:53/udp" # The web interface. The setup wizard asks which port to use; 80 is its default. - "80:80/tcp" # The setup wizard, first start only. After the wizard AdGuard Home listens on the port you chose (80) and 3000 is unused. - "3000:3000/tcp" volumes: # Everything AdGuard Home writes: query log and statistics (work) and AdGuardHome.yaml, the settings (conf). - adguard-work:/opt/adguardhome/work - adguard-conf:/opt/adguardhome/conf volumes: adguard-work: adguard-conf: