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.comque 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:
| Tipo | Nombre | Valor |
|---|---|---|
| A | mail | ip_del_servidor |
| MX | @ | 10 mail.tudominio.com. |
| TXT | @ | v=spf1 mx ~all |
| TXT | _dmarc | v=DMARC1; p=quarantine; ruf=mailto:[email protected] |
| TXT | default._domainkey | el 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ámetro | Valor |
|---|---|
| IMAP | mail.tudominio.com, puerto 993, SSL/TLS |
| SMTP | mail.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.
