Une zone publique ne portait que des A d'exposition ; basculer chezlepro.ca aurait coupe son MX, son SPF et son DMARC. Les enregistrements se declarent au plan, valides et rendus ; le serveur de noms porte le nom que le site declare (dns1.chezlepro.ca), parce que ns1.chezlepro.ca existe deja en production. make dns-bascule-devis compare le plan au DNS en service : 0 perdu sur les deux zones, deux prealables restants. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
43 lines
2.4 KiB
Django/Jinja
43 lines
2.4 KiB
Django/Jinja
{# LE SERVEUR DE NOMS EST CELUI DU SITE, SOUS LE NOM QUE LE SITE DECLARE (2026-09-16).
|
|
|
|
La premiere version ecrivait `ns1.<zone>` dans chaque zone. Or `ns1.chezlepro.ca`
|
|
existe en production, vers une autre adresse : basculer l'aurait deplace en silence.
|
|
Toutes les zones du site designent desormais un seul nom, `dns_public_nom`, et seule la
|
|
zone qui le contient porte son A. #}
|
|
{% set _ns = serveur_powerdns_dns_public_nom | trim | regex_replace('\\.$', '') %}
|
|
$ORIGIN {{ zone_publique }}.
|
|
$TTL {{ serveur_powerdns_ttl }}
|
|
@ IN SOA {{ _ns }}. hostmaster.{{ zone_publique }}. (
|
|
{{ serveur_powerdns_serial_public }}
|
|
{{ serveur_powerdns_soa_refresh }}
|
|
{{ serveur_powerdns_soa_retry }}
|
|
{{ serveur_powerdns_soa_expire }}
|
|
{{ serveur_powerdns_soa_minimum }}
|
|
)
|
|
|
|
@ IN NS {{ _ns }}.
|
|
{% if _ns.endswith('.' ~ zone_publique) %}
|
|
{{ _ns[:-(zone_publique | length + 1)] }} IN A {{ serveur_powerdns_ip_publique }}
|
|
{% endif %}
|
|
|
|
{# UNE ZONE PUBLIQUE NE PORTE QUE DES ADRESSES PUBLIQUES.
|
|
|
|
Un nom expose sous ce domaine resout vers l'adresse publique du site — la frontiere le
|
|
relaie ensuite a l'edge. Jamais vers l'adresse interne de l'edge : elle ne resoudrait
|
|
pour personne dehors, et renseignerait sur le reseau dedans. #}
|
|
{% for expo in serveur_powerdns_expositions | default([]) if expo.domaine == zone_publique %}
|
|
{{ expo.fqdn[:-(zone_publique | length + 1)] if expo.fqdn != zone_publique else '@' }} IN A {{ serveur_powerdns_ip_publique }}
|
|
{% endfor %}
|
|
|
|
{# LES ENREGISTREMENTS DECLARES AU PLAN : courriel, verifications, noms historiques.
|
|
|
|
`valider_domaines` les a deja passes au crible (adresses publiques, cibles completes,
|
|
CNAME seul a son nom, texte sans guillemet). Le gabarit ne fait que les ecrire. Un TXT
|
|
plus long que 255 octets — une cle DKIM — est coupe en tranches : un resolveur les
|
|
recolle, et une seule chaine trop longue rendrait la zone illisible. #}
|
|
{% for enr in (domaines_publics | default({}))[zone_publique].enregistrements | default([]) %}
|
|
{% set _t = enr.type | upper %}
|
|
{% set _v = enr.valeur | string | trim %}
|
|
{{ enr.nom }} {{ enr.ttl | default('') }} IN {{ _t }} {% if _t in ['A', 'AAAA'] %}{{ _v }}{% elif _t == 'CNAME' %}{{ _v.rstrip('.') }}.{% elif _t == 'MX' %}{{ enr.priorite }} {{ _v.rstrip('.') }}.{% elif _t == 'CAA' %}0 {{ enr.etiquette }} "{{ _v }}"{% elif _t == 'TXT' %}{% for i in range(0, _v | length, 255) %}"{{ _v[i:i + 255] }}"{{ ' ' if not loop.last }}{% endfor %}{% endif %}
|
|
|
|
{% endfor %}
|