← Volver al blog
Tutorial · 12 min

Cómo crear tu propio servidor de correo con Mailu en Ubuntu

Cómo crear tu propio servidor de correo con Mailu en Ubuntu

Introducción: ¿por qué tener tu propio servidor de correo?

En un mundo donde la privacidad digital es cada vez más valiosa, hospedar tu propio servidor de correo se ha convertido en una opción atractiva tanto para empresas como para usuarios avanzados. Servicios como Gmail o Outlook son cómodos, pero implican ceder el control de tus datos a terceros, aceptar sus políticas de uso y depender de su disponibilidad.

Un servidor de correo auto-hospedado te ofrece:

  • Privacidad total: Tus correos no se escanean para publicidad ni se comparten con terceros.
  • Control absoluto: Tú decides las políticas de retención, las cuotas de almacenamiento y las reglas de filtrado.
  • Dominio personalizado: Correos con tu propia marca (nombre@tudominio.com).
  • Independencia: Sin límites arbitrarios, sin cambios de precio unilaterales y sin riesgo de que cierren tu cuenta.

¿Por qué Mailu y no otra solución?

Antes de decidirnos por Mailu, evaluamos varias alternativas. Este fue el análisis:

  • Stalwart Mail: Escrito en Rust, muy moderno y eficiente. Sin embargo, durante la evaluación encontramos incompatibilidades en su API (especialmente en la versión 0.16) que dificultaban la integración con nuestro flujo de trabajo. Lo descartamos temporalmente, aunque es un proyecto prometedor a seguir de cerca.
  • iRedMail: Solución completa y probada, pero más pesada y compleja de mantener. Requiere configurar múltiples servicios de forma independiente.
  • Mail-in-a-Box: Buena opción para principiantes, pero menos flexible al no estar basada en Docker, lo que complica las actualizaciones y las copias de seguridad.

Elegimos Mailu porque ofrece el mejor equilibrio entre simplicidad, funcionalidad y mantenibilidad: todo se gestiona mediante Docker Compose, tiene un panel de administración web integrado, actualizaciones sencillas y una comunidad activa.

Requisitos previos

Antes de empezar, asegúrate de cumplir con estos requisitos:

Infraestructura

  • Máquina virtual con Ubuntu 24.04 (Hyper-V, VirtualBox, VMware, Proxmox, etc.).
  • Recursos mínimos: 2 GB de RAM (4 GB recomendado), 2 núcleos de CPU, 20 GB de almacenamiento (más si esperas volúmenes altos de correo).
  • IP fija asignada a la máquina virtual.

Red y dominio

  • Dominio propio (en nuestro ejemplo: tudominio.com) con capacidad de editar registros DNS.
  • Puertos abiertos en el router redirigidos a la VM: 25 (SMTP), 80 (HTTP), 443 (HTTPS), 465 (SMTPS), 587 (Submission), 993 (IMAPS), 995 (POP3S).
  • Importante: Algunos ISP bloquean el puerto 25. Consulta con tu proveedor antes de empezar.

Software

  • Docker Engine 24.x o superior.
  • Docker Compose v2 (plugin).

Instalación paso a paso

Paso 1: Preparar la máquina virtual

Utilizamos una máquina virtual con Ubuntu 24.04. Asigna los recursos mencionados y configura una IP fija. Una vez dentro de la VM, actualiza el sistema e instala Docker:

# Actualizar el sistema
apt update && apt upgrade -y

# Instalar Docker Engine
curl -fsSL https://get.docker.com | sh
systemctl enable docker && systemctl start docker

# Verificar la instalación
docker --version
docker compose version

Deberías ver Docker 29.x (o superior) y Docker Compose v2.x.

Paso 2: Descargar los archivos de Mailu

Crea el directorio de trabajo y descarga la plantilla oficial de Docker Compose junto con el archivo de variables de entorno:

mkdir -p /opt/mailu && cd /opt/mailu

# Descargar configuración base
curl -sO https://raw.githubusercontent.com/Mailu/Mailu/master/docker-compose.yml
curl -sO https://raw.githubusercontent.com/Mailu/Mailu/master/.env

Paso 3: Configurar las variables de entorno

Edita el archivo .env con los valores de tu dominio. Estas son las variables mínimas necesarias:

DOMAIN=tudominio.com
HOSTNAMES=mail.tudominio.com
POSTMASTER=admin
SECRET_KEY=clave_aleatoria_larga_de_32_caracteres
TLS_FLAVOR=letsencrypt

Genera una SECRET_KEY segura:

openssl rand -hex 32

Copia la salida y pégala como valor de SECRET_KEY en el .env. Esta clave protege las sesiones del panel de administración.

Paso 4: Personalizar docker-compose.yml

El archivo base funciona, pero es necesario realizar algunos ajustes para evitar problemas comunes. A continuación explicamos los cambios que aplicamos y por qué.

4a. Agregar DNS externo al servicio admin

El contenedor de administración necesita resolver nombres de dominio para funcionar correctamente. En nuestro caso, el servicio admin no arrancaba porque la validación DNSSEC del resolver interno fallaba. La solución fue agregar servidores DNS externos directamente al servicio:

admin:
  image: ghcr.io/mailu/admin:2024.06
  restart: always
  env_file: .env
  dns:
    - 8.8.8.8
    - 1.1.1.1
  volumes:
    - "/opt/mailu/data:/data"
    - "/opt/mailu/dkim:/dkim"
  depends_on:
    - redis
    - resolver

4b. Resolver en conflicto por puerto 53

Mailu incluye un servicio resolver (Unbound) que actúa como DNS con validación DNSSEC. Sin embargo, si tu host o contenedor ya tiene un servicio DNS escuchando en el puerto 53, obtendrás un error de "Address already in use".

Solución: Comenta o elimina el servicio resolver del docker-compose.yml. El servicio admin, gracias al DNS externo que configuramos en el paso anterior, seguirá funcionando sin problemas. El resolver no es imprescindible para el funcionamiento básico del servidor de correo.

Paso 5: Levantar los servicios

Con la configuración lista, es hora de arrancar todos los contenedores:

cd /opt/mailu
docker compose up -d

Verifica que todos los contenedores estén corriendo:

docker compose ps

Deberías ver los siguientes servicios en estado running:

ServicioFunción
frontProxy inverso (Nginx) — gestiona todo el tráfico HTTP/HTTPS
adminPanel de administración (Flask)
imapServidor IMAP/POP3 (Dovecot)
smtpServidor SMTP (Postfix)
antispamFiltrado antispam (Rspamd)
resolverDNS resolver con DNSSEC (Unbound) — opcional
webmailInterfaz webmail (Roundcube)
redisAlmacenamiento en caché y sesiones

Paso 6: Crear el dominio y el usuario administrador

Mailu se administra desde la línea de comandos a través del contenedor admin. Primero creamos el dominio y luego el usuario administrador:

# Crear el dominio
docker compose exec admin flask mailu domain tudominio.com

# Crear el usuario administrador
# Sintaxis: flask mailu admin LOCALPART DOMINIO PASSWORD
docker compose exec admin flask mailu admin admin tudominio.com TuPasswordSegura123

El localpart es la parte antes de la arroba. Con el comando anterior, el email resultante será admin@tudominio.com.

Paso 7: Acceder al panel de administración

Con todo en marcha, puedes acceder a los servicios web de Mailu:

  • Panel de administración: http://IP-DE-TU-SERVIDOR/admin
  • Webmail (Roundcube): http://IP-DE-TU-SERVIDOR/webmail

Inicia sesión con el email y la contraseña que creaste en el paso anterior. Nota importante: El formulario de login usa protección CSRF y JavaScript, por lo que solo funciona desde un navegador real. No intentes probarlo con curl.

Configuración DNS

Para que tu servidor de correo reciba mensajes desde internet, necesitas configurar correctamente los registros DNS de tu dominio. Estos son los registros imprescindibles:

TipoNombreValorPropósito
AmailIP públicaApunta el subdominio a tu servidor
MX@mail.tudominio.com (prioridad 10)Indica dónde entregar el correo
TXT@v=spf1 mx a:mail.tudominio.com ~allSPF — autoriza a tu servidor a enviar correo
TXT_dmarcv=DMARC1; p=quarantine; rua=mailto:admin@tudominio.comPolítica DMARC contra suplantación
TXTmail._domainkey(generado por Mailu)DKIM — firma digital de mensajes

Mailu genera las claves DKIM automáticamente. Encuentra la clave pública en el panel de administración, dentro de la configuración del dominio. Copia ese valor en el registro TXT mail._domainkey de tu proveedor DNS.

Consejo profesional:

Configura también un registro PTR (reverse DNS) en tu IP pública que apunte a mail.tudominio.com. Muchos servidores de correo rechazan mensajes de IPs sin reverse DNS configurado. Consulta con tu proveedor de internet o VPS para establecerlo.

Configuración HTTPS con Let's Encrypt

Mailu puede gestionar automáticamente los certificados TLS gracias a la variable TLS_FLAVOR=letsencrypt del archivo .env. Para que funcione, hay un requisito imprescindible:

El puerto 80 debe ser accesible desde internet. Let's Encrypt valida la propiedad del dominio mediante un desafío HTTP-01, que consiste en crear un archivo temporal en http://tudominio.com/.well-known/acme-challenge/. Si el puerto 80 no está accesible, la generación del certificado fallará.

Una vez generado el certificado, Mailu redirigirá automáticamente todo el tráfico HTTP a HTTPS. Los certificados se renuevan de forma automática antes de su expiración.

Si prefieres gestionar HTTPS externamente (por ejemplo, con Nginx Proxy Manager), puedes usar TLS_FLAVOR=cert en el .env y colocar tus propios certificados en el directorio /opt/mailu/certs/.

Mantenimiento

Un servidor de correo requiere mantenimiento regular. Estas son las tareas esenciales:

Copias de seguridad

Realiza backups periódicos de los datos y la configuración. Todo lo importante está en /opt/mailu/:

cd /opt/mailu
tar czf /backup/mailu-$(date +%Y%m%d).tar.gz \
  data/ certs/ dkim/ mail/ webmail/ docker-compose.yml .env

Automatiza este proceso con un cron para no olvidarlo. Los directorios más críticos son:

  • data/: Bases de datos SQLite (usuarios, dominios, alias).
  • mail/: Los buzones de correo de todos los usuarios.
  • dkim/: Claves DKIM (sin ellas, los correos firmados previamente no serán verificables).
  • certs/: Certificados TLS.
  • webmail/: Datos y configuración de Roundcube.

Actualización de Mailu

Actualizar es tan sencillo como descargar las nuevas imágenes y reiniciar:

cd /opt/mailu
docker compose pull
docker compose up -d

Revisa el changelog oficial antes de actualizar para estar al tanto de cambios importantes.

Monitorización de logs

Para diagnosticar problemas en tiempo real, sigue los logs de todos los contenedores:

docker compose logs -f --tail=100

O inspecciona un servicio específico:

docker compose logs admin
docker compose logs smtp
docker compose logs antispam

Problemas comunes y soluciones

Estos son los problemas que encontramos durante la instalación y cómo los resolvimos:

El contenedor admin no arranca (error DNSSEC)

Síntoma: El contenedor admin entra en bucle de reinicio. En los logs aparecen errores de validación DNSSEC.

Causa: El resolver DNS interno (Unbound) no puede completar la validación DNSSEC correctamente.

Solución: Agregar servidores DNS externos al servicio admin en el docker-compose.yml:

dns:
  - 8.8.8.8
  - 1.1.1.1

Error "Address already in use" en el resolver

Síntoma: El servicio resolver no puede iniciar porque el puerto 53 ya está en uso.

Causa: Otro servicio DNS (como el del host) está escuchando en el mismo puerto.

Solución: Comentar o eliminar el servicio resolver del docker-compose.yml. Con el DNS externo configurado en admin, el sistema sigue funcionando correctamente.

El login web no funciona

Síntoma: Las credenciales son correctas pero el formulario de login no avanza.

Causa: El formulario usa protección CSRF con tokens JavaScript. No se puede probar con herramientas de línea de comandos como curl.

Solución: Acceder siempre desde un navegador web real. Si el problema persiste, limpia la caché del navegador o prueba en una ventana de incógnito.

Los correos no llegan desde internet

Verifica lo siguiente:

  1. El registro MX apunta correctamente a mail.tudominio.com.
  2. El puerto 25 está abierto en el router y no bloqueado por el ISP.
  3. Los puertos 80 y 443 son accesibles (necesarios para Let's Encrypt).
  4. El reverse DNS (PTR) de tu IP pública apunta al nombre de tu servidor.

Conclusión

En menos de 30 minutos puedes tener tu propio servidor de correo completamente funcional en una VM con Ubuntu. Mailu simplifica enormemente lo que históricamente requería configurar y mantener una docena de servicios por separado: Postfix, Dovecot, Rspamd, Roundcube, gestión de certificados, filtros antispam...

Lo que obtienes con Mailu

  • Envío y recepción de correo (SMTP + IMAP + POP3).
  • Webmail completo con Roundcube.
  • Filtrado antispam avanzado con Rspamd.
  • Panel de administración web para gestionar usuarios, dominios y alias.
  • Certificados TLS automáticos con Let's Encrypt.
  • Todo contenerizado con Docker: fácil de actualizar, respaldar y migrar.

Lo que necesitas mantener

  • Copias de seguridad regulares de los datos y la configuración.
  • Monitorización del estado de los contenedores.
  • Actualizaciones periódicas de Mailu (un par de comandos).
  • Renovación de certificados (automática con Let's Encrypt).

Hospedar tu propio servidor de correo no es solo una cuestión de privacidad: es una declaración de independencia digital. Con Mailu sobre Ubuntu, la barrera de entrada es más baja que nunca.

¿Necesitas ayuda para implementar tu servidor de correo?

En Dysfortic podemos ayudarte con la instalación, configuración y mantenimiento de tu infraestructura de correo. Contacta con nosotros y cuéntanos tu caso.