{ config, lib, ... }: let inherit (config.networking) domain; netlib = import ../../../lib/net.nix { inherit lib; }; subdomain = "dns.${domain}"; backend = config.services.adguardhome; cert = config.security.acme.certs.${subdomain}; addrs = backend.settings.dns.bind_hosts; byFamily = builtins.partition netlib.isv6 addrs; v6s = byFamily.right; v4s = byFamily.wrong; in { security.acme.certs.${subdomain} = { inheritDefaults = false; extraDomainNames = addrs; server = "https://acme.${domain}/acme/home/directory"; listenHTTP = ":8080"; group = "adguardhome"; ## updates are picked up automatically # reloadServices = [ "adguardhome" ]; }; users.groups.adguardhome = { }; users.users.adguardhome = { description = "AdGuard Home user"; group = "adguardhome"; isSystemUser = true; }; systemd.services.adguardhome = { serviceConfig = { DynamicUser = lib.mkForce false; User = "adguardhome"; Group = "adguardhome"; }; }; services.adguardhome = { enable = true; host = "[::1]"; # otherwise blocklists will be lost (prefer web UI configuration) mutableSettings = true; settings = { dhcp.enabled = false; dns = { hostsfile_enabled = false; trusted_proxies = [ "::1" ]; enable_dnssec = true; filtering = { protection_enabled = true; filtering_enabled = true; blocking_mode = "refused"; }; upstream_timeout = "2s"; cache_enabled = true; cache_optimistic = false; cache_size = 100 * 1024 * 1024; }; tls = { enabled = true; server_name = subdomain; port_https = 0; # disabled, not random port_dns_over_tls = 853; port_dns_over_quic = 853; allow_unencrypted_doh = true; # for reverse_proxy usage certificate_path = "${cert.directory}/cert.pem"; private_key_path = "${cert.directory}/key.pem"; }; }; }; services.dnsmasq.settings.host-record = [ "${subdomain},${builtins.head v4s},${builtins.head v6s},${toString (24 * 60 * 60)}" ]; services.caddy.virtualHosts = { ${subdomain} = { serverAliases = addrs; extraConfig = '' tls { issuer internal { ca home } } reverse_proxy /.well-known/acme-challenge/* { to localhost${cert.listenHTTP} } reverse_proxy * ${backend.host}:${toString backend.port} ''; }; }; }