system/settings/services/adguard-home.nix (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | {
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}
'';
};
};
}
|