version: "3.7"

networks:
  mail:
    name: pica-mail
  proxy:
    external: true

volumes:
  mail-mda-maildir:
    name: mail-mda-maildir
  mail-mta-spool:
    name: mail-mta-spool

services:
  mail-mda:
    image: registry.picasoft.net/pica-mail-mda:v1.0.2
    build: ./pica-mail-mda
    container_name: pica-mail-mda
    ports:
      - "143:143"
    networks:
      - mail
    hostname: pica-mail-mda
    volumes:
      - mail-mda-maildir:/home
      - /DATA/docker/certs/mail.picasoft.net/:/certs-ssl/:ro
    environment:
      # Should be an URI, with ldap:// or ldaps://
      LDAP_ADDRESS: ldaps://ldap.picasoft.net:636
      LDAP_NSS_CN: cn=nss,dc=picasoft,dc=net
      LDAP_BASE: dc=picasoft,dc=net
      USER_FILTER: (uid=%n)
      PASSWORD_FILTER: (uid=%n)
    env_file: ./secrets/mail.secrets
    restart: unless-stopped

  mail-mta:
    image: registry.picasoft.net/pica-mail-mta:v1.0.3
    build: ./pica-mail-mta
    container_name: pica-mail-mta
    ports:
      - "25:25"
      - "587:587"
    networks:
      - mail
      - proxy
    volumes:
      - /var/log/mail.log:/var/log/mail.log
      - /var/log/opendmarc.log:/var/log/opendmarc.log
      # For sharing with exporter
      - mail-mta-spool:/var/spool/postfix
      # Doit contenir selecteur.domaine.rsa
      - /DATA/docker/mail/opendkim/:/etc/dkimkeys/
      - /DATA/docker/certs/mail.picasoft.net/:/certs-ssl/:ro
    env_file: ./secrets/mail.secrets
    environment:
      # As specified in volume section, this is where
      # keys generated by Traefik are mounted
      SSL_CERT: "/certs-ssl/fullchain.pem"
      SSL_KEY: "/certs-ssl/privkey.pem"
      # Hostname et port du serveur LMTP i.e. le MDA
      LMTP_LAN_HOSTNAME: pica-mail-mda
      LMTP_PORT: 24
      # Nom d'hôte sous lequel Postfix répondra aux requêtes SMTP
      MY_HOSTNAME: mail.picasoft.net
      # Domaine des mails
      MY_DOMAIN: picasoft.net
      # Domaines mails qu'on s'autorise à relayer (qui ont le droit de passer à travers notre serveur si ils sont en expéditeur ou destinataire)
      RELAY_DOMAINS: picasoft.net
      # Réglage de la connexion au serveur LDAP
      LDAP_PROTOCOL: ldaps
      LDAP_SERVER_HOSTNAME: ldap.picasoft.net
      LDAP_PORT: 636
      # Réglage du bind : login d'un compte qui a suffisamment de droits pour lire l'arborescence (à l'exception des mots de passe)
      LDAP_BIND_DN: cn=nss,dc=picasoft,dc=net
      # Réglage de la manière dont on répertorie les comptes et les adresses existantes
      # La config actuelle fait que la possession d'une adresse mail se fait ainsi : login => login@picasoft.net
      # Cependant, nous avons quand même deux couches différentes: l'existence d'un compte (SASL) et l'existence d'une adresse
      # On peut donc créer une adresse valide sans nécessairement lui associer un compte valide : on pourra recevoir des mails dans la boîte, mais on ne pourra pas se connecter en tant que cet utilisateur
      # Il suffit d'utiliser des attributs LDAP différents : le cn pour l'existence d'un compte LDAP, et l'uid pour l'existence d'une adresse
      # Niveau de l'arborescence à partir duquel les entrées sont trouvées:
      LDAP_SEARCH_BASE: dc=picasoft,dc=net
      # Filtre permettant de répertorier les comptes SASL
      LDAP_SASL_FILTER: "cn=%u"
      # Filtre permettant de répertorier les adresses mail
      LDAP_VIRTUAL_MAILBOX_FILTER: "uid=%s"
      # Ajout de listes noires pour éviter le SPAM. La décision politique et l'éthique associée sortent du cadre de la conception de cette image et doivent être discutées par l'asso; en tout cas, si on lève cette restriction, elle doit être remplacée par une autre (un spamassassin par exemple).
      SMTPD_CLIENT_RESTRICTIONS: reject_rbl_client sbl.spamhaus.org, reject_rbl_client dnsbl.sorbs.net
      # Préfixe DKIM, utilise pour identifier la clef
      DKIM_SELECTOR: janv2021
    labels:
      traefik.http.routers.pica-mail-mta.rule: Host(`mail.picasoft.net`)
      traefik.enable: true
      tls-certs-monitor.enable: true
      tls-certs-monitor.action: restart
    restart: unless-stopped

  postfix-exporter:
    image: registry.picasoft.net/postfix-exporter:5a8f146
    build: ./postfix-exporter
    container_name: postfix-exporter
    volumes:
      # By default, postfix-exporter reads from /var/log/mail.log, so no need to configure
      - /var/log/mail.log:/var/log/mail.log
      - /etc/localtime:/etc/localtime:ro
      - mail-mta-spool:/var/spool/postfix:ro
    command:
      # Listen on all interfaces
      - "--web.listen-address=0.0.0.0:9154"
      - "--web.telemetry-path=/metrics/postfix"
    networks:
      - proxy
    labels:
      traefik.http.routers.mail-metrics.entrypoints: websecure
      traefik.http.routers.mail-metrics.rule: "Host(`mail.picasoft.net`) && PathPrefix(`/metrics`)"
      traefik.http.routers.mail-metrics.service: mail-metrics
      traefik.http.routers.mail-metrics.middlewares: "mail-metrics-auth@docker"
      traefik.http.middlewares.mail-metrics-auth.basicauth.users: "${METRICS_AUTH}"
      traefik.http.services.mail-metrics.loadbalancer.server.port: 9154
      traefik.enable: true
    restart: unless-stopped