main
1{
2 den.aspects.services.headscale.dns = {
3 nixos = {
4 host,
5 reverseProxy,
6 lib,
7 config,
8 ...
9 }: let
10 inherit (import ./_lib.nix {inherit lib;}) dnsRecordsFilePath mkDirectEntries;
11
12 cfg = host.settings.services.headscale;
13
14 directEntries = mkDirectEntries reverseProxy;
15
16 mkRecordValue = ip:
17 if ip.kind == "clear"
18 then ip.value
19 else config.vaultix.placeholder.${ip.name};
20
21 directRecords = lib.concatMap (e:
22 lib.optionals (e.v4 != null) [
23 {
24 name = e.domain;
25 type = "A";
26 value = mkRecordValue e.v4;
27 }
28 ]
29 ++ lib.optionals (e.v6 != null) [
30 {
31 name = e.domain;
32 type = "AAAA";
33 value = mkRecordValue e.v6;
34 }
35 ])
36 directEntries;
37
38 directSecretIps = lib.unique (lib.concatMap (e:
39 lib.optional (e.v4 != null && e.v4.kind == "secret") e.v4
40 ++ lib.optional (e.v6 != null && e.v6.kind == "secret") e.v6)
41 directEntries);
42 in {
43 services.headscale.settings.dns = {
44 magic_dns = cfg.dns.enable;
45 override_local_dns = cfg.dns.enable;
46 base_domain = cfg.dns.domain;
47 nameservers.global = [
48 # IPv4
49 "119.29.29.29" # DNSPod
50 "223.5.5.5" # AliDNS
51 # IPv6
52 "2400:3200::1" # AliDNS
53 "2606:4700:4700::1111" # Cloudflare
54 ];
55 extra_records_path = dnsRecordsFilePath;
56 };
57
58 vaultix.secrets = lib.listToAttrs (map (s: {
59 name = s.name;
60 value.file = s.file;
61 })
62 directSecretIps);
63
64 vaultix.templates.headscale-direct-records = {
65 content = builtins.toJSON directRecords;
66 owner = config.services.headscale.user;
67 group = config.services.headscale.group;
68 mode = "0400";
69 };
70 };
71 };
72}