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.frconserve historiquementtelaria2026— le table OpenDKIM gère un sélecteur par domaine, cf. § 4).
Cette chaîne remplace la signature applicative Symfony (
dkim_signer) décrite dansinputs/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)
- DNS (OVH) — A/AAAA, SPF, DMARC, PTR (le DKIM sera ajouté après génération de la clé).
- Web + TLS — vhost Apache, certificat, docroot + page d'attente.
- Mail — clé OpenDKIM du domaine, publication DKIM DNS, vérification.
- Vérifications & délivrabilité —
mail-tester, contrĂ´lesdig/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 Ăquarantinepuisrejectune fois SPF + DKIM (DomainKeys Identified Mail) verts (cf.ssl-tls.mdpour 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édurecertbot --dns-ovhdétaillée dansdsn-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_passwdcontient un secret en clair → permissions600, jamais committé. Voir la consigne de caviardage des secrets dansinputs/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
relayhostest 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,
configtestOK, page d'attente servie en HTTPS - Certificat TLS valide (CN/SAN couvrent
<ndd>etwww.<ndd>) - Redirection HTTP → HTTPS (301)
- Clé OpenDKIM générée (
mail2026.private,600,opendkim:opendkim) - Domaine déclaré dans
key.table+signing.table,opendkimrechargé - 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 lignekey.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
- OpenDKIM : http://www.opendkim.org/
- Postfix SASL / relais : https://www.postfix.org/SASL_README.html
- OVH — serveur SMTP sortant : https://help.ovhcloud.com/csm/fr-emails
- Mail Tester : https://www.mail-tester.com/
- DMARC / SPF : https://www.dmarcanalyzer.com/
- Guides internes :
dsn-ovh.md,ssl-tls.md,security-headers.md,deployment.md.