# DNS Automation **Status:** Completed (2026-02-04) **Goal:** Automatically generate DNS entries from host configurations **Approach:** Leverage Nix to generate zone file entries from flake host configurations Since most hosts use static IPs defined in their NixOS configurations, we can extract this information and automatically generate A records. This keeps DNS in sync with the actual host configs. ## Implementation - [x] Add optional CNAME field to host configurations - [x] Added `homelab.dns.cnames` option in `modules/homelab/dns.nix` - [x] Added `homelab.dns.enable` to allow opting out (defaults to true) - [x] Documented in CLAUDE.md - [x] Create Nix function to extract DNS records from all hosts - [x] Created `lib/dns-zone.nix` with extraction functions - [x] Parses each host's `networking.hostName` and `systemd.network.networks` IP configuration - [x] Collects CNAMEs from `homelab.dns.cnames` - [x] Filters out VPN interfaces (wg*, tun*, tap*, vti*) - [x] Generates complete zone file with A and CNAME records - [x] Integrate auto-generated records into zone files - [x] External hosts separated to `services/ns/external-hosts.nix` - [x] Zone includes comments showing which records are auto-generated vs external - [x] Update zone file serial number automatically - [x] Uses `self.sourceInfo.lastModified` (git commit timestamp) - [x] Test zone file validity after generation - [x] NSD validates zone at build time via `nsd-checkzone` - [x] Deploy process documented - [x] Merge to master, run auto-upgrade on ns1/ns2 ## Files Created/Modified | File | Purpose | |------|---------| | `modules/homelab/dns.nix` | Defines `homelab.dns.*` options | | `modules/homelab/default.nix` | Module import hub | | `lib/dns-zone.nix` | Zone generation functions | | `services/ns/external-hosts.nix` | Non-flake host records | | `services/ns/master-authorative.nix` | Uses generated zone | | `services/ns/secondary-authorative.nix` | Uses generated zone | ## Usage View generated zone: ```bash nix eval .#nixosConfigurations.ns1.config.services.nsd.zones.'"home.2rjus.net"'.data --raw ``` Add CNAMEs to a host: ```nix homelab.dns.cnames = [ "alias1" "alias2" ]; ``` Exclude a host from DNS: ```nix homelab.dns.enable = false; ``` Add non-flake hosts: Edit `services/ns/external-hosts.nix`