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 versionDeberí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/.envPaso 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=letsencryptGenera una SECRET_KEY segura:
openssl rand -hex 32Copia 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
- resolver4b. 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 -dVerifica que todos los contenedores estén corriendo:
docker compose psDeberías ver los siguientes servicios en estado running:
| Servicio | Función |
|---|---|
| front | Proxy inverso (Nginx) — gestiona todo el tráfico HTTP/HTTPS |
| admin | Panel de administración (Flask) |
| imap | Servidor IMAP/POP3 (Dovecot) |
| smtp | Servidor SMTP (Postfix) |
| antispam | Filtrado antispam (Rspamd) |
| resolver | DNS resolver con DNSSEC (Unbound) — opcional |
| webmail | Interfaz webmail (Roundcube) |
| redis | Almacenamiento 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 TuPasswordSegura123El 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:
| Tipo | Nombre | Valor | Propósito |
|---|---|---|---|
| A | IP pública | Apunta 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 ~all | SPF — autoriza a tu servidor a enviar correo |
| TXT | _dmarc | v=DMARC1; p=quarantine; rua=mailto:admin@tudominio.com | Política DMARC contra suplantación |
| TXT | mail._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 .envAutomatiza 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 -dRevisa 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=100O inspecciona un servicio específico:
docker compose logs admin
docker compose logs smtp
docker compose logs antispamProblemas 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.1Error "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:
- El registro MX apunta correctamente a
mail.tudominio.com. - El puerto 25 está abierto en el router y no bloqueado por el ISP.
- Los puertos 80 y 443 son accesibles (necesarios para Let's Encrypt).
- 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.