• Serveurs
  • [Discussion] Installer un serveur de mail avec Postfix et Dovecot

Le soucis est bel et bien lié à l'accès au fichier...

En faisant un
cp -rL
des fichiers contenu dans /etc/letsencrypt vers /mnt/docker/nginx/certs dans le containeur ça marche mais ça m'embête parce que lors du renouvellement de certif je vais devoir recopier les fichiers à chaque coup...

j'ai tenté ça mais ça marche pas visiblement :
  volumes:
    - /mnt/docker/nginx/sites-enabled:/sites-enabled
    - /mnt/docker/nginx/conf:/conf.d
    - /mnt/docker/nginx/log:/var/log/nginx
    - /etc/letsencrypt/live/mondomaine.fr-0002:/certs
Tout est dans le readme, par défaut si le conteneur ne trouve pas de certificat, il en génère un autosigné. Si tu as ton propre certificat, la procédure est expliquée dans readme :
To use your Let's encrypt certificates, you may add another docker volume like this :

mailserver:
image: hardware/mailserver
volumes:
/etc/letsencrypt:/etc/letsencrypt
...

The common name of your ssl certifcate MUST be the same as your server's FQDN (for exemple, let's encrypt live subfolder name must be egual to domainname & hostname values of docker-compose file).

If you do not use let's encrypt, a default self-signed certificate (RSA 4096 bits SHA2) is generated here : /mnt/docker/mail/ssl/selfsigned/{cert.pem, privkey.pem}.

If you use another CA (other than Let's Encrypt) :

mkdir -p /mnt/docker/ssl/live/mail.domain.tld

Required files in this folder :

privkey.pem : Private key for the certificate
cert.pem : Server certificate only
chain.pem : Root and intermediate certificates only, excluding server certificate
fullchain.pem : All certificates, including server certificate. This is concatenation of cert.pem and chain.pem

And then mount the volume like this :

mailserver:
image: hardware/mailserver
volumes:
/mnt/docker/ssl:/etc/letsencrypt
...
J'ai fais une faute de frappe lors de la saisie de mes certificats letsencrypt du coup j'ai du recommencer l'opération.

De ce fait mon nom de dossier n'est pas identique au hostname + domaine.

J'ai donc tenté d'ajouté les certificats générés dans /mnt/docker/mail/ssl/selfsigned/ dans mes vhosts mais rien n'y fait il ne veut pas trouver le fichier...

J'suis vraiment mauvais faut croire...
Nan c'est pas comme ça. Si le FQDN n'est pas bon (faut de frappe), alors faut mettre les certificats LE dans /mnt/docker/ssl/live/mail.domain.tld, quand je dis les certificats c'est :

privkey.pem, cert.pem, chain.pem, fullchain.pem

Et ensuite, pour docker-compose :
mailserver:
  volumes:
     - /mnt/docker/ssl:/etc/letsencrypt
A la prochaine mise à jour de tes certificats, corrige le FQDN comme ça tu auras juste à monter le volume LE comme ceci :
mailserver:
  volumes:
    - /etc/letsencrypt:/etc/letsencrypt
EDIT: franchement le plus simple c'est de faire comme ça, te prend pas la tête :
nginx:
  volumes:
    - /etc/letsencrypt:/certs

mailserver:
  volumes:
    - /etc/letsencrypt:/etc/letsencrypt
ssl_certificate /certs/live/hostname.domain.tld/fullchain.pem;
ssl_certificate_key /certs/live/hostname.domain.tld/privkey.pem;
Gènère tes certificats avec certbot en commençant par le FQDN en premier :
docker run -it --rm \
-v /etc/letsencrypt:/etc/letsencrypt \
-p 80:80 -p 443:443 \
xataz/letsencrypt \
certonly --standalone \
--agree-tos \
-m me@domain.tld \
-d hostname.domain.tld \
-d xx.domain.tld \
-d yy.domain.tld \
-d zz.domain.tld
J'ai suivi ton conseil et j'ai aussi rajouté un lien symbolique vers le mauvais dossier depuis un nouveau dossier correctement nommé et ça passe nickel !

Il me reste simplement un soucis de connexion à la bdd postfix quand je tente de me connecter sur Rainloop côté "public", surement une erreur de conf du docker-compose.yml

Merci à tous les 2 pour votre aide inestimable.

EDIT l'erreur en question
 auth-worker(311): Error: mysql(mariadb): Connect failed to database (postfix): Access denied for user 'postfix'@'172.17.0.3' (using password: YES) - waiting for 5 seconds before retry
Corrigé c'était bien une erreur de conf dans le docker-compose yml ^^.
Bon tout roule ou presque ^^.

J'ai simplement des problèmes pour recevoir les mails... je peux en envoyer sans soucis mais pas en recevoir.

J'ai lancé un
docker logs mailserver
Mais j'avoue que je ne sais pas trop quoi chercher pour corriger l'éventuelle erreur.

Si quelqu'un a une idée je suis preneur

EDIT

Visiblement dès que tente de rajouter une conf spécifique postfix je peux plus me loguer sur Rainloop

Et j'ai que ça dans mon fichier...

inet_protocols = ipv4
Bon je me réponds à moi même en ce jour férié !

C'était (encore) un soucis de conf mais côté DNS ce coup-ci !

En relisant le readme du mailserver j'ai corrigé et tout fonctionne. C'est tout bonnement magique

Encore une fois merci à tous pour votre aide et surtout à Harware pour cette image Docker dont on aurait pu rêver.
20 jours plus tard
Bonjour,
j'ai suivi ce super tuto à la lettre et ça à fonctionné du 1er coup sur une machine virtuelle ProxMox d'un dédié Online.
Le seul truc, j'ai pas réussi à mettre DKIM chez Online, malgré de nombreuses tentatives mais 9/10, ça me va pour le moment.
A des fins de redondance, je cherche un tuto permettant de monter un serveur mail secondaire qui prenne le relais si le principal tombe.
Avez vous connaissance d'un tel tutoriel SVP?
@ryrcass Je cherche egalement un faire quelque chose de semblable, mais au lieu de mettre en place un serveur mail secondaire, qui ne fera que reprendre le relais (pour la reception des mails, pas d'envoi et pas de verification) si le primaire est HS et les lui transferer lorsqu'il deviendra disponible, je pensais plutot a installer un second serveur mail principal et les synchroniser entre eux avec dsync (dovecot).
Comme ca le second serveur mail "bosse" egalement et si le premier est HS, le second prend le relais totalement (reception, envois et verification des mails possible).
Par contre je n'ai pas encore eu de temps a allouer a cette tache et il me faudra surement plus de temps pour avoir quelque chose de correct que pour certains contributeurs de ce forum
@ Malakai, En fait par secondaire, je pensais au poids des MX,
Il faut effectivement que ces 2 (ou plus) serveurs mails soient identiques et synchros.
C'est au niveau des authentifications (reverse, SPF, ...) que je me pose beaucoup de questions ainsi qu'au niveau de la conf du client.
Comment le client sait que mail.domaine.ltd est tombé et qu'il faut consulter mail2.domaine.ltd?
@ryrcass @Malakai : C'est compliqué à faire un secondaire et ce n'est pas forcément recommandé sauf si on le fait bien (mais c'est complexe), si vous gérez une grosse infra mail je peux comprendre le besoin, maintenant si c'est pour un serveur perso, vous pouvez mettre les MX de votre registrar en secondaire et créer les boites mails depuis l'interface du registrar, comme ça vous avez une solution de secours en cas de panne.

Perso j'ai ça en MX :
# dig MX meshup.net +short

50 fb.mail.gandi.net.
40 spool.mail.gandi.net.
10 mail.meshup.net.

Sinon, le mieux c'est d'avoir 2 VM (avec un partage des points de montage et de la base de données), vous déployez l'image docker hardware/mailserver sur les deux, en cas de panne de la première, les flux mails (25, 587, 465...etc) sont automatiquement redirigés sur la VM de secours (avec du load balancing). ça peut paraitre complexe, mais avec Ikoula et leur solution cloudstack ça se met rapidement en place.
@Hardware
http://www.bortzmeyer.org/mx-secondaire.html wrote:Antoine cite d'autres cas où l'utilisation d'un MX secondaire est utile (à condition qu'on ait les moyens humains de le configurer correctement :
Si (c'est un gros Si) le MX secondaire permet de consulter le courrier mis en attente (ne serait-ce qu'en utilisant more sur les fichiers du spool), alors cela permet, en dépannage, de voir « le courrier du client que l'on attend maintenant tout de suite immédiatement », même quand le serveur de courrier principal est tombé.
C'est de ca que je parlais dans mon post precedent, et j'ai trouve 2 "debuts" de tuto qui en parlent egalement :
https://www.swordarmor.fr/replication-mastermaster-entre-deux-serveurs-mail-avec-dovecot-dsync.html
http://blog.schaal-24.de/uncategorized/mails-mit-dovecot-ueber-tcp-syncen/?lang=en

Il faut donc utiliser Dovecot (ou plutot dsync) pour la synchronisation des mails entre les 2 (ou plusieurs?) serveurs et configurer Postfix sur les 2 de maniere identique (comme si les 2 Postfix etaient independants). Les 2 (ou plusieurs?) serveurs seront donc primaires et independants, mais synchroniseront les mails entre eux. Ainsi meme si le serveur A est HS pendant 1 mois, le serveur B continue de fonctionner, et du point de vue de l'utilisateur, le service mail fonctionnent sans soucis (apres c'est a l'admin de s'assurer que les 2 serveurs sont fonctionnels tout le temps, car pas de coupure de service).

EDIT : Il y a ca aussi
http://wiki2.dovecot.org/Tools/Doveadm/Sync
http://wiki.dovecot.org/Replication
Je me suis jamais penché sur la synchronisation des mailboxes via doveadm-sync mais oui ça me parait être la solution. Je vois bien une architecture comme ça :
                    | - VM1 (hardware/mailserver:latest) --- |
                    |                   |                    |
Load-balancing  --- |                   | (doveadm ssh sync) | ----- VM3 (base de données postfix)
                    |                   |                    |
                    | - VM2 (hardware/mailserver:latest) --- |

Si jamais tu avances sur le sujet, ce serait intéressant d'avoir un retour d’expérience
C'est une architecture possible effectivement.
Je pensais plutot a une base de donnees postfix locale sur chaque serveur et trouver un moyen simple de les synchroniser entre elles, comme ca les serveurs sont vraiment independant (ne dependent pas d'un troisieme serveur pour la base de donnee), car si ce troisieme serveur est HS le service mail ne fonctionne plus. Apres je sais pas si c'est faisable simplement (out tout court meme).
Pour l'instant j'ai pas mal d'autres projets en cours, mais des que j'aurais du temps a allouer a cette tache je mettrais mon avancement sur le forum.

EDIT : bon, apparemment pour la synchronisation des bases de donnees il faut utiliser la replication master-slave (ou master-master selon les architectures) de MySQL ; j'ai trouve un tuto qui en parle et ca a pas l'air super complique a mettre en place.
http://www.responsive-mind.fr/replication-mysql-master-master/

La theorie ca a l'air d'aller, maintenant il faut plus que je termine ce que j'ai en cours comme installations et configurations (qui risque de durer assez longtemps, surtout que j'ai pas beaucoup de temps libre ces semaines) puis passer a la partie mail pour voir ce que ca donne en pratique.
14 jours plus tard

Salut à nouveau Hardware.
J'ai un petit souci au niveau de ma dkim key.

J'ai un fichier /mnt/docker/opendkim/mondomaine/mail.txt qui ressemble à ça :

mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAziVsCZpKclKb7JbBXf5No3U7w9c6vN0+d+ziUdGpYOUXM3zABpQrf0NtLo/RZRcciQbpiQsEhNI8/HZJbTOp3YVF9mMfyko7zEUvEe09A4MzfrzG5WNY5ytzTbrPTJ8tIIFQXZfppyULFE+defgm6IrifnQ4rCHoChX/JGeQF+tuC6xjAV7sWHU2NDXG09sxYO2IXXrIWV4Kg2"
          "YRaBEERfHF3znaNqScFQkHKIIdijmCNGLyXe2dDhKaLaYQEprV/gI8bpdknOrWC58GHQi5JLv3TBJoGAvikoyK+FdGEZIS6YPO+FpbnleH4DqRhMFDSVCnmyCgdSIaQpDFHylzJQIDAQAB" )  ; ----- DKIM key mail for mywebsite.com

Mon registrar est NameCheap.
J'ai bien ces enregistrements chez mon registrar :

TXT Record / @ / "v=spf1 a mx ~all" / Automatic
TXT Record / _domainkey / "o=-; r=postmaster@mondomaine.com" / Automatic
TXT Record / _dmarc / "v=DMARC1; p=reject; rua=mailto:postmaster@mondomaine.com; ruf=mailto:postmaster@mondomaine.com; fo=0; adkim=r; aspf=s; pct=100; rf=afrf; sp=reject" / Automatic

(je précise que je passerai adkdim=s quand ma dkimkey sera reconnue)
(je précise aussi que si j'ajoute l'ip du server comme dans ton tuto au lieu de "v=spf1 a mx ~all" je me mange de sales erreurs, chez NameCheap ça a l'air de se faire sans l'ip)

et un custom MX record :

MX Record / @ / mail.mondomaine.com. / 10 / Automatic

L'ennui, c'est que je ne peux pas saisir correctement ma clé dkim chez Namecheap. Le max que je peux faire, c'est :

TXT Record / mail._domainkey / "k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAziVsCZpKclKb7JbBXf5No3U7w9c6vN0+d+ziUdGpYOUXM3zABpQrf0NtLo/RZRcciQbpiQsEhNI8/HZJbTOp3YVF9mMfyko7zEUvEe09A4MzfrzG5WNY5ytzTbrPTJ8tIIFQXZfppyULFE+defgm6IrifnQ4rCHoChX/JGeQF+tuC6xjAV7sWHU2NDXG09sxYO2IXXrIWV"

La clé est tronquée par une limite de caractères...

J'ai pourtant lu ça sur google :
https://support.google.com/a/answer/173535

Mais j'avoue que je ne comprends pas comment je peux ajouter cette clé en plusieurs fois.
J'ai par exemple essayé :

"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAziVsCZpKclKb7JbBXf5No3U7w9c6vN0+d+ziUdGpYOUXM3zABpQrf0NtLo/RZRcciQbpiQsEhNI8/HZJbTOp3YVF9mMfyko7zEUvEe09A4MzfrzG5WNY5ytzTbrPTJ8tIIFQXZfppyULFE+defgm6IrifnQ4rCHoChX/" "JGeQF+tuC6xjAV7sWHU2NDXG09sxYO2IXXrIWV4Kg2" "YRaBEERfHF3znaNqScFQkHKIIdijmCNGLyXe2dDhKaLaYQEprV/gI8bpdknOrWC58GHQi5JLv3TBJoGAvikoyK+FdGEZIS6YPO+FpbnleH4DqRhMFDSVCnmyCgdSIaQpDFHylzJQIDAQAB"

Mais sans succès...

Du coup mail-tester ne reconnait pas ma clé dkim publique :
"Votre signature DKIM n'est pas valide"

Evidemment j'échoue au dmark mais je perds pas de point puisque pour l'instant il n'est pas en mode strict.

Que dois-je faire pour que ça marche enfin? Je m'arrache les cheveux '
J'aimerais que mes mails d'inscription etc passent les barrages de google et crosoft (outlook, hotmail..) et surtout ne pas me faire bannir à cause d'une mauvaise config.

Merci d'avance

Contacte les sinon.
Il te diront le spécification pour la DKIM
@Johnson : tu as essayé avec des \ entre les chaines ? "comme précisé ici :http://serverfault.com/questions/255580/how-do-i-enter-a-strong-long-dkim-key-into-dns


Très bon tuto sinon ! pour quelque chose de pas si facile à faire en temps normal
Je viens de le faire, j'ai juste quelques erreurs à rapporter :
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps    = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps      = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

smtpd_sender_login_maps  = mysql:/etc/postfix/mysql/mysql-sender-login-maps.cf
Un /mysql/ en trop fait planter postfix

Et pour sieve il m'a dit que la boite Junk n'existait pas, j'ai remplacé par Spam (p-e depuis une certaine version de Postfix ?)
@arckosfr oui si ça continue je vais les contacter.

@sheuze je viens de tenter de rentrer l'enregistrement sous la forme :
"v=DKIM1; k=rsa;" \ "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAziVsCZpKclKb7JbBXf5No3U7w9c6vN0+d+ziUdGpYOUXM3zABpQrf0NtLo/RZRcciQbpiQsEhNI8/HZJbTOp3YVF9mMfyko7zEUvEe09A4MzfrzG5WNY5ytzTbrPTJ8tIIFQXZfppyULFE+defgm6IrifnQ4rCHoChX/JGeQF+tuC6xjAV7sWHU2NDXG09sxYO2IXXrIWV4Kg2" \ "YRaBEERfHF3znaNqScFQkHKIIdijmCNGLyXe2dDhKaLaYQEprV/gI8bpdknOrWC58GHQi5JLv3TBJoGAvikoyK+FdGEZIS6YPO+FpbnleH4DqRhMFDSVCnmyCgdSIaQpDFHylzJQIDAQAB"
Mais encore :
( "v=DKIM1; k=rsa;" "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAziVsCZpKclKb7JbBXf5No3U7w9c6vN0+d+ziUdGpYOUXM3zABpQrf0NtLo/RZRcciQbpiQsEhNI8/HZJbTOp3YVF9mMfyko7zEUvEe09A4MzfrzG5WNY5ytzTbrPTJ8tIIFQXZfppyULFE+defgm6IrifnQ4rCHoChX/JGeQF+tuC6xjAV7sWHU2NDXG09sxYO2IXXrIWV4Kg2" "YRaBEERfHF3znaNqScFQkHKIIdijmCNGLyXe2dDhKaLaYQEprV/gI8bpdknOrWC58GHQi5JLv3TBJoGAvikoyK+FdGEZIS6YPO+FpbnleH4DqRhMFDSVCnmyCgdSIaQpDFHylzJQIDAQAB" )
Je ne peux pas valider le champ. Il se colore en rouge, avec un message d'erreur qui est rouge mais n'affiche rien.... -_-
Edit : non pardon. J'étais déco. Dans les deux cas je peux entrer l'enregistrement mais quand je regarde après, ma chaine est tronqué. Elle s'arrête à "NDXG"
NDXG est dans la première chaîne donc que celle ci est trop grande. p-e qu'il faut couper en 3 (avec les \ toujours entre les 3)