Maddy es un servidor de correo escrito en Go que reúne en un único binario lo que normalmente reparten Postfix, Dovecot y OpenDKIM: recepción SMTP, envío autenticado (submission), IMAP, firma DKIM y comprobaciones SPF/DMARC. En este tutorial instalarás Maddy en Ubuntu 24.04, lo configurarás con un certificado de Let's Encrypt, publicarás los registros DNS necesarios y crearás un buzón con el que enviar y recibir correo.

Requisitos previos

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • Un dominio propio (en esta guía, tudominio.com) con acceso a su zona DNS.
  • Un registro A para mail.tudominio.com que apunte a la IP pública del servidor (ip_del_servidor).
  • Un registro PTR (DNS inverso) de la IP que resuelva a mail.tudominio.com. Se configura desde el panel del proveedor de la IP o solicitándolo a su soporte.
  • El puerto 25 saliente permitido. Muchos proveedores lo bloquean por defecto para evitar spam; si es tu caso, pide su apertura antes de empezar.

Sustituye tudominio.com, mail.tudominio.com e ip_del_servidor por tus valores en todos los comandos.

Paso 1: Descargar e instalar el binario

Maddy publica binarios estáticos comprimidos con zstd. Instala zstd para poder descomprimirlos:

sudo apt update
sudo apt install zstd

Consulta la última versión estable en la página de releases de Maddy y guárdala en una variable (sin la v inicial):

MADDY_VERSION=0.8.1

Descarga y extrae el archivo para x86_64:

cd /tmp
wget "https://github.com/foxcpp/maddy/releases/download/v${MADDY_VERSION}/maddy-${MADDY_VERSION}-x86_64-linux-musl.tar.zst"
tar --zstd -xf "maddy-${MADDY_VERSION}-x86_64-linux-musl.tar.zst"
ls "maddy-${MADDY_VERSION}-x86_64-linux-musl"

El archivo incluye el binario, una configuración de ejemplo y las unidades de systemd:

maddy  maddy.conf  man  systemd

Instala el binario en /usr/local/bin y comprueba que se ejecuta:

cd "maddy-${MADDY_VERSION}-x86_64-linux-musl"
sudo install -m 0755 maddy /usr/local/bin/maddy
maddy version

La salida muestra la versión instalada, por ejemplo 0.8.1 linux/amd64.

Paso 2: Crear el usuario, la configuración y el servicio

Maddy debe ejecutarse con un usuario sin privilegios. Crea el usuario maddy con su directorio de estado en /var/lib/maddy, donde guardará los buzones, la cola y las claves DKIM:

sudo useradd -mrU -s /sbin/nologin -d /var/lib/maddy -c "maddy mail server" maddy

Copia la configuración de ejemplo y las unidades de systemd que vienen en el archivo (sigues dentro del directorio extraído):

sudo install -d -m 0755 /etc/maddy
sudo install -m 0644 maddy.conf /etc/maddy/maddy.conf
sudo cp systemd/maddy.service systemd/[email protected] /etc/systemd/system/
sudo systemctl daemon-reload

Comprueba que la unidad apunta a la ruta donde instalaste el binario:

grep ExecStart /etc/systemd/system/maddy.service

La salida debe contener /usr/local/bin/maddy. La unidad ya incluye AmbientCapabilities=CAP_NET_BIND_SERVICE, que permite al usuario maddy escuchar en los puertos 25, 465, 587 y 993 sin ser root. No arranques el servicio todavía: falta el certificado.

Paso 3: Obtener un certificado TLS con Certbot

Maddy necesita un certificado válido para mail.tudominio.com, tanto para IMAP y submission como para el STARTTLS del puerto 25. Abre en UFW los puertos del correo y el 80, que Certbot usa para validar el dominio:

sudo ufw allow OpenSSH
sudo ufw allow 25,80,465,587,993/tcp
sudo ufw enable
sudo ufw status

Instala Certbot y solicita el certificado en modo standalone (el puerto 80 debe estar libre):

sudo apt install certbot acl
sudo certbot certonly --standalone -d mail.tudominio.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/mail.tudominio.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/mail.tudominio.com/privkey.pem

Los certificados solo los puede leer root. En lugar de copiarlos, concede lectura al usuario maddy con una ACL:

sudo setfacl -R -m u:maddy:rX /etc/letsencrypt/live /etc/letsencrypt/archive

Para que la ACL se vuelva a aplicar y Maddy cargue el certificado nuevo en cada renovación, crea un hook de despliegue:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/maddy.sh
#!/usr/bin/env bash
set -euo pipefail
setfacl -R -m u:maddy:rX /etc/letsencrypt/live /etc/letsencrypt/archive
systemctl restart maddy

Hazlo ejecutable:

sudo chmod 0755 /etc/letsencrypt/renewal-hooks/deploy/maddy.sh

Paso 4: Configurar el dominio en maddy.conf

La configuración de ejemplo ya define un servidor completo: SMTP entrante en el puerto 25, submission en 465 y 587, IMAP en 993 y 143, almacenamiento en SQLite, cola de salida con reintentos y firma DKIM. Solo tienes que ajustar el dominio y la ruta del certificado. Abre el archivo:

sudo nano /etc/maddy/maddy.conf

Edita las primeras líneas para que queden así:

$(hostname) = mail.tudominio.com
$(primary_domain) = tudominio.com
$(local_domains) = $(primary_domain)

tls file /etc/letsencrypt/live/$(hostname)/fullchain.pem /etc/letsencrypt/live/$(hostname)/privkey.pem
  • $(hostname) es el nombre con el que el servidor se presenta y debe coincidir con el registro PTR.
  • $(primary_domain) es el dominio de las direcciones de correo.
  • $(local_domains) admite varios dominios separados por espacios si quieres alojar más de uno.

El resto del archivo puede quedarse como está para empezar.

Arranca Maddy y habilítalo al inicio:

sudo systemctl enable --now maddy
sudo systemctl status maddy --no-pager
● maddy.service - maddy mail server
     Loaded: loaded (/etc/systemd/system/maddy.service; enabled; preset: enabled)
     Active: active (running) since ...

Comprueba que está escuchando en todos los puertos del correo:

sudo ss -tlnp | grep maddy

Deberías ver :25, :143, :465, :587 y :993. Si el servicio no arranca, revisa el motivo con sudo journalctl -u maddy -n 50 --no-pager.

Paso 5: Publicar los registros DNS

En el primer arranque Maddy genera automáticamente la clave DKIM del dominio con el selector default. El valor del registro TXT está listo para copiar:

sudo cat /var/lib/maddy/dkim_keys/tudominio.com_default.dns
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...

Crea estos registros en la zona DNS de tudominio.com:

TipoNombreValor
Amailip_del_servidor
MX@10 mail.tudominio.com.
TXT@v=spf1 mx ~all
TXT_dmarcv=DMARC1; p=quarantine; ruf=mailto:[email protected]
TXTdefault._domainkeyel contenido del archivo .dns anterior

Espera a que se propaguen y compruébalos:

dig +short MX tudominio.com
dig +short TXT tudominio.com
dig +short TXT default._domainkey.tudominio.com
dig +short -x ip_del_servidor

La última consulta debe devolver mail.tudominio.com.. Sin un PTR coherente, Gmail y Outlook rechazarán o enviarán a spam gran parte de tu correo.

Paso 6: Crear el primer buzón

Maddy separa las credenciales (para autenticarse) de la cuenta IMAP (donde se guardan los mensajes), así que cada usuario necesita ambas. Crea [email protected]; el primer comando te pedirá la contraseña:

sudo -u maddy maddy creds create [email protected]
sudo -u maddy maddy imap-acct create [email protected]

Comprueba que existen:

sudo -u maddy maddy creds list
sudo -u maddy maddy imap-acct list

Para cambiar una contraseña más adelante usa sudo -u maddy maddy creds password [email protected].

Paso 7: Probar el envío y la recepción

Instala swaks, una herramienta para probar servidores SMTP, y envía un correo autenticado por el puerto 587 a una cuenta externa tuya (te pedirá la contraseña del buzón):

sudo apt install swaks
swaks --to [email protected] --from [email protected] \
  --server mail.tudominio.com --port 587 --tls \
  --auth LOGIN --auth-user [email protected]

La respuesta final del servidor debe empezar por 250, lo que indica que el mensaje se ha aceptado y está en cola. Abre el correo en el destino y muestra el original: las cabeceras deben indicar spf=pass, dkim=pass y dmarc=pass.

Responde a ese correo desde la cuenta externa y sigue el log para ver cómo llega:

sudo journalctl -u maddy -f

Por último, configura el buzón en un cliente como Thunderbird:

ParámetroValor
IMAPmail.tudominio.com, puerto 993, SSL/TLS
SMTPmail.tudominio.com, puerto 465 (SSL/TLS) o 587 (STARTTLS)
Usuario[email protected]

Solución de problemas

El servicio falla con status=226/NAMESPACE. Alguna ruta de ReadWritePaths o ReadOnlyPaths de la unidad no existe. Revisa las directivas con systemctl cat maddy y crea el directorio que falte.

permission denied al leer el certificado. La ACL no se aplicó o se perdió tras una renovación. Vuelve a ejecutar sudo setfacl -R -m u:maddy:rX /etc/letsencrypt/live /etc/letsencrypt/archive y reinicia Maddy.

El correo saliente se queda en cola. Comprueba si el puerto 25 saliente está abierto:

nc -vz -w 5 gmail-smtp-in.l.google.com 25

Si la conexión caduca, el bloqueo está en el proveedor y debes solicitar su apertura.

Los mensajes llegan a spam. Verifica que PTR, SPF, DKIM y DMARC coinciden con mail.tudominio.com y revisa la reputación de la IP en listas negras públicas.

Conclusión

Tienes un servidor de correo completo con Maddy: recibe correo para tu dominio, lo guarda en buzones IMAP y envía mensajes firmados con DKIM a través de una conexión cifrada. Como siguientes pasos, puedes añadir más dominios en $(local_domains), publicar una política MTA-STS para forzar TLS en la entrega y programar copias de seguridad de /var/lib/maddy, que contiene todos los buzones y la clave DKIM.