Native Alpine deployment for the anycast DNS estate -- no Docker, no Caddy, alongside squid and openbao as an exception to the repo norm. Knot binds :53 directly, needs real client addresses for RRL and DNS cookies, and its DNSSEC key store must live on the host filesystem. Deploys a NODE. Zone data lives in the separate dns repo and arrives from its pipeline. The split is /etc/knot/knot.conf: written here once as a skeleton of include: lines covering only what belongs to a box (identity, NSID, storage paths, listen, logging, control socket); everything that is DNS policy -- templates, dnssec policy, remotes/ACLs, modules, the domain inventory and the zone files -- is delivered by the dns repo. knsctl replaces adddns.pl and adddnssec.pl, fixing four defects: - the duplicate check searched for the domain in BIND named.conf double-quote syntax (/"$domain"/) against unquoted YAML, so it could never match; only the -f zone-file test ever caught anything - neither script consulted the other class's manifest, so a domain already in public.conf could be appended to dnssec.conf and fail the reload AFTER both files had been written - nothing validated before reloading - the reload was non-blocking, so a rejected config reported success Its manifest matching is anchored on the YAML key and escapes the dot, so barsrvno.de and srvnoXde no longer false-positive against srvno.de. Aliases preserve the existing muscle memory with three corrections: -b on every triggering knotc command (without it knotc returns OK when the command was SENT, not when it succeeded); knzr (zone-reload) added alongside knrl (reload), since reloading one zone's data is the right verb for a record change and a full reload is only needed when a zone is added or removed; and serial/NSID helpers that query unicast addresses, because asking the anycast service address reaches whichever node is nearest and says nothing about which node is stale. Break-glass writes (add/remove/edit) warn and audit-log: they are overwritten by the next pipeline deploy unless the change also lands in git. Removal refuses to purge DNSSEC keys -- zone-purge +keys is irreversible on Knot 3.5.x, the key trash bin having arrived in 3.6.0 -- and prints the ordering requirement, since removing a signed zone before the parent DS is withdrawn is an outage for validating resolvers rather than a graceful shutdown. deploy.sh, build.sh and cloud-init.yml are deliberately not included yet; they are blocked on the Knot version decision, which sets the apk pin and feature availability. See the Status section in the README. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
27 lines
747 B
Cheetah
27 lines
747 B
Cheetah
;
|
|
; BIND zone file for domain: @DOMAIN@
|
|
;
|
|
|
|
$ORIGIN @DOMAIN@.
|
|
|
|
$TTL 3600
|
|
|
|
@DOMAIN@. IN SOA dns-1.datacenter.gg. dns.alphacentri.com. (
|
|
@SERIAL@ ; Serial -- COLD-START SEED ONLY. Knot owns the live serial
|
|
; (zonefile-load: difference-no-serial). Never edit this
|
|
; value: CI fails on any change. It is only read when a
|
|
; node starts with no journal entry for this zone.
|
|
3600 ; Refresh -- fallback if a NOTIFY is missed
|
|
900 ; Retry
|
|
1209600 ; Expire -- 14d. MUST stay below rrsig-lifetime minus
|
|
; rrsig-refresh (23d), or a secondary serves records
|
|
; whose signatures have already expired.
|
|
300 ; Negative Cache TTL
|
|
)
|
|
|
|
@DOMAIN@. IN NS dns-1.datacenter.gg.
|
|
@DOMAIN@. IN NS dns-2.datacenter.gg.
|
|
|
|
;; Edit Below This Line.
|
|
|