Configurer la livraison directe des e-mails entrants pour les sites auto-hébergés avec Mail-Receiver

Cas d’utilisation CloudFlare

Ces instructions s’adressent aux forums Discourse auto-hébergés qui utilisent le Proxy Cloudflare.

Lorsque vous utilisez le Proxy Cloudflare, cela empêche tout trafic SMTP (Port 25) d’atteindre votre serveur. Cela vous oblige à configurer un sous-domaine différent pour que le récepteur de courrier fonctionne.

Par exemple, si votre domaine est forums.domain.tld, vous devrez créer un nouveau sous-domaine, tel que mail.domain.tld.

Avec Cloudflare, vous avez les étapes supplémentaires ci-dessous.

  1. Créez l’enregistrement A pour le nouveau sous-domaine. Il utilisera la même adresse IP que votre forums.domain.tld.
  2. Créez l’enregistrement MX pour le nouveau sous-domaine, comme indiqué dans les instructions principales.

Suivez les ensembles d’instructions principaux avec cette modification mineure. Cela fonctionnera très bien avec la sécurité TLS désactivée.

Si vous souhaitez activer la sécurité TLS, cela nécessitera un travail supplémentaire.

Aperçu de la configuration TLS

Ces instructions installeront Certbot et un plugin Certbot pour CloudFlare. Les commandes obtiendront des certificats Let’s Encrypt en mode autonome via le processus de certification DNS. Une fois les certificats disponibles, ils sont copiés dans la zone partagée du récepteur de courrier pour que le conteneur puisse les utiliser. Nous devons utiliser le modèle DNS, car Discourse utilise déjà le port 80.

Défi DNS

Au lieu de prouver la propriété du domaine via HTTP, certbot le prouve en créant un enregistrement TXT dans votre DNS. Puisque votre DNS est Cloudflare, cela peut être entièrement automatisé avec un jeton d’API Cloudflare — pas de port 80, pas d’arrêt du serveur web nécessaire.

Comment ça marche

Certbot → Crée l'enregistrement TXT _acme-challenge.mail.lotuselan.net dans Cloudflare
Let's Encrypt → Consulte cet enregistrement TXT → Valide → Émet le certificat
Certbot → Supprime l'enregistrement TXT

Tout cela se fait sur votre serveur de base, pas à l’intérieur du conteneur discourse.

Configuration

1 — Installez cerbot et le plugin certbot Cloudflare :

bash

apt install certbot python3-certbot-dns-cloudflare -y

2 — Créez un jeton d’API Cloudflare :

  1. Allez dans Cloudflare → Mon Profil → Jetons API → Créer un jeton
  2. Utilisez le modèle « Modifier le DNS de la zone »
  3. Autorisations : Zone → DNS → Modifier
  4. Ressources de zone : Inclure → Zone spécifique → lotuselan.net
  5. Restrictions IP : Configurez uniquement pour autoriser l’adresse IP de votre serveur
  6. Copiez le jeton

3 — Enregistrez le jeton dans un fichier d’informations d’identification :

bash

mkdir -p /etc/letsencrypt/cloudflare
nano /etc/letsencrypt/cloudflare/credentials.ini

Collez :

dns_cloudflare_api_token = VOTRE_JETON_API_CLOUDFLARE

Verrouillez le fichier :

bash

chmod 600 /etc/letsencrypt/cloudflare/credentials.ini

4 — Demandez le certificat :

Mettez à jour la commande suivante avec votre email d’administrateur et votre nom de domaine.

bash

certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  --non-interactive \
  --agree-tos \
  --email votre_adresse_email@domain.tld \
  -d mail.domain.tld

Dans vos résultats, il devrait y avoir une déclaration indiquant :

Certbot a configuré une tâche planifiée pour renouveler automatiquement ce certificat en arrière-plan.

Certbot configurera une cron pour vérifier l’expiration du certificat deux fois par jour. Il renouvellera les certificats lorsqu’ils auront moins de 30 jours avant d’expirer. Vous pouvez le vérifier en :

# Vérifier si le minuteur systemd est actif (la plupart des systèmes Ubuntu modernes)
systemctl status certbot.timer

# Ou vérifier si une tâche cron a été ajoutée
cat /etc/cron.d/certbot

Vous avez maintenant les certificats TLS sur votre serveur pour le nouveau nom de domaine du récepteur de courrier. Ils ne sont pas à un endroit où ils peuvent être utilisés.

5 — Configurez un script de déploiement pour déplacer les fichiers
Puisque certbot se renouvelle automatiquement, vous n’avez besoin que de votre script pour gérer les parties spécifiques à Discourse — copier les certificats renouvelés et reconstruire le récepteur de courrier. Vous pouvez simplifier considérablement le script en utilisant le hook de déploiement intégré de certbot, qui s’exécute automatiquement après un renouvellement réussi.

Créez un fichier de hook de déploiement :

bash

nano /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh

Collez ceci :

bash

#!/bin/bash
DOMAIN="mail.domain.tld"
DISCOURSE_DIR="/var/discourse"
CERT_SRC="/etc/letsencrypt/live/${DOMAIN}"
CERT_DEST_1="${DISCOURSE_DIR}/shared/mail-receiver/letsencrypt/${DOMAIN}"
CERT_DEST_2="${DISCOURSE_DIR}/shared/mail-receiver/letsencrypt/${DOMAIN}_ecc"
ADMIN_EMAIL="adresse email admin"
LOG_FILE="/var/log/mail-cert-renewal.log"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log "=== Hook de déploiement Certbot déclenché pour ${DOMAIN} ==="

# Copier les certificats (utiliser -L pour résoudre les liens symboliques)
for DEST in "$CERT_DEST_1" "$CERT_DEST_2"; do
    mkdir -p "$DEST"
    cp -L "${CERT_SRC}/fullchain.pem" "${DEST}/fullchain.pem"
    cp -L "${CERT_SRC}/privkey.pem"   "${DEST}/privkey.pem"
    cp -L "${CERT_SRC}/cert.pem"      "${DEST}/cert.pem"
    cp -L "${CERT_SRC}/chain.pem"     "${DEST}/chain.pem"
    chmod 644 "${DEST}/fullchain.pem" "${DEST}/cert.pem" "${DEST}/chain.pem"
    chmod 600 "${DEST}/privkey.pem"
    log "Certificats copiés vers ${DEST}"
done

# Reconstruire le récepteur de courrier
cd "$DISCOURSE_DIR" || { echo "Impossible de cd vers ${DISCOURSE_DIR}" | mail -s "[ÉCHEC] Échec du hook de déploiement de certificat de courrier" "$ADMIN_EMAIL"; exit 1; }
log "Reconstruction du récepteur de courrier..."
if ./launcher rebuild mail-receiver >> "$LOG_FILE" 2>&1; then
    log "mail-receiver reconstruit avec succès"
else
    log "ERREUR : la reconstruction a échoué"
    echo "La reconstruction de mail-receiver a échoué après le renouvellement du certificat. Consultez ${LOG_FILE}" | \
        mail -s "[ÉCHEC] Échec du hook de déploiement de certificat de courrier" "$ADMIN_EMAIL"
    exit 1
fi

log "=== Hook de déploiement terminé avec succès ==="

Aucune tâche cron manuelle n’est nécessaire — certbot orchestre l’ensemble du processus. Le hook de déploiement ne se déclenche que lorsqu’un renouvellement se produit réellement, de sorte que votre récepteur de courrier n’aura pas de reconstructions inutiles les jours où certbot vérifie mais ne renouvelle pas.

Pour tester le hook de renouvellement, exécutez ce qui suit :

bash

bash /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh

Si tout a été correctement configuré, cela va
→ copier les certificats dans les répertoires Discourse
→ reconstruire le récepteur de courrier
→ tout journaliser

6 — Configurez TLS dans mail-receiver.yml