Instalación de Stalwart: Servidor de Correo Moderno

Stalwart es un servidor de correo todo-en-uno escrito en Rust que implementa de forma nativa los protocolos JMAP, IMAP4, POP3 y SMTP, ofreciendo un rendimiento excepcional con un consumo de recursos mínimo. Con su interfaz de administración web integrada, filtrado de spam moderno y soporte completo para DKIM y autenticación, Stalwart representa la evolución del servidor de correo para infraestructuras Linux contemporáneas.

Requisitos Previos

  • Servidor Linux (Ubuntu 22.04+, Debian 12+, CentOS 9+, Rocky Linux 9+)
  • Mínimo 512 MB de RAM (1 GB recomendado)
  • IP pública con puerto 25 desbloqueado
  • Dominio con acceso a la configuración DNS
  • Certificado SSL (Stalwart puede gestionarlo automáticamente)

Instalación de Stalwart

# Método 1: Script de instalación automático (recomendado)
curl --proto '=https' --tlsv1.2 -sSf \
  https://get.stalw.art/install.sh | sudo sh

# Durante la instalación, el script preguntará:
# - Directorio de instalación (por defecto: /opt/stalwart-mail)
# - Componentes a instalar (all-in-one es lo más común)
# - Dominio del servidor de correo

Para instalación manual:

# Descargar el binario según tu arquitectura
STALWART_VERSION=$(curl -s https://api.github.com/repos/stalwartlabs/mail-server/releases/latest \
  | grep '"tag_name"' | cut -d'"' -f4)

# Para amd64
wget "https://github.com/stalwartlabs/mail-server/releases/download/${STALWART_VERSION}/stalwart-mail-x86_64-unknown-linux-musl.tar.gz"

# Extraer e instalar
tar -xzf stalwart-mail-*.tar.gz
sudo mv stalwart-mail /usr/local/bin/

# Crear usuario del sistema
sudo useradd -r -s /sbin/nologin stalwart

# Crear estructura de directorios
sudo mkdir -p /opt/stalwart-mail/{data,logs,etc}
sudo chown -R stalwart:stalwart /opt/stalwart-mail

# Generar configuración inicial
sudo -u stalwart stalwart-mail --init /opt/stalwart-mail

Crea el servicio systemd:

sudo tee /etc/systemd/system/stalwart-mail.service << 'EOF'
[Unit]
Description=Stalwart Mail Server
After=network.target

[Service]
Type=simple
User=stalwart
Group=stalwart
ExecStart=/usr/local/bin/stalwart-mail --config /opt/stalwart-mail/etc/config.toml
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now stalwart-mail

# Verificar el estado
sudo systemctl status stalwart-mail
sudo journalctl -u stalwart-mail -f

Configuración de SMTP e IMAP

La configuración principal en /opt/stalwart-mail/etc/config.toml:

# Configuración de listeners
[server.listener."smtp"]
bind = ["0.0.0.0:25"]
protocol = "smtp"

[server.listener."submission"]
bind = ["0.0.0.0:587"]
protocol = "smtp"
tls.implicit = false  # STARTTLS

[server.listener."smtps"]
bind = ["0.0.0.0:465"]
protocol = "smtp"
tls.implicit = true   # TLS implícito

[server.listener."imap"]
bind = ["0.0.0.0:143"]
protocol = "imap"

[server.listener."imaps"]
bind = ["0.0.0.0:993"]
protocol = "imap"
tls.implicit = true

[server.listener."jmap"]
bind = ["0.0.0.0:8080"]
protocol = "http"

# Certificados TLS - gestión automática con ACME
[certificate."tudominio"]
cert = "%{file:/opt/stalwart-mail/etc/certs/fullchain.pem}%"
private-key = "%{file:/opt/stalwart-mail/etc/certs/privkey.pem}%"

# Almacenamiento de datos
[store."rocksdb"]
type = "rocksdb"
path = "/opt/stalwart-mail/data/db"
compression = "lz4"

[storage]
data = "rocksdb"
fts = "rocksdb"
blob = "rocksdb"
lookup = "rocksdb"

Obtener certificados SSL con Let's Encrypt:

# Instalar Certbot
sudo apt install -y certbot

# Obtener certificado (detener temporalmente Stalwart si usa el puerto 80)
sudo systemctl stop stalwart-mail
sudo certbot certonly --standalone -d mail.tudominio.com
sudo systemctl start stalwart-mail

# Copiar certificados al directorio de Stalwart
sudo mkdir -p /opt/stalwart-mail/etc/certs
sudo cp /etc/letsencrypt/live/mail.tudominio.com/fullchain.pem \
  /opt/stalwart-mail/etc/certs/
sudo cp /etc/letsencrypt/live/mail.tudominio.com/privkey.pem \
  /opt/stalwart-mail/etc/certs/
sudo chown -R stalwart:stalwart /opt/stalwart-mail/etc/certs/

# Renovar certificados automáticamente
sudo tee /etc/cron.d/stalwart-certbot << 'EOF'
0 0 * * 1 root certbot renew --quiet && \
  cp /etc/letsencrypt/live/mail.tudominio.com/fullchain.pem \
     /opt/stalwart-mail/etc/certs/ && \
  cp /etc/letsencrypt/live/mail.tudominio.com/privkey.pem \
     /opt/stalwart-mail/etc/certs/ && \
  systemctl reload stalwart-mail
EOF

Protocolo JMAP

JMAP (JSON Meta Application Protocol) es el protocolo moderno para acceso al correo, más eficiente que IMAP:

# Configuración JMAP en config.toml
[server.listener."jmap"]
bind = ["0.0.0.0:443"]
protocol = "http"
tls.implicit = true

[jmap]
# Tamaño máximo de carga de adjuntos
upload.max-size = 52428800  # 50MB

# Número máximo de objetos por petición
max-objects-in-get = 500
max-objects-in-set = 250

# Push notifications para clientes JMAP
push.max-created = 32

Clientes compatibles con JMAP:

# Fastmail (propietario) - referencia de implementación
# LMTP Clients: Thunderbird tiene soporte básico
# Meli - cliente JMAP de código abierto: https://meli-email.org/

# Probar la API JMAP directamente
curl -u "[email protected]:contraseña" \
  -H "Content-Type: application/json" \
  -X POST "https://mail.tudominio.com/jmap/" \
  -d '{
    "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"],
    "methodCalls": [
      ["Email/query", {"accountId": "ID_DE_CUENTA", "limit": 10}, "0"]
    ]
  }'

Filtrado de Spam

Stalwart integra filtrado de spam sin dependencias externas:

# Configuración del filtrado de spam en config.toml
[spam.header]
# Añadir cabeceras de puntuación a los correos
add-x-spam-status = true
add-x-spam-score = true

[spam.threshold]
# Puntuación para marcar como spam
spam = 5.0
# Puntuación para rechazar directamente
reject = 15.0

[spam.bayes]
# Activar filtro Bayesiano
enable = true
# Umbral para clasificación automática
classify.spam = 0.8
classify.ham = 0.2

# Greylisting para reducir spam de botnets
[session.rcpt.greylisting]
enable = true
period = "1m"

Entrenar el filtro Bayesiano:

# Stalwart puede aprender de los correos marcados por los usuarios
# Los usuarios pueden mover correos a la carpeta Spam para entrenar

# Via API de administración - marcar mensajes para entrenamiento
curl -u "admin:contraseña" \
  "https://mail.tudominio.com/api/v1/spam/train" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"type": "spam", "message": "BASE64_DEL_MENSAJE"}'

Firma DKIM

# Generar clave DKIM desde la interfaz de administración web
# Panel admin > Configuración > Firmas DKIM > Añadir firma

# O via CLI
stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  domain dkim generate --domain tudominio.com --selector mail

# El comando muestra el registro DNS a configurar:
# mail._domainkey.tudominio.com.  TXT  "v=DKIM1; k=rsa; p=CLAVE_PUBLICA"

Configuración DKIM en config.toml:

# Firma DKIM para correos salientes
[signature."tudominio"]
private-key = "%{file:/opt/stalwart-mail/etc/dkim/tudominio.key}%"
domain = "tudominio.com"
selector = "mail"
headers = ["From", "To", "Message-Id", "Date", "Subject"]
algorithm = "rsa-sha256"
canonicalization = "relaxed/relaxed"
expire = 604800  # 7 días en segundos

Interfaz de Administración Web

Accede al panel de administración en https://mail.tudominio.com/admin:

# Crear el primer administrador
sudo stalwart-cli --url "https://mail.tudominio.com:8080" \
  account create admin CONTRASEÑA_ADMIN --admin

# Crear un buzón de correo
sudo stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  account create usuario CONTRASEÑA_USUARIO

# Listar cuentas
sudo stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  account list

# Ver la cola de mensajes pendientes
sudo stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  queue list

Migración desde Servidores Existentes

Para migrar buzones desde Dovecot u otros servidores IMAP:

# Instalar imapsync para migración de buzones
sudo apt install -y imapsync

# Migrar un buzón desde el servidor anterior
imapsync \
  --host1 servidor-antiguo.com \
  --user1 [email protected] \
  --password1 "contraseña_antigua" \
  --host2 mail.tudominio.com \
  --user2 [email protected] \
  --password2 "contraseña_nueva" \
  --tls2 \
  --ssl1

# Para migrar múltiples usuarios, crear un script
while IFS=':' read -r usuario pass_viejo pass_nuevo; do
  echo "Migrando: $usuario"
  imapsync \
    --host1 antiguo.tudominio.com --user1 "$usuario" --password1 "$pass_viejo" \
    --host2 mail.tudominio.com --user2 "$usuario" --password2 "$pass_nuevo" \
    --tls2 --quiet
done < usuarios.csv

Solución de Problemas

Stalwart no acepta conexiones SMTP:

# Verificar que el puerto 25 está escuchando
sudo ss -tlnp | grep 25

# Ver los logs de transacciones SMTP
sudo journalctl -u stalwart-mail -f | grep -i smtp

# Probar la conexión SMTP manualmente
telnet mail.tudominio.com 25
EHLO test.com

Correos no se entregan localmente:

# Ver la cola de mensajes
sudo stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  queue list

# Forzar el reenvío de mensajes fallidos
sudo stalwart-cli --url "https://mail.tudominio.com" \
  --credentials "admin:contraseña" \
  queue retry --all

Error de certificado TLS:

# Verificar que los certificados son válidos
openssl x509 -in /opt/stalwart-mail/etc/certs/fullchain.pem \
  -noout -dates

# Verificar permisos
ls -la /opt/stalwart-mail/etc/certs/
sudo chown stalwart:stalwart /opt/stalwart-mail/etc/certs/*.pem

Conclusión

Stalwart representa el estado del arte en servidores de correo de código abierto, combinando el rendimiento de Rust con el soporte de protocolos modernos como JMAP junto a los tradicionales IMAP y SMTP. Su arquitectura de binario único simplifica enormemente el despliegue y mantenimiento en comparación con stacks clásicos como Postfix + Dovecot, sin sacrificar ninguna funcionalidad. Es especialmente adecuado para quienes buscan un servidor de correo moderno, eficiente y con bajo consumo de recursos.