Cómo crear un servidor de correo con Mailcow en VPS Linux

Guía técnica para crear un servidor de correo Mailcow en VPS Linux con Postfix, Dovecot, SOGo, DKIM, SPF, DMARC y panel web en menos de 1 hora.

Ejecutar tu propio servidor de correo dejó de ser tabú — Mailcow empaqueta Postfix, Dovecot, SOGo, Rspamd, ClickHouse y administración web en contenedores Docker aislados, eliminando el 90% del trabajo de configuración manual que antiguamente consumía días. Levantas el stack completo en una VPS Linux en menos de una hora.

Este tutorial está dirigido a desarrolladores o sysadmins que necesitan correo profesional bajo control propio — sin depender de Workspace, Microsoft 365 ni Zoho. Aplicaciones típicas: empresa que quiere buzones ilimitados sin coste por usuario, SaaS que necesita un servidor SMTP transaccional con reputación aislada, o profesional técnico que valora la privacidad de su correspondencia.

Tiempo estimado de ejecución: 45-60 minutos, de los cuales 15-20 minutos son propagación de DNS. El resto es instalación automatizada y configuración del dominio en el panel.

Requisitos previos

Antes de empezar, necesitas tener los recursos alineados. El correo es sensible al IP, DNS inverso y puertos — saltarse cualquiera de esos puntos significa mensajes cayendo en spam incluso con TLS válido.

Recursos mínimos

Mailcow recomienda 6 GB de RAM, 20 GB de disco y 2 vCPU para una operación cómoda. Sistema operativo: Ubuntu 22.04/24.04 LTS o Debian 12. Acceso root vía SSH. Dominio propio con control de DNS (Cloudflare, Registro.br, etc).

Hostname sugerido mail.tudominio.com
Puertos SMTP 25, 465, 587
Puertos IMAP/POP 143, 993, 110, 995
Panel web 443 (HTTPS)
Sieve 4190

Configura el registro PTR (DNS inverso) del IP de la VPS apuntando al hostname elegido antes de continuar. En el panel del proveedor de VPS normalmente lo encuentras en “Red” o “IP inverso”. Sin PTR válido, la entrega a Gmail y Outlook se degrada drásticamente.

Confirma también que el puerto 25 saliente esté abierto — muchos proveedores bloquean SMTP saliente por defecto. Prueba con telnet smtp.gmail.com 25 o nc -vz smtp.gmail.com 25 desde la VPS. Si da timeout, abre ticket al soporte del proveedor antes de continuar.

Preparar el sistema base

La primera fase deja el servidor listo para Docker y Mailcow. Trabajamos con paquetes oficiales de cada proyecto, evitando repositorios de terceros.

01

Actualiza el sistema e instala dependencias básicas:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git ca-certificates gnupg lsb-release

La actualización completa del sistema garantiza kernel y bibliotecas TLS recientes — crítico para la negociación de certificados Let’s Encrypt y cipher suites modernas en Postfix/Dovecot.

02

Instala Docker Engine siguiendo el método oficial:

curl -fsSL https://get.docker.com | sudo bash
sudo systemctl enable --now docker

El script oficial detecta la distribución, configura el repositorio apt e instala docker-ce + docker-compose-plugin. Confirma con docker --version y docker compose version (nota: subcomando compose, sin guión — es el plugin v2).

03

Define el hostname FQDN del servidor:

sudo hostnamectl set-hostname mail.tudominio.com

Edita /etc/hosts añadiendo la línea:

127.0.1.1 mail.tudominio.com mail

Postfix usa el hostname del sistema para presentarse en EHLO durante el handshake SMTP. Hostname erróneo rompe la verificación rDNS de servidores remotos.

04

Configura el firewall liberando los puertos necesarios:

sudo ufw allow 22/tcp
sudo ufw allow 25,80,110,143,443,465,587,993,995,4190/tcp
sudo ufw enable
Verifica el SSH primero

Antes de activar el UFW, confirma que puedes reconectarte en otra sesión SSH. Activar el firewall sin liberar el puerto 22 te deja fuera de la VPS.

Instalar Mailcow

Con el sistema preparado, clonamos el repositorio oficial y generamos la configuración base. El setup interactivo pregunta por el hostname y genera contraseñas aleatorias para los servicios internos.

05

Clona el repositorio oficial en /opt:

sudo git clone https://github.com/mailcow/mailcow-dockerized /opt/mailcow-dockerized
cd /opt/mailcow-dockerized

El directorio /opt es la convención para el stack — los scripts oficiales de backup y actualización asumen esa ruta. No uses /root ni /home.

06

Genera el archivo de configuración:

sudo ./generate_config.sh

Cuando pregunte por el hostname FQDN, escribe mail.tudominio.com (el mismo del paso 03). El script genera mailcow.conf con contraseñas aleatorias para MySQL, Redis y la API. No edites las contraseñas manualmente — los backups dependen de esos valores.

07

Levanta el stack completo:

sudo docker compose pull
sudo docker compose up -d

El pull descarga ~3 GB de imágenes (Postfix, Dovecot, SOGo, Rspamd, MySQL, Redis, ClickHouse, Nginx, ACME, Watchdog, Netfilter). El up crea todos los contenedores en background. El primer arranque tarda 2-3 minutos hasta que MySQL inicialice los esquemas.

08

Verifica que todos los contenedores hayan subido:

sudo docker compose ps

Deberías ver ~15 contenedores con estado running o healthy. Si alguno aparece como restarting, ejecuta sudo docker compose logs <nombre-del-contenedor> para investigar — es habitual en el primer arranque cuando MySQL aún está poblando.

Configurar DNS del dominio

Mailcow está corriendo, pero el dominio aún no llega allí. Necesitamos publicar 6 registros DNS: MX, A, SPF, DKIM, DMARC y autodiscover. Esos registros son lo que hace al servidor confiable para los grandes proveedores.

09

Accede al panel por primera vez:

https://mail.tudominio.com

Login por defecto: usuario admin, contraseña moohoo. Cámbiala inmediatamente en Sistema → Administradores. Mailcow ya generó el certificado Let’s Encrypt automáticamente si los puertos 80 y 443 estaban accesibles cuando arrancó.

10

Añade el dominio en Configuración → Dominios → Añadir dominio. Rellena:

Dominio tudominio.com
Cuota por buzón 3072 MB
Máx. de buzones 10
Límite diario SMTP 1000

Tras crear el dominio, ve a Configuración → Configuración → ARC/DKIM. Mailcow genera el par de claves automáticamente — copia el registro TXT mostrado.

11

Publica los registros DNS en tu proveedor (ejemplo para Cloudflare):

tudominio.com.        IN A      203.0.113.10
mail.tudominio.com.   IN A      203.0.113.10
tudominio.com.        IN MX 10  mail.tudominio.com.
tudominio.com.        IN TXT    "v=spf1 mx -all"
dkim._domainkey.tudominio.com. IN TXT "v=DKIM1; k=rsa; p=MIIBI..."
_dmarc.tudominio.com. IN TXT    "v=DMARC1; p=quarantine; rua=mailto:[email protected]"
autodiscover.tudominio.com. IN CNAME mail.tudominio.com.
autoconfig.tudominio.com.   IN CNAME mail.tudominio.com.

Sustituye 203.0.113.10 por el IP de tu VPS y la clave DKIM por el valor real generado en el paso 10. La propagación tarda de 5 a 30 minutos dependiendo del TTL.

DMARC progresivo

Empieza DMARC con p=none durante 1-2 semanas y monitorea los informes en rua=. Después escala a quarantine y finalmente a reject cuando tengas la certeza de que SPF y DKIM pasan para el 100% de tus envíos legítimos.

Crear buzones y probar

Dominio añadido y DNS propagado, ahora creamos el primer buzón real y validamos el envío bidireccional.

12

En Email → Buzones → Añadir buzón, rellena usuario, dominio, nombre completo, contraseña y cuota. Repite para cada usuario.

Accede al webmail en https://mail.tudominio.com/SOGo/. Login con correo completo ([email protected]) + contraseña definida. SOGo entrega calendario, contactos y ActiveSync a clientes móviles sin configuración adicional.

13

Configura un cliente de escritorio (Thunderbird, Outlook, Apple Mail) con auto-descubrimiento: los registros autodiscover y autoconfig que publicaste en el DNS hacen que el cliente rellene los servidores y puertos solo. En caso de configurar manualmente:

IMAP mail.tudominio.com:993 (SSL/TLS)
SMTP mail.tudominio.com:587 (STARTTLS)
Sieve mail.tudominio.com:4190 (STARTTLS)

Verificación

Confirma que la entregabilidad está sana antes de migrar buzones reales o enrutar el dominio en producción.

Envía un correo de prueba a una dirección Gmail y revisa la cabecera del mensaje recibido (en Gmail: tres puntos → “Mostrar original”). Busca las líneas:

spf=pass
dkim=pass
dmarc=pass

Si alguno aparece como fail o neutral, hay un error de DNS — revisa SPF, DKIM y PTR. Una alternativa rápida es enviar un correo a [email protected], que devuelve un informe detallado en segundos.

Prueba la recepción enviando desde Gmail a la dirección en tudominio.com. Comprueba que llega a la bandeja de entrada (no a spam). Si cae en spam, el problema suele ser un PTR ausente o el IP de la VPS en una blocklist — verifica en mxtoolbox.com/blacklists.

Resolución de problemas

Los contenedores se reinician constantemente

Causa común: MySQL no pudo inicializar por falta de RAM. Ejecuta free -h y confirma que tienes al menos 4 GB libres. Si la VPS tiene 4 GB total y la memoria ya está consumida, aumenta el swap:

sudo fallocate -l 4G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile

Añade /swapfile none swap sw 0 0 en /etc/fstab para persistir.

Let’s Encrypt no emite el certificado

Revisa el log del contenedor ACME:

sudo docker compose logs acme-mailcow

Causas frecuentes: puerto 80 bloqueado por firewall externo, registro A de mail.tudominio.com aún sin propagar, o rate limit de Let’s Encrypt (50 emisiones/semana por dominio raíz).

Los correos salen pero caen en spam

Verifica el PTR con dig -x TU_IP +short. El resultado debe devolver mail.tudominio.com. exactamente — no el hostname genérico del proveedor. Si está mal, ajústalo en el panel del proveedor de VPS. La propagación tarda hasta 24h.

Próximos pasos

Con el servidor en marcha, considera:

  • Configurar backup automatizado con helper-scripts/backup_and_restore.sh del propio repositorio Mailcow, programado vía cron diario a un destino externo (S3 compatible u otra VPS).
  • Habilitar 2FA en el panel admin en Configuración → Administradores → Editar → Two-factor authentication (soporta TOTP y Yubikey).
  • Migrar buzones antiguos vía Sync Jobs (Email → Configuración → Sync jobs) — conecta al IMAP origen y replica preservando flags.
  • Ajustar los límites de envío por dominio conforme crece la reputación — empezar con 500/día y subir gradualmente hasta 5000/día.

Si lo estás llevando a producción y quieres puerto 25 ya liberado, PTR configurable desde el panel y soporte técnico en español, una VPS Hostini entrega el entorno Linux listo para ejecutar Mailcow sin fricción con bloqueos del proveedor.

Preguntas frecuentes

¿Mailcow funciona en una VPS de 2 GB de RAM?

Técnicamente arranca, pero Rspamd y ClickHouse se atascan bajo carga real. El mínimo recomendado oficial es 6 GB de RAM y 20 GB de disco. Para producción con 5+ buzones activos, considera 8 GB y SSD NVMe — ClickHouse realiza I/O intensivo de logs.

¿Puedo instalar Mailcow junto con otros servicios en la misma VPS?

No recomendado. Mailcow ocupa los puertos 25, 465, 587, 110, 143, 993, 995, 80, 443 y 4190, además de tomar el control del daemon de Docker. Los conflictos con Nginx/Apache locales son frecuentes. Usa una VPS dedicada para el stack de correo.

¿Por qué mi puerto 25 está bloqueado y cómo lo libero?

Los proveedores de nube bloquean SMTP saliente (puerto 25) por defecto para mitigar el spam. Necesitas abrir un ticket con el proveedor pidiendo el desbloqueo, justificando el uso (servidor de correo transaccional propio). Sin eso, Mailcow recibe pero no envía.

¿Mailcow genera los registros DKIM automáticamente?

Sí. Tras añadir el dominio en el panel (Configuración → Dominios), Mailcow genera el par de claves DKIM y muestra el registro TXT para publicar en el DNS. El selector por defecto es dkim. Solo copias y pegas en tu proveedor de DNS.

¿Cómo migro buzones existentes a Mailcow?

Usa la función Sync Jobs del panel (Email → Configuración → Sync jobs). Mailcow conecta al IMAP origen y replica los mensajes preservando flags y estructura de carpetas. Funciona con Gmail, Outlook, cualquier servidor IMAP — siempre que tengas contraseña de aplicación/IMAP habilitado.

¿Necesito el IP inverso (PTR) configurado?

Sí, es obligatorio. Sin un PTR válido apuntando al hostname del servidor (mail.tudominio.com), Gmail, Outlook y la mayoría de los grandes proveedores rechazan o marcan como spam. Configura el PTR en el panel del proveedor de VPS antes de enviar el primer correo.

Temas:
Próximos pasos Cloud Ryzen con NVMe y protección DDoS siempre activa.Pon en producción en un VPS Hostini →
¿Te resultó útil este tutorial?
Hablar por WhatsApp