Héberger son serveur mail - 03 - docker-mailserver : Postfix + Dovecot en un container

Installer docker-mailserver : le container tout-en-un avec Postfix, Dovecot, SpamAssassin, Fail2Ban et DKIM. Configuration Docker Compose complète.

03 - docker-mailserver : Postfix + Dovecot en un container

Ce que tu vas apprendre

  • Ce que docker-mailserver embarque et pourquoi c'est pratique
  • La configuration Docker Compose complète
  • Comment créer des comptes et générer les clés DKIM

Prerequisites


Pourquoi docker-mailserver

Avant docker-mailserver, monter un serveur mail c'etait installer et configurer séparément Postfix (SMTP), Dovecot (IMAP), OpenDKIM, SpamAssassin, Fail2Ban, et prier pour que tout communique correctement. J'ai essaye une fois. Ca m'a pris trois jours et ca ne marchait qu'a moitie.

docker-mailserver met tout ca dans un seul container. Un docker compose up -d et tu as un serveur mail complet. Le projet est open source, bien maintenu, et la documentation est solide.

Ce que le container inclut :

  • Postfix : le serveur SMTP (envoi et reception des emails)
  • Dovecot : le serveur IMAP (lecture des emails depuis un client)
  • OpenDKIM : signature DKIM automatique des emails sortants
  • SpamAssassin : filtre anti-spam pour les emails entrants
  • Fail2Ban : bannissement des IP qui tentent du brute force

Le docker-compose.yml

Voici la config que j'utilise sur paltemps.fr, sans rien cacher :

yamlservices:
  mailserver:
    image: ghcr.io/docker-mailserver/docker-mailserver:latest
    container_name: mailserver
    hostname: mail.paltemps.fr
    ports:
      - "25:25"
      - "465:465"
      - "587:587"
      - "993:993"
    volumes:
      - mail_data:/var/mail
      - mail_state:/var/mail-state
      - mail_logs:/var/log/mail
      - mail_config:/tmp/docker-mailserver
      - caddy_data:/caddy-data:ro
    environment:
      - OVERRIDE_HOSTNAME=mail.paltemps.fr
      - SSL_TYPE=manual
      - SSL_CERT_PATH=/caddy-data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mail.paltemps.fr/mail.paltemps.fr.crt
      - SSL_KEY_PATH=/caddy-data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/mail.paltemps.fr/mail.paltemps.fr.key
      - ENABLE_OPENDKIM=1
      - ENABLE_SPAMASSASSIN=1
      - ENABLE_FAIL2BAN=1
      - PERMIT_DOCKER=connected-networks
    cap_add:
      - NET_ADMIN
    restart: unless-stopped

volumes:
  mail_data:
  mail_state:
  mail_logs:
  mail_config:
  caddy_data:
    external: true

Decomposons les points qui meritent une explication.

Les ports

Quatre ports ouverts, chacun avec un rôle precis :

  • 25 : SMTP entrant. Les autres serveurs mail utilisent ce port pour t'envoyer des emails. Tu ne peux pas t'en passer.
  • 465 : SMTPS (SMTP over SSL). Pour envoyer des emails depuis un client mail avec chiffrement natif.
  • 587 : SMTP Submission avec STARTTLS. L'autre option pour envoyer depuis un client mail, avec upgrade TLS.
  • 993 : IMAPS (IMAP over SSL). Pour lire tes emails depuis Thunderbird, Apple Mail, ou ton webmail.

Un point important : certains VPS OVH ont le port 25 bloque par défaut pour éviter le spam. Si c'est ton cas, tu dois ouvrir un ticket au support pour le debloquer. Explique que tu montes un serveur mail legitime, ca passe en général.

Les variables d'environnement

OVERRIDE_HOSTNAME : le hostname FQDN de ton serveur mail. C'est ce que Postfix annonce en EHLO. Ca doit correspondre a ton record PTR et a ton record A.

SSL_TYPE=manual : on fournit nous-memes les chemins vers le certificat et la clé. Dans notre cas, ce sont les certs générés par Caddy (on verra ca en détail dans l'article suivant sur SSL).

ENABLE_OPENDKIM=1 : active la signature DKIM automatique de tous les emails sortants. Chaque email est signe avec ta clé privee, et les destinataires peuvent vérifier avec la clé publique dans ton DNS.

ENABLE_SPAMASSASSIN=1 : filtre les emails entrants et marque ceux qui ressemblent a du spam. Tu peux ajuster les seuils dans la config.

ENABLE_FAIL2BAN=1 : surveille les tentatives de connexion echouees et bannit les IP suspectes. Indispensable si tu exposes les ports SMTP et IMAP sur Internet. Le cap_add: NET_ADMIN est requis pour que Fail2Ban puisse manipuler les regles iptables.

PERMIT_DOCKER=connected-networks : autorise les containers du meme réseau Docker a envoyer des emails sans authentification. Pratique pour ton application qui doit envoyer des emails via le mailserver.

Les volumes

Le volume caddy_data est monte en lecture seule (:ro). C'est le volume ou Caddy stocke ses certificats Let's Encrypt. On le partage avec le mailserver pour éviter de gerer les certificats en double. J'explique le mecanisme complet dans l'article sur SSL avec Caddy.

Les quatre autres volumes (mail_data, mail_state, mail_logs, mail_config) persistent les donnees du mailserver entre les redemarrages. Tes emails, la config, les clés DKIM, tout est la.

Creer un compte email

Une fois le container démarré :

bashdocker exec mailserver setup email add contact@paltemps.fr

Le container te demandera un mot de passe. Choisis-en un solide, c'est le mot de passe que tu utiliseras dans ton client mail pour te connecter en IMAP et SMTP.

Tu peux créer autant de comptes que tu veux :

bashdocker exec mailserver setup email add admin@paltemps.fr
docker exec mailserver setup email add nicolas@paltemps.fr

Pour lister les comptes existants :

bashdocker exec mailserver setup email list

Generer les clés DKIM

La génération de la clé DKIM se fait en une commande :

bashdocker exec mailserver setup config dkim

Ca généré une paire de clés RSA dans le volume de config. La commande t'affiche le record DNS TXT a ajouter dans ta zone. Copie-le et ajoute-le dans tes records DNS comme on l'a vu dans l'article sur le DNS.

Redemarrage du container apres avoir ajoute le record DNS :

bashdocker compose restart mailserver

Verifier que tout tourne

bashdocker exec mailserver setup email list
docker exec mailserver setup config dkim domain paltemps.fr
docker logs mailserver --tail 50

Dans les logs, tu devrais voir Postfix et Dovecot démarrer sans erreur. Si tu vois des erreurs SSL, c'est probablement que les chemins vers les certificats Caddy ne sont pas bons. On regle ca dans l'article suivant.

Prochain article : SSL avec Caddy : partager les certificats Let's Encrypt.


Navigation : Precedent : 02 - Le reverse DNS | Suivant : 04 - SSL avec Caddy


Sources

Retrouve d'autres articles techniques sur paltemps.fr.

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.