Servidor de correo con docker

En este post, explicaré como montar un servidor de correo completo y no morir en el intento. Un servidor de correo se compone de 2 partes principalmente. MTA (mail delivery agent) en este caso será postfix y MDA (mail delivery agent) en este caso dovecot. Además de esto, se va a utilizar RSPAMD. Un potente gestor de SPAM que incluye filtros de graylist, dkim… Y para los certificado se utilizará letsencrypt.

El proyecto que he utilizado es el de hardware/mailserver

En este ejemplo hay que sustituir dominio.tld por el dominio que se quiera utilizar.

Pasos previos

Para empezar, es necesario tener 3 cosas previamente instaladas que vamos a utilizar. Docker, docker-compose y traefik.

Despliegue de docker

Una vez instalado esto, solo queda crear el proyecto y el docker-compose

mkdir mail
vim mail/docker-compose.yml
version: '3'

services:
 server:
   image: hardware/mailserver:1.1-stable
   domainname: dominio.tld
   hostname: mail
   restart: always
   ports:
     - "25:25" 
     - "143:143" 
     - "465:465" 
     - "587:587" 
     - "993:993" 
     - "4190:4190" 
   environment:
     - DBPASS=(password_DB)
     - RSPAMD_PASSWORD=(password_RSPAMD)
     # se pueden añadir varios dominios separados por comas
     - ADD_DOMAINS=dominio.tld
     - DISABLE_DNS_RESOLVER=true
     - ENABLE_FETCHMAIL=true
     # Si se quiere tener algún relay
     - RELAY_NETWORKS=91.134.241.237/32
   volumes:
     - server:/var/mail
     - traefik_acme:/etc/letsencrypt/acme
   depends_on:
     - db
     - redis
   networks:
     - back
     - traefik
   links: 
     - db:mariadb
   depends_on:
     - certs
   labels:
     - "traefik.backend=mail-spam"
     - "traefik.frontend.rule=Host:spam.dominio.tld"
     - "traefik.domain=dominio.tld"
     - "traefik.docker.network=traefik"
     - "traefik.port=11334"

 postfixadmin:
   image: hardware/postfixadmin
   domainname: dominio.tld
   hostname: mail
   restart: always
   environment:
     - DBPASS=(password_DB)
   depends_on:
     - server
     - db
   networks:
     - back
     - traefik
   links:
     - db:mariadb
     - server:mailserver
   labels:
     - "traefik.backend=mail-postfix"
     - "traefik.frontend.rule=Host:postfix.dominio.tld"
     - "traefik.domain=dominio.tld"
     - "traefik.docker.network=traefik"
     - "traefik.port=8888"

 rainloop:
   image: hardware/rainloop
   restart: always
   volumes:
     - rainloop:/rainloop/data
   depends_on:
     - server
     - db
   networks:
     - back
     - traefik 
   links:
     - db:mariadb
     - server:mailserver
   labels:
     - "traefik.backend=mail-webmail"
     - "traefik.frontend.rule=Host:webmail.dominio.tld"
     - "traefik.domain=dominio.tld"
     - "traefik.docker.network=traefik"
     - "traefik.port=8888"

 certs:
   image: httpd:alpine
   labels:
     - "traefik.backend=mail-certs"
     - "traefik.frontend.rule=Host:mail.dominio.tld"
     - "traefik.docker.network=traefik"

 db:
   image: mariadb
   restart: always
   environment:
     - MYSQL_ROOT_PASSWORD=(contraseña_DB_root)
     - MYSQL_DATABASE=postfix
     - MYSQL_USER=postfix
     - MYSQL_PASSWORD=(contraseña_DB)
   volumes:
     - db:/var/lib/mysql
   networks:
     - back
   labels:
     - "traefik.enable=false"

 redis:
   image: redis:alpine
   restart: always
   command: redis-server --appendonly yes
   volumes:
     - redis:/data
   networks:
     - back
   labels:
     - "traefik.enable=false"

volumes:
  redis:
  db:
  rainloop:
  server:
  traefik_acme:
    external: true

networks:
  back:
  traefik:
    external:
      name: traefik

Una vez definido el docker-compose, hay que levantarlo del siguiente modo:

docker-compose up -d

Y aquí ya empezará a levantar todos los servicios. Dará error en la parte de certs pero es porque está traefik levantado y tiene el puerto 443 ocupado.

Configuración DNS

Ahora toca configurar los DNS de una manera correcta.

Registro A

El primero registro que hay que tener es el de mail.

mail.dominio.tld.   A   IP

Registro MX

Ahora el siguiente es el de MX

dominio.tld  MX   10   mail.dominio.tld.

Registro DKIM

A continuación vamos a crear el DKIM. Esto vale para validar que el servidor de correo es autentico. Para esto se utiliza una key pública que se creará en la carpeta: /var/mail/dkim/dominio.tld/public.key

mail._domainkey.  TXT  any  "v=DKIM1; k=rsa; p=YOUR DKIM Public Key"

Registro SPF

Siguiente registro que hay que crear es el SPF. Esto vale para verificar la autenticidad de los servidores SMTP

dominio.tld.   TXT  "v=spf1 a mx ip4:IPV4_Servidor ~all"

Registro DMARC

Ahora vamos con el DMARC. Esto junto con SPF y DKIM protege la parte from del envelope

_dmarc.dominio.tld.  TXT  "v=DMARC1; p=reject; rua=mailto:postmaster@dominio.tld; ruf=mailto:admin@dominio.tld; fo=0; adkim=s; aspf=s; pct=100; rf=afrf; sp=reject"

Pues con esto ya se tendría en producción un servidor de correo. Ahora para acceder a las URL

URLs

URL de posfixadmin

Desde aquí se configurarán todos los dominios de correo y cuentas de las que se quiera disponer

https://postfix.dominio.tld

URL RSPAMD

Aquí se podrán ver los correos que han entrado y en que situación están

https://spam.dominio.tld

URL Webmail

Para poder acceder al mail desde un navegador

https://webmail.dominio.tld

 

2 comments

  1. buenas tardes, disculpa amigo sabes que hago todo el proceso y al final el postfixadmin me da este problema DEBUG INFORMATION:
    Connect: Access denied for user ‘postfix’@’192.168.32.1’ (using password: YES)

    Please check the documentation and website for more information.

    creo que es un problema de comunicacion con la db, agregue la db a otra network donde tengo un adminer y tampoco puedo accder desde el adminer a la db, no se que pueda ser exactamente le ha sucedido?

    1. Buenas, revisa que las variables de la base de datos sean las correctas. Este error es por que postfix no se puede conectar a la base de datos.

      Un saludo

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *