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.


