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>
23 lines
662 B
Plaintext
23 lines
662 B
Plaintext
# Force LF for everything textual so scripts edited on Windows still run on
|
|
# Alpine/Debian/Alma. A CRLF in a shebang line breaks the interpreter.
|
|
* text=auto eol=lf
|
|
|
|
*.sh text eol=lf
|
|
*.yml text eol=lf
|
|
*.yaml text eol=lf
|
|
*.conf text eol=lf
|
|
*.env text eol=lf
|
|
*.example text eol=lf
|
|
Caddyfile text eol=lf
|
|
*.md text eol=lf
|
|
|
|
# Treat the embedded-archive deploy scripts as text too (they're base64+shell).
|
|
deployments/*/deploy.sh text eol=lf
|
|
|
|
# Extension-less / unusual-extension scripts and configs that must stay LF.
|
|
deployments/ergo/ergoctl text eol=lf
|
|
deployments/knot-dns/knsctl text eol=lf
|
|
*.tmpl text eol=lf
|
|
*.caddy text eol=lf
|
|
*.motd text eol=lf
|