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.
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).
mail.tudominio.com 25, 465, 587 143, 993, 110, 995 443 (HTTPS) 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.
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-releaseLa 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.
Instala Docker Engine siguiendo el método oficial:
curl -fsSL https://get.docker.com | sudo bash
sudo systemctl enable --now dockerEl 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).
Define el hostname FQDN del servidor:
sudo hostnamectl set-hostname mail.tudominio.comEdita /etc/hosts añadiendo la línea:
127.0.1.1 mail.tudominio.com mailPostfix usa el hostname del sistema para presentarse en EHLO durante el handshake SMTP. Hostname erróneo rompe la verificación rDNS de servidores remotos.
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 enableAntes 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.
Clona el repositorio oficial en /opt:
sudo git clone https://github.com/mailcow/mailcow-dockerized /opt/mailcow-dockerized
cd /opt/mailcow-dockerizedEl 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.
Genera el archivo de configuración:
sudo ./generate_config.shCuando 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.
Levanta el stack completo:
sudo docker compose pull
sudo docker compose up -dEl 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.
Verifica que todos los contenedores hayan subido:
sudo docker compose psDeberí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.
Accede al panel por primera vez:
https://mail.tudominio.comLogin 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ó.
Añade el dominio en Configuración → Dominios → Añadir dominio. Rellena:
tudominio.com 3072 MB 10 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.
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.
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.
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.
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:
mail.tudominio.com:993 (SSL/TLS) mail.tudominio.com:587 (STARTTLS) 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.shdel 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.