03-comment-je-travaille/guides/nouveau-domaine.md

Déployer un nouveau domaine (DNS + TLS + mail)

Objectif : amener un nouveau nom de domaine (NDD) de zéro jusqu'à une page d'attente servie en HTTPS sur /var/www/<ndd>/index.html, avec une chaîne e-mail délivrable (SPF + DKIM + DMARC, signature OpenDKIM, envoi via le relais OVH). Le contenu réel du site est un chantier ultérieur : ici on vise le socle « total secure & fonctionnel ».

Pressé ? L'aide-mémoire condensé (commandes + DNS + checklist) est dans nouveau-domaine-fiche.md. Ce runbook donne le « pourquoi » et le dépannage.

Convention : dans tout ce guide, remplacez <ndd> par le domaine (ex. adoption-ia.fr), <IP4_VPS> / <IP6_VPS> par les adresses du VPS, et <compte-ovh> par l'identifiant de la vraie boîte OVH utilisée pour le relais SMTP.

Périmètre technique

  • VPS OVH, Ubuntu (voir deployment.md).
  • Apache 2.4 + PHP-FPM, Certbot / Let's Encrypt (voir ssl-tls.md).
  • Postfix + OpenDKIM (signature multi-domaines), relais SMTP OVH (ssl0.ovh.net).
  • SĂ©lecteur DKIM par dĂ©faut : mail2026 (note : telaria.fr conserve historiquement telaria2026 — le table OpenDKIM gère un sĂ©lecteur par domaine, cf. § 4).

Cette chaîne remplace la signature applicative Symfony (dkim_signer) décrite dans inputs/legacy/email.md, désormais obsolète sur ce point : la signature DKIM se fait maintenant au niveau Postfix (milter OpenDKIM), donc commune à tous les domaines et indépendante de l'application.

Vue d'ensemble (ordre des opérations)

  1. DNS (OVH) — A/AAAA, SPF, DMARC, PTR (le DKIM sera ajouté après génération de la clé).
  2. Web + TLS — vhost Apache, certificat, docroot + page d'attente.
  3. Mail — clé OpenDKIM du domaine, publication DKIM DNS, vérification.
  4. Vérifications & délivrabilité — mail-tester, contrôles dig / curl.

Le DKIM enjambe les étapes 1 et 3 : on publie l'enregistrement TXT seulement une fois la clé générée (§ 4), puis on revient cocher la ligne DKIM du tableau DNS.


1) DNS (OVH)

Dans la zone DNS OVH du domaine, créer :

Type Sous-domaine Valeur
A @ <IP4_VPS>
AAAA @ <IP6_VPS> (si IPv6 disponible)
A * <IP4_VPS> (wildcard, capte les sous-domaines)
AAAA * <IP6_VPS> (wildcard)
TXT @ v=spf1 ip4:<IP4_VPS> ip6:<IP6_VPS> include:mx.ovh.com ~all
TXT _dmarc v=DMARC1; p=none; rua=mailto:postmaster@<ndd>
TXT mail2026._domainkey v=DKIM1; k=rsa; p=… — à publier après le § 4

Points non-évidents :

  • SPF (Sender Policy Framework) : un seul enregistrement par domaine. On autorise l'IP du VPS et mx.ovh.com (le relais OVH). ~all (softfail) le temps de valider, puis on peut durcir.
  • DMARC (Domain-based Message Authentication, Reporting and Conformance) : dĂ©marrer en p=none (surveillance), passer Ă  quarantine puis reject une fois SPF + DKIM (DomainKeys Identified Mail) verts (cf. ssl-tls.md pour la logique d'alignement).
  • PTR (reverse DNS) : facteur clĂ© de dĂ©livrabilitĂ©. Ă€ rĂ©gler dans l'interface OVH de l'IP (<IP4_VPS> → <ndd>), pas dans la zone DNS. VĂ©rifier : dig -x <IP4_VPS> +short.
  • Le wildcard ne couvre pas le domaine racine : le record @ reste obligatoire.

Vérifications :

dig A <ndd> +short
dig TXT <ndd> +short          # SPF
dig TXT _dmarc.<ndd> +short
dig -x <IP4_VPS> +short       # doit renvoyer <ndd>.

Pour la stratégie wildcard / sous-domaines et le nettoyage des doublons OVH, voir dsn-ovh.md.


2) Web + TLS (page d'attente)

Docroot + page d'attente

sudo mkdir -p /var/www/<ndd>
sudo chown -R ubuntu:www-data /var/www/<ndd>
sudo find /var/www/<ndd> -type d -exec chmod 2770 {} \;

Créer une page d'attente accessible (RGAA : lang, titre, contraste, pas de contenu clignotant) dans /var/www/<ndd>/index.html :

<!DOCTYPE html>
<html lang="fr">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Site en préparation — <ndd></title>
  <style>
    body { font-family: system-ui, sans-serif; max-width: 40rem; margin: 4rem auto;
           padding: 0 1rem; color: #1a1a1a; background: #fafafa; line-height: 1.5; }
    h1 { font-size: 1.6rem; }
  </style>
</head>
<body>
  <main>
    <h1>Site en préparation</h1>
    <p>Le site <strong><ndd></strong> sera bientĂ´t disponible.</p>
  </main>
</body>
</html>

Vhost Apache

Un fichier par vhost dans /etc/apache2/sites-available/<ndd>.conf :

# /etc/apache2/sites-available/<ndd>.conf
<VirtualHost *:80>
  ServerName <ndd>
  ServerAlias www.<ndd>
  RewriteEngine On
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName <ndd>
  ServerAlias www.<ndd>
  Protocols h2 http/1.1
  DocumentRoot /var/www/<ndd>
  DirectoryIndex index.html

  <Directory /var/www/<ndd>>
    AllowOverride None
    Require all granted
  </Directory>

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/<ndd>/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/<ndd>/privkey.pem

  # En-têtes de sécurité — voir security-headers.md
  Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
  Header always set X-Content-Type-Options "nosniff"
  Header always set Referrer-Policy "strict-origin-when-cross-origin"

  ErrorLog ${APACHE_LOG_DIR}/<ndd>-error.log
  CustomLog ${APACHE_LOG_DIR}/<ndd>-access.log combined
</VirtualHost>

Certificat TLS

Le bloc *:443 ci-dessus référence des certificats qui n'existent pas encore. Deux options :

  • HTTP-01 (simple, par domaine) — activer d'abord le vhost en HTTP seul (ou laisser Certbot Ă©crire la conf), puis :

    sudo certbot --apache -d <ndd> -d www.<ndd>
    
  • DNS-01 wildcard OVH (si le domaine doit couvrir *.<ndd>) — voir la procĂ©dure certbot --dns-ovh dĂ©taillĂ©e dans dsn-ovh.md.

Activer et recharger :

sudo a2ensite <ndd>.conf
sudo apachectl configtest
sudo systemctl reload apache2

Contrôles (détail et dépannage SNI/certificats dans ssl-tls.md) :

curl -I http://<ndd>          # 301 vers https
curl -I --http2 https://<ndd> # 200, page d'attente

3) Mail — clé OpenDKIM du domaine

Pré-requis : Postfix + OpenDKIM déjà installés et chaînés sur le VPS (§ 4 ci-dessous décrit la configuration globale, faite une seule fois). Pour ajouter un domaine, seules les étapes 3.1 → 3.3 sont à répéter.

3.1 Générer la paire de clés

sudo mkdir -p /etc/opendkim/keys/<ndd>
cd /etc/opendkim/keys/<ndd>
sudo opendkim-genkey -b 2048 -d <ndd> -s mail2026 -v
sudo chown opendkim:opendkim mail2026.private
sudo chmod 600 mail2026.private

Cela produit mail2026.private (clé privée, ne sort jamais du serveur) et mail2026.txt (enregistrement DNS public).

3.2 Déclarer le domaine dans les tables OpenDKIM

Ajouter une ligne pour le nouveau domaine dans chaque table (cf. § 4 pour leur création) :

# /etc/opendkim/key.table
mail2026._domainkey.<ndd>   <ndd>:mail2026:/etc/opendkim/keys/<ndd>/mail2026.private
# /etc/opendkim/signing.table   (format refile : motif -> entrée de key.table)
*@<ndd>   mail2026._domainkey.<ndd>

Recharger : sudo systemctl reload opendkim.

3.3 Publier la clé publique dans le DNS

Récupérer la valeur (une seule ligne, sans les guillemets de découpage bind) :

sudo cat /etc/opendkim/keys/<ndd>/mail2026.txt

Créer l'enregistrement DNS OVH :

Type : TXT
Sous-domaine : mail2026._domainkey
Valeur : v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A…

Vérifier la propagation :

dig TXT mail2026._domainkey.<ndd> +short
dig @1.1.1.1 TXT mail2026._domainkey.<ndd> +short

4) Configuration globale (une seule fois sur le VPS)

À ne faire qu'une fois ; pour un domaine supplémentaire, reprendre au § 3.

4.1 OpenDKIM

sudo apt install opendkim opendkim-tools

/etc/opendkim.conf (extrait des directives clés) :

Syslog                  yes
UMask                   007
Mode                    sv
Socket                  inet:8891@localhost
PidFile                 /run/opendkim/opendkim.pid
UserID                  opendkim

Canonicalization        relaxed/simple
SignatureAlgorithm      rsa-sha256
OversignHeaders         From

KeyTable                /etc/opendkim/key.table
SigningTable            refile:/etc/opendkim/signing.table
ExternalIgnoreList      /etc/opendkim/trusted.hosts
InternalHosts           /etc/opendkim/trusted.hosts

/etc/opendkim/trusted.hosts :

127.0.0.1
::1
localhost

Les tables key.table et signing.table sont alimentées par domaine (§ 3.2). Exemple multi-domaines (noter que telaria.fr garde son sélecteur historique telaria2026) :

# key.table
mail2026._domainkey.adoption-ia.fr   adoption-ia.fr:mail2026:/etc/opendkim/keys/adoption-ia.fr/mail2026.private
telaria2026._domainkey.telaria.fr    telaria.fr:telaria2026:/etc/opendkim/keys/telaria.fr/telaria2026.private
# signing.table
*@adoption-ia.fr   mail2026._domainkey.adoption-ia.fr
*@telaria.fr       telaria2026._domainkey.telaria.fr
sudo systemctl enable --now opendkim

4.2 Postfix — milter + relais OVH

Brancher OpenDKIM comme milter et router l'envoi via OVH (et non depuis l'IP du VPS, souvent mal réputée). Dans /etc/postfix/main.cf :

# Signature DKIM (milter OpenDKIM)
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

# Relais SMTP authentifié OVH
relayhost = [ssl0.ovh.net]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
smtp_sasl_tls_security_options = noanonymous

Identifiants du relais — il faut une vraie boîte OVH (≠ simple redirection), sinon l'authentification SMTP échoue :

echo "[ssl0.ovh.net]:587 <compte-ovh>:MOT_DE_PASSE_OVH" | sudo tee /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo systemctl restart postfix

Sécurité : sasl_passwd contient un secret en clair → permissions 600, jamais committé. Voir la consigne de caviardage des secrets dans inputs/legacy/ (commit b89aa4a).

Points non-évidents à retenir :

  • DKIM = LE facteur dĂ©livrabilitĂ© : sans lui, Microsoft (Outlook/Hotmail) classe en spam.
  • Envoyer via OVH, pas via l'IP du VPS : le relayhost est ce qui rend l'envoi fiable.
  • From = domaine du compte OVH authentifiĂ© : l'adresse d'expĂ©dition doit appartenir au domaine de la boĂ®te OVH utilisĂ©e pour le SASL, sinon rejet/alignement DMARC cassĂ©.

5) Vérifications & délivrabilité

# La signature DKIM est-elle appliquée ? (envoi de test)
echo "Test <ndd>" | mail -s "Test DKIM" -r no-reply@<ndd> votre-adresse@exemple.com
sudo journalctl -u postfix -n 30        # doit montrer relay=ssl0.ovh.net, status=sent
sudo journalctl -u opendkim -n 30       # signature du domaine

Score global sur mail-tester.com (objectif 10/10) : SPF Pass, DKIM Pass, DMARC Pass, reverse DNS Pass. Outils complémentaires : dkimvalidator.com, mxtoolbox.com.

Checklist de mise en ligne

  • DNS : A/AAAA @ + wildcard, SPF, DMARC publiĂ©s
  • PTR (reverse DNS) cohĂ©rent : dig -x <IP4_VPS> → <ndd>.
  • Vhost Apache actif, configtest OK, page d'attente servie en HTTPS
  • Certificat TLS valide (CN/SAN couvrent <ndd> et www.<ndd>)
  • Redirection HTTP → HTTPS (301)
  • ClĂ© OpenDKIM gĂ©nĂ©rĂ©e (mail2026.private, 600, opendkim:opendkim)
  • Domaine dĂ©clarĂ© dans key.table + signing.table, opendkim rechargĂ©
  • DKIM publiĂ© dans le DNS et propagĂ© (dig @1.1.1.1)
  • Envoi de test : relay=ssl0.ovh.net, status=sent
  • Score mail-tester ≥ 9/10 (SPF + DKIM + DMARC Pass)

6) Ajouter un domaine plus tard / rotation des clés

  • Domaine supplĂ©mentaire : refaire uniquement le § 1 (DNS), le § 2 (vhost + TLS) et le § 3 (clĂ© + tables + DKIM DNS). La configuration globale du § 4 reste inchangĂ©e.
  • Rotation annuelle : gĂ©nĂ©rer un nouveau sĂ©lecteur (mail2027), publier sa clĂ© DNS, basculer la ligne key.table/signing.table, puis retirer l'ancien après propagation. Les deux clĂ©s peuvent coexister le temps de la transition (pas de coupure).

Ressources

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #