SSD Nodes Learn
Guías Matt ConnorPor Matt Connor · Actualizado 2026-07-24

instalar mailcow en vps para gmail

Verifica el puerto 25 antes de instalar mailcow. Configura el DNS para evitar el error 550 5.7.25 PTR de Gmail y asegura la entrega de tus correos.

Qué vas a construir

Un servidor de correo completo en un equipo propio: SMTP para enviar y recibir, IMAP para sincronizar tu teléfono y laptop, un cliente webmail y un filtro de spam que califica cada mensaje en ambas direcciones. mailcow-dockerized agrupa Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis y un cliente ACME en un stack de Docker Compose; por lo tanto, el software no es la parte difícil. Lo tendrás funcionando en media hora.

La parte difícil es todo lo demás. El correo electrónico es el único servicio donde el resto de internet desconfía activamente de un servidor nuevo. La diferencia entre "funciona" y "Gmail descarta todos los mensajes" depende de cuatro registros DNS y un ajuste de reputación de IP que quizás no puedas controlar totalmente. Lee los prerrequisitos a continuación antes de alquilar cualquier servicio. Si después de leerlos decides que el trabajo de gestión de reputación no vale la pena, es una respuesta válida; nuestro resumen de qué vale la pena alojar por cuenta propia en 2026 clasifica el correo bajo la sección "solo si estás decidido" precisamente por estas razones.

Los requisitos previos SON el proyecto

Si falta alguno de estos elementos, los correos no se entregarán. Se listan en orden aproximado de frecuencia de error:

El puerto de salida 25 debe estar abierto. Su servidor entrega correos a Gmail y Microsoft mediante el puerto TCP 25. Muchos proveedores de VPS y cloud bloquean el puerto 25 de salida por defecto para combatir el spam. Este bloqueo es silencioso: no hay errores durante el arranque y el sistema parece estar bien, pero el correo permanece en la cola indefinidamente. Realice una prueba antes de instalar nada. Si está bloqueado, la única solución es abrir un ticket de soporte para solicitar al proveedor que lo habilite; algunos lo hacen en cuentas antiguas, otros nunca lo harán.

Una IP limpia con reputación utilizable. Las IPs de VPS recicladas suelen estar en listas de bloqueo debido al spam de usuarios anteriores. Verifique la suya en un servicio como Spamhaus lookup o mxtoolbox antes de comenzar. Una IP en una lista de bloqueo causará rechazos que no se pueden solucionar mediante configuración.

Control de DNS y un registro PTR correcto. Debe añadir registros a la zona de su dominio y necesita DNS inverso (PTR) para que la IP del servidor apunte a su hostname de correo. El PTR casi nunca se configura en su panel de DNS; se gestiona con el propietario de la IP, por lo que se configura en el panel de control de su proveedor de VPS o mediante un ticket.

6 GiB de RAM y 2 vCPU es el mínimo recomendado. El mínimo de mailcow es 6 GiB de RAM más 1 GiB de swap para una instalación privada; se recomiendan 8 GiB cuando varios usuarios dependan del servicio. Por debajo de 2.5 GiB, generate_config.sh ofrece la opción de desactivar el escáner de virus ClamAV para evitar que el kernel detenga los contenedores. Asigne 20 GB de SSD para comenzar.

Un nombre DNS, no solo una IP. Elija un hostname como mail.example.com. Ese nombre será su MAILCOW_HOSTNAME, el subject de su certificado TLS, el objetivo del PTR y su banner SMTP. Mantenga la consistencia en todos los parámetros.

Paso 1 — Comprobar que el puerto de salida 25 está abierto

Realice esto primero. El resto del proceso será inútil si este paso falla. Desde la VPS nueva, intente iniciar una conexión SMTP con un servidor de correo real:

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25

Un resultado exitoso es inmediato:

Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!

Un puerto bloqueado espera los cinco segundos completos y luego falla:

nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progress

Ese tiempo de espera indica el bloqueo. Es un filtro de red del proveedor, no su firewall; ningún cambio local lo solucionará. Abra un ticket: "Por favor, habiliten el puerto TCP 25 de salida para mi VPS en <IP>; estoy operando un servidor de correo legítimo". No instale mailcow hasta que este paso devuelva "succeeded". Tenga en cuenta que el puerto 25 de entrada (servidores externos conectando con usted) es una ruta distinta y suele estar abierto; los proveedores suelen limitar el tráfico de salida.

Paso 2 — Configure los registros DNS ahora

Los cambios de DNS tardan en propagarse, así que publique todo lo posible antes de la instalación. Suponga que su dominio es example.com, su host de correo es mail.example.com y la IP es 10.0.0.10. En su zona, cree:

mail.example.com.        A      10.0.0.10
mail.example.com.        AAAA   2001:db8::10          ; only if you have IPv6
example.com.             MX  10 mail.example.com.
example.com.             TXT    "v=spf1 mx -all"
_dmarc.example.com.      TXT    "v=DMARC1; p=none; rua=mailto:postmaster@example.com"

El registro SPF indica que "solo mi MX puede enviar correos para este dominio, rechace el resto". Inicie DMARC en p=none para poder supervisar los informes sin perder sus propios correos; aplique una política restrictiva en p=quarantine y luego en p=reject una vez que la alineación esté comprobada. Faltan dos registros a propósito: DKIM, que mailcow genera automáticamente en el Paso 6, y PTR, que debe configurar ahora en el panel de su proveedor.

Configure el PTR (DNS inverso) para 10.0.0.10 como mail.example.com — el valor exacto de MAILCOW_HOSTNAME. Este es el registro que la mayoría olvida y el que los grandes proveedores rechazan. Si su panel no tiene un campo rDNS, abra un ticket de soporte.

Paso 3 — Instalar Docker

mailcow requiere Docker Engine con el plugin Compose v2. Utilice el script de conveniencia oficial de Docker en lugar del paquete docker.io de Ubuntu, ya que este último no incluye el plugin Compose:

curl -fsSL https://get.docker.com | sudo sh
sudo docker compose version

Debe ver una línea Docker Compose version v2.x. Si docker compose version muestra docker: 'compose' is not a docker command, Docker Engine está instalado pero el plugin Compose no lo está. Instale el plugin desde el repositorio de Docker: ejecute de nuevo el script anterior o siga nuestra guía básica de Docker Compose, que configura ambos desde el propio repositorio apt de Docker.

Paso 4 — Clonar mailcow y generar la configuración

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

Verifique primero que umask imprima 0022; mailcow falla al compilar si la máscara de archivos es incorrecta, y una shell de root en Ubuntu 24.04 recién instalado ya proporciona 0022. El script solicitará el único dato crítico: el hostname completamente calificado (FQDN). Ingrese mail.example.com; el valor debe coincidir exactamente con su registro A y su registro PTR. El proceso generará mailcow.conf, el único archivo de entorno que utiliza todo el stack. Ábralo si necesita cambiar los puertos web (HTTP_PORT, HTTPS_PORT) o deshabilitar ClamAV en un servidor con pocos recursos:

MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n          # set to y to drop the virus scanner on a <2.5 GiB box

SKIP_FTS=y es la otra opción para equipos con poca RAM: la búsqueda de texto completo es el segundo componente que consume más memoria según la documentación de mailcow, y deshabilitarlo solo elimina la búsqueda de cuerpo de mensaje en el webmail.

Deje HTTP_PORT=80 y HTTPS_PORT=443 sin cambios, a menos que otro servicio en el host ya los esté utilizando; el cliente ACME integrado de mailcow requiere que el puerto 80 sea accesible desde internet para obtener el certificado. Por esto no debe ejecutar una configuración separada de nginx-plus-Certbot en el mismo servidor; mailcow emite y renueva sus propios certificados TLS internamente, y un segundo servicio ocupando los puertos 80/443 impedirá este proceso.

Paso 5 — Iniciar el stack e iniciar sesión

sudo docker compose pull
sudo docker compose up -d
sudo docker compose ps

La descarga obtiene aproximadamente dos docenas de imágenes; espere unos minutos. Cuando docker compose ps muestre todos los contenedores running (o healthy), abra https://mail.example.com en un navegador. El usuario de administrador predeterminado es admin y la contraseña es moohoo. Cambie esa contraseña inmediatamente en la interfaz de administración en Access → Administrators. Si el navegador muestra la advertencia NET::ERR_CERT_AUTHORITY_INVALID, el certificado ACME aún no se ha emitido; revise el error de ACME detallado abajo antes de asumir que el sistema falla; un certificado autofirmado temporal es normal durante los primeros uno o dos minutos.

Paso 6 — Añadir un dominio, un buzón y publicar DKIM

En la interfaz de administración, abra la página Mail Setup (Configuration → Mail Setup). En la pestaña Domains, haga clic en Add domain e introduzca example.com. Luego, en Mailboxes, haga clic en Add mailbox para crear you@example.com con una contraseña. Este buzón ya estará operativo y disponible mediante IMAP.

Ahora configure la clave DKIM. Vaya a Configuration → ARC/DKIM keys; es posible que mailcow ya haya generado una clave al añadir el dominio. Si no es así, genere una nueva en esa sección: seleccione el dominio, mantenga el selector dkim, elija 2048-bit y haga clic en Add. Copie el valor TXT largo que se muestra y publíquelo como:

dkim._domainkey.example.com.  TXT  "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"

La página Domains de mailcow tiene un botón DNS que enumera todos los registros requeridos y muestra un check verde o una cruz roja según su estado de publicación real. Utilícelo como lista de verificación; asegúrese de que todas las filas estén en verde antes de probar la entregabilidad. Una fila de DKIM en rojo tras la publicación suele indicar que la clave se dividió incorrectamente en fragmentos TXT; una clave de 2048-bit supera el límite de 255 caracteres de una sola cadena TXT, por lo que debe pegarla como un único valor lógico para que su proveedor de DNS la divida en fragmentos automáticamente.

Paso 7 — Probar la entregabilidad y alcanzar 10/10

Vaya a mail-tester.com, copie la dirección aleatoria que muestra y envíe un mensaje desde su nuevo buzón — inicie sesión en el webmail de SOGo en https://mail.example.com/SOGo y envíe desde allí. Luego haga clic en "Then check your score".

El objetivo es obtener 10/10. Las deducciones comunes y sus causas:

  • SPF not aligned — el registro MX/SPF falta o la IP de envío no está incluida. Verifique nuevamente el registro SPF TXT.
  • DKIM signature does not verify — el registro dkim._domainkey TXT falta, está en proceso de propagación o tiene errores de formato. Este es el error más común.
  • No PTR / PTR mismatch — el DNS inverso no resuelve a mail.example.com. Corrija esto con su proveedor.
  • Listed on a blocklist — reputación previa de su IP. Solicite la eliminación de la lista negra o pida una IP limpia.

No envíe correos reales a Gmail o Outlook hasta que obtenga una puntuación de 10/10. Una puntuación baja junto con una IP nueva provocará que su dominio sea marcado como spam desde el primer día.

Paso 8 — Conectar un cliente de correo real

Configure Thunderbird, Apple Mail o su teléfono con estos ajustes. El host del servidor es mail.example.com para todos ellos:

  • IMAP: puerto 993, SSL/TLS (o 143 con STARTTLS)
  • SMTP submission: puerto 465, SSL/TLS (o 587 con STARTTLS)
  • Username: la dirección completa, you@example.com
  • Password: la contraseña de la cuenta de correo configurada

No envíe correo desde un cliente por el puerto 25. Ese puerto es exclusivo para comunicación entre servidores; mailcow no permite el envío autenticado por ese puerto y la conexión será rechazada. Si el cliente reporta Relay access denied, es porque intenta enviar por el puerto 25 o sin autenticación; cambie la configuración a 465 o 587 usando sus credenciales de correo.

Paso 9 — Realice una copia de seguridad de los datos críticos

mailcow incluye un script de backup que genera snapshots de todos los volúmenes con estado. Ejecútelo en un disco externo o en un montaje remoto:

sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
  ./helper-scripts/backup_and_restore.sh backup all

all captura seis elementos, y perder cualquiera de ellos implica pérdida de datos: vmail (los buzones de correo), crypt (las claves para desencriptar vmail; sin ellas, los datos son inutilizables), mysql (la base de datos MariaDB con dominios, usuarios, alias y configuraciones), redis (el estado de la cola y la caché), rspamd (el aprendizaje de spam/ham) y postfix (la cola de correo). El script se ejecuta dentro de un contenedor auxiliar que genera archivos comprimidos, lo que garantiza la consistencia de los backups mientras el stack está en ejecución. Automatice el proceso con una tarea cron nocturna y añada --delete-days 14 para eliminar conjuntos antiguos. Para restaurar, use el mismo script con restore, que permite listar los snapshots y seleccionar qué elementos recuperar. Un backup que nunca se ha probado en una restauración es solo una esperanza, no un backup; realice una prueba en un VPS de prueba.

Paso 10 — Actualización programada

mailcow se actualiza mediante su propio script. Este proceso descarga el nuevo código, migra mailcow.conf, descarga las imágenes necesarias y reinicia los contenedores en este orden:

cd /opt/mailcow-dockerized
sudo ./update.sh --check   # reports whether an update exists, changes nothing
sudo ./update.sh           # applies it

Realice primero una copia de seguridad (Paso 9), ya que las migraciones de esquema son difíciles de revertir. Las actualizaciones son frecuentes e incluyen parches de seguridad para los demonios expuestos a internet; no permita que un servidor de correo pase meses sin actualizar. Si una actualización deja un contenedor en estado unhealthy, sudo docker compose logs --tail=50 <service>-mailcow indica el nombre del demonio que no pudo reiniciarse.

Una nota sobre el endurecimiento

mailcow ejecuta su propio servicio netfilter (netfilter-mailcow) que bloquea las IPs que realizan ataques de fuerza bruta en los puertos de mail y webmail; por lo tanto, el servicio de correo está protegido por defecto. Esto no protege el SSH en el host, que permanece expuesto a ataques de fuerza bruta. Se recomienda combinar esta instalación con Fail2ban monitoreando el log de autenticación de SSH y el uso exclusivo de llaves para el inicio de sesión. Mantenga la interfaz de administración de mailcow con una contraseña robusta y, de ser posible, fuera de la internet pública o detrás de una VPN.

Modos de fallo y sus cadenas exactas

Colas de correo y falta de entrega. Ejecute sudo docker compose exec postfix-mailcow postqueue -p o revise la cola de correo en la interfaz de administración; las entradas permanecen en estado deferred con:

status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)

El puerto 25 de salida está bloqueado por su proveedor (Paso 1). Ninguna configuración puede solucionarlo; abra un ticket de soporte. No es un problema de DNS ni de TLS; el indicador es la palabra timed out contra un MX remoto en el puerto 25.

Gmail marca todo como spam o lo rebota. Abra el mensaje en Gmail, seleccione "Show original" y revise los resultados de autenticación. dkim=fail o dkim=none significa que su registro TXT dkim._domainkey falta, está mal formado o aún no se ha propagado; publique exactamente lo que muestra la página de ARC/DKIM y espere al TTL. spf=fail significa que los registros SPF/MX no cubren su IP. La alineación es fundamental; un solo fallo en la verificación es suficiente para que el correo llegue a spam.

Rechazo por parte de grandes proveedores al conectar. Los rebotes o los logs de Postfix muestran el rechazo de PTR de Gmail:

550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.

El código 550 5.7.25 indica que falta el DNS inverso o que este no coincide. Configure el PTR para su IP como mail.example.com con su proveedor (Paso 2). El registro A (forward) y el PTR (reverse) deben coincidir, y ambos deben apuntar al mismo hostname con el que mailcow se identifica ante otros servidores.

El navegador muestra una advertencia de certificado persistente. El contenedor acme-mailcow no pudo obtener un certificado real. Revise su log:

sudo docker compose logs acme-mailcow | tail -n 40

Una línea como Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. o un fallo en el challenge significa que el puerto 80 no es accesible desde internet o que el registro A no apunta a este servidor. Confirme que mail.example.com resuelva a esta máquina, abra los puertos 80 y 443 en cualquier firewall del host y asegúrese de que ningún otro proceso esté usando esos puertos. Tras corregir la causa, reinicie el cliente con sudo docker compose restart acme-mailcow en lugar de esperar el tiempo de espera de una hora.

FAQ

¿Realmente vale la pena el autoalojamiento de correo electrónico?

Si busca propiedad de los datos, alias ilimitados y control total, la respuesta es sí; mailcow ofrece un stack profesional por el precio de un VPS. Sin embargo, la entregabilidad requiere mantenimiento constante: la reputación de la IP, la alineación de DNS y el monitoreo de blocklists son tareas permanentes. Para una dirección comercial crítica donde un solo día en la carpeta de spam representa una pérdida, un proveedor gestionado es la opción pragmática. Aloje su propio servidor solo si prioriza el control sobre la conveniencia y si realmente puede mantenerlo.

¿Cómo sé si el puerto de salida 25 está bloqueado?

Ejecute nc -vz -w 5 gmail-smtp-in.l.google.com 25 desde el servidor. El mensaje "succeeded!" indica que el puerto está abierto; un timed out tras la pausa significa que su proveedor lo bloquea. Esta es la causa más común por la cual un servidor autoalojado puede recibir correos pero no enviarlos. La única solución es que su proveedor abra el puerto; ningún cambio en la configuración local lo solucionará.

¿Por qué mi correo sigue llegando a la carpeta de spam de Gmail?

Casi siempre se debe a una cadena de autenticación fallida. Use la opción "Show original" en Gmail y busque spf=pass, dkim=pass y dmarc=pass. Un dkim=fail indica un registro dkim._domainkey TXT ausente o incorrecto; un error de coincidencia en el PTR o una IP nueva sin historial de envío también afectan la entrega. Logre primero una puntuación de 10/10 en mail-tester.com y luego realice un calentamiento gradual de la IP —enviando pocos mensajes al día e incrementando el volumen poco a poco— en lugar de enviar grandes volúmenes desde el primer día.

¿Qué es exactamente lo que necesito respaldar?

Ejecute backup_and_restore.sh backup all y guarde todo el conjunto fuera del servidor. Este comando respalda vmail (los buzones), crypt (las llaves de descifrado), la base de datos MariaDB (dominios, usuarios, alias, configuraciones), Redis, los datos aprendidos de Rspamd y la cola de Postfix. El volumen crypt es el que suele pasarse por alto; sin él, el respaldo de vmail es solo texto cifrado ilegible. Realice al menos una prueba de restauración en un entorno aislado.

¿Puedo ejecutar mailcow en un VPS de 2 GB?

No es recomendable. generate_config.sh ofrece la opción de desactivar ClamAV si dispone de menos de 2.5 GiB de memoria. Aun así, Rspamd, ClamAV, Dovecot y MariaDB compiten por la memoria, lo que provocará el uso de swap y errores de OOM (Out of Memory) bajo carga real. Considere 6 GiB más 1 GiB de swap como el mínimo para una instalación estable de un solo usuario; pase a 8 GiB en cuanto más de un par de personas dependan del servicio.

#mailcow#email#self-hosting#docker#dns