Stalwart es un servidor de correo escrito en Rust que reúne en un único binario SMTP, IMAP, POP3, JMAP y ManageSieve, junto con filtro antispam, firma DKIM, certificados ACME y un panel de administración web. Al no depender de Postfix, Dovecot ni de una base de datos externa, consume pocos recursos y se administra desde un solo sitio. En este tutorial instalarás Stalwart en Ubuntu 24.04, lo configurarás con su asistente web, publicarás los registros DNS y comprobarás el envío y la recepción.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS dedicado al correo, por ejemplo un VPS de CubePath, con al menos 1 GB de RAM.
  • Un usuario no root con privilegios sudo.
  • Un dominio propio, en esta guía your_domain, con acceso a su zona DNS. El servidor usará el nombre mail.your_domain.
  • La IP pública del servidor, your_server_ip, con posibilidad de configurar su DNS inverso (PTR).
  • Salida por el puerto TCP 25 abierta. En CubePath, como en la mayoría de proveedores, el puerto 25 de salida está cerrado por defecto y se abre mediante una solicitud al soporte explicando el uso que harás del correo.
  • Ningún otro servicio escuchando en los puertos 25, 443, 465, 587 o 993.

Paso 1: Preparar el DNS y el servidor

Stalwart solicitará el certificado TLS a Let's Encrypt durante la configuración, así que el nombre del servidor debe resolver antes de empezar. Crea en la zona de your_domain un registro A mail que apunte a your_server_ip (y un AAAA si usas IPv6). Configura también el DNS inverso de la IP para que resuelva a mail.your_domain. En CubePath se hace desde el panel: en la página Floating IPs o en la pestaña de red del VPS, edita el campo Reverse DNS de la IP.

Comprueba ambos sentidos:

dig +short A mail.your_domain
dig +short -x your_server_ip
your_server_ip
mail.your_domain.

Asigna el nombre al servidor y comprueba que puedes conectar a otros servidores por el puerto 25:

sudo hostnamectl set-hostname mail.your_domain
nc -vz -w 5 gmail-smtp-in.l.google.com 25
Connection to gmail-smtp-in.l.google.com (142.250.27.26) 25 port [tcp/smtp] succeeded!

Si el segundo comando termina con timed out, solicita la apertura del puerto antes de continuar.

Paso 2: Abrir los puertos en el firewall

Stalwart necesita estos puertos accesibles desde Internet:

PuertoUso
25Recepción de correo de otros servidores
465Envío desde clientes con TLS implícito
587Envío desde clientes con STARTTLS
993IMAP con TLS
443Panel web, JMAP, autoconfiguración, MTA-STS y validación ACME
8080Panel web por HTTP, solo durante la configuración inicial

Ábrelos con UFW sin olvidar SSH:

sudo ufw allow OpenSSH
sudo ufw allow 25,465,587,993,443/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
25,465,587,993,443/tcp     ALLOW       Anywhere
8080/tcp                   ALLOW       Anywhere
...

Paso 3: Instalar Stalwart

Stalwart se distribuye con un script de instalación oficial que descarga el binario de la última versión, crea el usuario del sistema y registra el servicio systemd. Descárgalo y revísalo antes de ejecutarlo:

curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
less install.sh

Ejecútalo como root:

sudo sh install.sh

El script sigue la jerarquía estándar de Linux:

RutaContenido
/usr/local/bin/stalwartBinario del servidor
/etc/stalwart/Configuración y variables de entorno
/var/lib/stalwart/Datos (buzones, índices, colas)
/var/log/stalwart/Registros

Comprueba que el servicio está en marcha:

sudo systemctl status stalwart
● stalwart.service - Stalwart
     Loaded: loaded (/etc/systemd/system/stalwart.service; enabled; preset: enabled)
     Active: active (running) since Fri 2026-09-25 10:12:41 UTC; 20s ago
...

Paso 4: Completar el asistente de configuración

En su primer arranque Stalwart funciona en modo bootstrap: crea una cuenta de administración temporal con una contraseña aleatoria que solo escribe una vez en el registro. Recupérala:

sudo journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'

La salida incluye una línea con username: admin y la contraseña. Abre http://your_server_ip:8080/admin en el navegador, inicia sesión con esas credenciales y sigue las pantallas del asistente:

  1. Identidad del servidor: escribe mail.your_domain como nombre del servidor y your_domain como dominio de correo por defecto. Deja activadas las opciones para obtener automáticamente el certificado TLS y para generar las claves de firma (DKIM).
  2. Almacenamiento: deja RocksDB, el valor por defecto, para una instalación de un solo servidor.
  3. Directorio de cuentas: elige el directorio interno.
  4. Registros: elige fichero de registro (Log File).
  5. Gestión automática del DNS: elige la gestión manual, salvo que tu DNS esté en uno de los proveedores que Stalwart puede actualizar por API.

Al terminar, el asistente muestra la dirección y la contraseña de la cuenta de administrador definitiva. Solo se muestran una vez: guárdalas en tu gestor de contraseñas. Después reinicia el servicio para aplicar la configuración:

sudo systemctl restart stalwart

Con el DNS manual, Let's Encrypt valida el certificado por el puerto 443 (reto TLS-ALPN-01). La emisión tarda uno o dos minutos; mientras tanto el navegador mostrará un certificado autofirmado. Comprueba después que el certificado es válido:

openssl s_client -connect mail.your_domain:443 -servername mail.your_domain -brief < /dev/null
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: CN = mail.your_domain
Hash used: SHA256
Signature type: ECDSA-Signature
Verification: OK

A partir de ahora entra al panel en https://mail.your_domain/admin con la cuenta de administrador definitiva. Cierra el puerto 8080, que ya no necesitas:

sudo ufw delete allow 8080/tcp

Paso 5: Publicar los registros DNS del dominio

Stalwart genera la zona DNS completa que necesita tu dominio: MX, SPF, DKIM, DMARC, MTA-STS, TLS-RPT y los registros de autoconfiguración de clientes. En el panel, ve a Management › Domains, abre el menú de tres puntos de your_domain y elige View DNS Zone file.

Copia los registros a tu proveedor DNS. Los imprescindibles para entregar correo son estos (los nombres de los selectores DKIM y las claves los define tu instalación, así que usa los que muestra el panel):

TipoNombreValor
MX@10 mail.your_domain.
TXT@v=spf1 mx -all
TXT<selector>._domainkeyv=DKIM1; k=...; p=...
TXT_dmarcv=DMARC1; p=reject; ...

Si prefieres empezar con una política DMARC menos estricta mientras compruebas que todo funciona, publica p=quarantine o p=none y endurécela más adelante.

Verifica que los registros se han publicado:

dig +short MX your_domain
dig +short TXT your_domain
dig +short TXT _dmarc.your_domain
10 mail.your_domain.
"v=spf1 mx -all"
"v=DMARC1; p=reject; rua=mailto:postmaster@your_domain"

Paso 6: Crear una cuenta de correo

Además de la cuenta de administrador, crea las cuentas de los usuarios desde el panel de administración, en la sección de gestión del directorio (menú Management), apartado de cuentas: indica el nombre de usuario, la dirección usuario@your_domain y una contraseña robusta.

Los clientes de correo se configuran con estos datos, y la mayoría los detectan solos gracias a los registros de autoconfiguración:

ProtocoloServidorPuertoSeguridad
IMAPmail.your_domain993SSL/TLS
SMTP (envío)mail.your_domain465SSL/TLS
SMTP (envío)mail.your_domain587STARTTLS
JMAPhttps://mail.your_domain443HTTPS

Cada usuario puede además entrar en https://mail.your_domain/account para cambiar su contraseña, activar la verificación en dos pasos o gestionar sus filtros.

Paso 7: Probar el envío y la recepción

Instala swaks, una herramienta para probar servidores SMTP desde la línea de comandos:

sudo apt install swaks

Envía un correo autenticado a una cuenta externa usando el puerto 465. Sustituye [email protected] por una dirección tuya en Gmail u Outlook; swaks te pedirá la contraseña del buzón:

swaks --to [email protected] --from usuario@your_domain \
  --server mail.your_domain:465 --tlsc \
  --auth LOGIN --auth-user usuario@your_domain

En la transcripción que muestra swaks, busca la respuesta 235 tras el comando AUTH (autenticación correcta) y la respuesta 250 tras enviar el cuerpo del mensaje (mensaje aceptado para su entrega). Un código 5xx indica el motivo del rechazo.

Abre el mensaje en el destino. En Gmail, la opción Mostrar original debe indicar PASS en SPF, DKIM y DMARC. Responde al correo para comprobar también la recepción.

Por último, comprueba que JMAP responde. La URL /.well-known/jmap devuelve la sesión JMAP del usuario:

curl -s -u usuario@your_domain https://mail.your_domain/.well-known/jmap | head -c 200
{"capabilities":{"urn:ietf:params:jmap:core":{...

Paso 8: Mantenimiento

Stalwart guarda todos los datos en /var/lib/stalwart y la configuración en /etc/stalwart. Para una copia de seguridad consistente, detén el servicio un momento y archiva ambos directorios:

sudo systemctl stop stalwart
sudo tar -czf /root/stalwart-$(date +%F).tar.gz /etc/stalwart /var/lib/stalwart
sudo systemctl start stalwart

Copia el archivo resultante fuera del servidor. Para instalaciones con muchos datos, o si no puedes permitirte la parada, usa las instantáneas de disco de tu proveedor o un almacén externo como PostgreSQL con sus propias copias.

Para seguir la actividad del servidor, revisa el registro del servicio y los ficheros de /var/log/stalwart:

sudo journalctl -u stalwart -f

Antes de actualizar a una versión nueva, lee las notas de la versión en el repositorio de GitHub de Stalwart: algunas versiones incluyen pasos de migración de la configuración o de los datos.

Solución de problemas

No aparece la contraseña de bootstrap en el registro. Solo se escribe una vez, en el primer arranque. Si la has perdido, define una credencial fija descomentando la variable STALWART_RECOVERY_ADMIN en /etc/stalwart/stalwart.env, reinicia el servicio y elimina la variable cuando termines.

El certificado no se emite. Con el DNS manual, Let's Encrypt necesita llegar al puerto 443 de mail.your_domain. Comprueba que el registro A apunta al servidor, que UFW permite el 443 y que ningún otro servicio (Nginx, Apache) lo ocupa:

sudo ss -tlnp | grep ':443 '

Los correos salientes no llegan. Si en el registro ves errores de conexión con tiempo agotado hacia puertos 25 remotos, la salida por el puerto 25 sigue bloqueada. Si llegan a la carpeta de spam, revisa que SPF, DKIM y DMARC den PASS y que el PTR coincida con mail.your_domain.

Conclusión

Tienes Stalwart funcionando en Ubuntu 24.04 con certificado TLS automático, DKIM, SPF y DMARC publicados, y acceso por IMAP, SMTP y JMAP desde un único servicio. Como siguientes pasos, crea el resto de cuentas y alias, programa las copias de seguridad fuera del servidor y, si vienes de otro servidor de correo, migra los buzones existentes por IMAP con una herramienta como imapsync.