
700 - Deja Gmail hoy, monta tu servidor y protege tus datos
como puedes montar tu #servidor de #correo electrónico de forma sencilla con #stalwart para tener tu el control de todos tus datos
En este episodio y para celebrar el número 700, te traigo algo que suele reclamarse de forma habitual en cualquier sitio que tenga relación con el auto alojamiento. Me refiero a auto alojar un servidor de correo electrónico. La pregunta ¿como puedo montar mi servidor de correo?, es de las mas frecuentes en este tipo de entornos, y en general, después de varias opciones, lo general es que te recomienden que no lo hagas, que sigas utilizando tu proveedor de correo electrónico habitual. Pero, además los servidores de correo de los que normalmente se hablan son una combinación de herramientas como Dovecot, Roundcube, y similares y en general son realmente complejos de hacerlos funcionar con garantías. En este sentido, el servicio de correo electrónico que te propongo es Stalwart. Se trata de un servicio que es realmente sencillo de poner en funcionamiento, y mas o menos sencillo de hacerlo funcionar. En mi caso, lo he conseguido, mientras que con el resto no lo había conseguido hasta

Deja Gmail hoy, monta tu servidor y protege tus datos
Un paseo por el pasado
Te diría que desde mis comienzos en esto del auto alojamiento, he intentado en innumerables ocasiones levantar mi propio servicio de correo electrónico. Sin embargo, hasta la fecha no lo había conseguido, o al menos no lo había conseguido para que fuera funcional y tuviera éxito
Stalwart
Stalwart, es un servidor de correo que apuesta por un enfoque moderno y además Open source. Se trata de una solución todo en uno, que no solo te permite gestionar tu correo electrónico, sino también calendarios, contactos, archivos y mucho más.
Lo interesante de Stalwart es su compatibilidad con una amplia variedad de protocolos: JMAP, IMAP4, POP3, SMTP, CalDAV, CardDAV y WebDAV. Esto lo convierte en una herramienta muy versátil, ideal tanto si quieres montar tu propio servidor de correo personal como si estás pensando en desplegar una solución más ambiciosa a nivel empresarial.
Además, está desarrollado en Rust, lo que le aporta un extra de seguridad, rendimiento y fiabilidad. Y lo mejor de todo: está pensado para escalar, desde una Raspberry Pi en casa hasta una infraestructura distribuida.
Está pensado para escalar sin problemas, tanto si lo usas en casa para tus propios correos como si lo despliegas en un entorno empresarial con miles de usuarios.
Eso sí, como ocurre con muchas soluciones potentes, los recursos que necesita —sobre todo memoria y CPU— dependen mucho del uso que le des: cuántas conexiones simultáneas hay, qué tanto tráfico generan los clientes, etc.
Requerimientos de Memoria y CPU
Una de las grandes ventajas de Stalwart es que está diseñado para ser eficiente y ligero en cuanto al uso de memoria. Cuando está en reposo, apenas consume unos 100 MB de RAM, lo que lo hace perfecto para entornos ligeros o sistemas con recursos limitados.
Ahora bien, el consumo real dependerá de cuántas conexiones simultáneas haya y de la actividad general del servidor.
Para que te hagas una idea: en un despliegue pequeño, pensado para 5 a 10 usuarios con un uso normal, 1 GB de RAM suele ser más que suficiente para que Stalwart funcione con soltura. En cambio, si hablamos de servidores con mucho tráfico y miles de conexiones simultáneas, entonces sí necesitarás bastante más memoria para mantener un buen rendimiento y que todo vaya fluido.
El uso de CPU en Stalwart escala según el número de usuarios, el volumen de correos y la intensidad de las operaciones simultáneas a través de los distintos protocolos que soporta.
En un escenario para unos cinco usuarios, un solo núcleo de CPU suele ser más que suficiente para gestionar las operaciones del día a día sin que se resienta el rendimiento.
Si estás pensando en un entorno más grande o dinámico, lo ideal es que estimes cuántas conexiones simultáneas tendrás en las horas punta, y qué tipo de operaciones harán los usuarios con más frecuencia: búsquedas complejas por IMAP, sincronización vía JMAP o envío intensivo de correos por SMTP, por ejemplo. Cada una de estas tareas impacta de forma diferente en la CPU, y el conjunto te ayudará a calcular cuántos núcleos deberías asignar.
Y como siempre, monitorizar el servidor en producción es clave. Esto te permitirá ajustar los recursos sobre la marcha, según el uso real y no solo con base en estimaciones previas.
Así que como ves, para unas pocas cuentas de correo, con un 1 GB de RAM y un solo núcleo de CPU, tendrás mas que suficiente.
Instalación
En mi caso particular he utilizado Docker para la instalación, y en concreto Traefik como proxy inverso. Así a continuación te indico los cambios que he introducido en Traefik, que realmente son muy pocos.
Traefik
Dentro del compose.yml
de Traefik, he modificado los puertos añadiendo los siguientes,
ports:
- 25:25
- 465:465
- 993:993
Por supuesto he abierto estos puertos en el Firewall.
Y además he añadido un volumen para los certificados, de forma que se pueda compartir con certdumper
, del que te hablaré un poco mas adelante,
volumes:
- acme:/etc/certs
A continuación, en la configuración estática, he añadido los siguientes entryPoints,
smtp:
address: ":25"
proxyProtocol:
trustedIPs:
- 172.29.0.8
- 172.29.0.41
smtps:
address: ":465"
proxyProtocol:
trustedIPs:
- 172.29.0.8
- 172.29.0.41
imaps:
address: ":993"
proxyProtocol:
trustedIPs:
- 172.29.0.8
- 172.29.0.41
Además es necesario convertir los certificados que genera Traefik, para que los pueda utilizar Stalwart. Pera esto, hacemos uso de un servicio llamado certdumper
, que he añadido dentro del propio compose.yml
de Traefik,
certdumper:
image: ghcr.io/kereis/traefik-certs-dumper:latest
container_name: traefik-certs-dumper
restart: unless-stopped
init: true
volumes:
- /etc/localtime:/etc/localtime:ro
- acme:/traefik:ro
- certs:/output:rw
volumes:
acme:
external: true
certs:
external: true
Stalwart
El compose.yml
de Stalwart es realmente sencillo, aunque se complica ligeramente en el caso de Traefik por los labels, pero tiene un aspecto como el que te muestro a continuación,
services:
stalwart:
image: stalwartlabs/stalwart:latest
container_name: stalwart
restart: unless-stopped
init: true
hostname: mail.tuservidor.es
security_opt: [no-new-privileges:true]
volumes:
- /etc/localtime:/etc/localtime:ro
- data:/opt/stalwart
- certs:/data/certs:ro
- ./config.toml:/opt/stalwart/etc/config.toml
- ./logs:/opt/stalwart/logs
networks:
proxy:
ipv4_address: 172.29.0.41
labels:
- traefik.enable=true
# admin ui
- traefik.http.routers.stalwart.rule=Host(`mail.tuservidor.es`) || Host(`autodiscover.tuservidor.es`) || Host(`autoconfig.tuservidor.es`) || Host(`mta-sts.tuservidor.es`)
- traefik.http.routers.stalwart.entrypoints=https
- traefik.http.routers.stalwart.service=stalwart
- traefik.http.services.stalwart.loadbalancer.server.port=8080
# smtp
- traefik.tcp.routers.stalwart-smtp.rule=HostSNI(`*`)
- traefik.tcp.routers.stalwart-smtp.entrypoints=smtp
- traefik.tcp.routers.stalwart-smtp.service=stalwart-smtp
- traefik.tcp.services.stalwart-smtp.loadbalancer.server.port=25
- traefik.tcp.services.stalwart-smtp.loadbalancer.proxyProtocol.version=2
# jmap
- traefik.tcp.routers.stalwart-jmap.rule=HostSNI(`*`)
- traefik.tcp.routers.stalwart-jmap.entrypoints=https
- traefik.tcp.routers.stalwart-jmap.tls.passthrough=true
- traefik.tcp.routers.stalwart-jmap.service=stalwart-jmap
- traefik.tcp.services.stalwart-jmap.loadbalancer.server.port=443
- traefik.tcp.services.stalwart-jmap.loadbalancer.proxyProtocol.version=2
# esmtp
- traefik.tcp.routers.stalwart-smtps.rule=HostSNI(`*`)
- traefik.tcp.routers.stalwart-smtps.entrypoints=smtps
- traefik.tcp.routers.stalwart-smtps.tls.passthrough=true
- traefik.tcp.routers.stalwart-smtps.service=stalwart-smtps
- traefik.tcp.services.stalwart-smtps.loadbalancer.server.port=465
- traefik.tcp.services.stalwart-smtps.loadbalancer.proxyProtocol.version=2
# imap-ssl
- traefik.tcp.routers.stalwart-imaps.rule=HostSNI(`*`)
- traefik.tcp.routers.stalwart-imaps.entrypoints=imaps
- traefik.tcp.routers.stalwart-imaps.tls.passthrough=true
- traefik.tcp.routers.stalwart-imaps.service=stalwart-imaps
- traefik.tcp.services.stalwart-imaps.loadbalancer.server.port=993
- traefik.tcp.services.stalwart-imaps.loadbalancer.proxyProtocol.version=2
networks:
proxy:
external: true
volumes:
data: {}
certs:
external: true
Por supuesto, tienes que cambiar tuservidor.es
, por el dominio que tengas.
En cuanto a la configuración actual que tengo, el archivo config.toml
, es el siguiente,
authentication.fallback-admin.secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
authentication.fallback-admin.user = "admin"
certificate.default.cert = "%{file:/data/certs/mail.tuservidor.es/cert.pem}%"
certificate.default.default = true
certificate.default.private-key = "%{file:/data/certs/mail.tuservidor.es/key.pem}%"
directory.internal.store = "rocksdb"
directory.internal.type = "internal"
server.hostname = "mail.tuservidor.es"
server.listener.http.bind = "[::]:8080"
server.listener.http.protocol = "http"
server.listener.https.bind = "[::]:443"
server.listener.https.protocol = "http"
server.listener.https.tls.implicit = true
server.listener.imap.bind = "[::]:143"
server.listener.imap.protocol = "imap"
server.listener.imaptls.bind = "[::]:993"
server.listener.imaptls.protocol = "imap"
server.listener.imaptls.tls.implicit = true
server.listener.imaptls.proxy.override = true
server.listener.imaptls.proxy.trusted-networks.0 = "172.29.0.8"
server.listener.imaptls.proxy.trusted-networks.1 = "172.29.0.0/16"
server.listener.pop3.bind = "[::]:110"
server.listener.pop3.protocol = "pop3"
server.listener.pop3s.bind = "[::]:995"
server.listener.pop3s.protocol = "pop3"
server.listener.pop3s.tls.implicit = true
server.listener.sieve.bind = "[::]:4190"
server.listener.sieve.protocol = "managesieve"
server.listener.smtp.bind = "[::]:25"
server.listener.smtp.protocol = "smtp"
server.listener.smtp.proxy.override = true
server.listener.smtp.proxy.trusted-networks.0 = "172.29.0.8"
server.listener.smtp.proxy.trusted-networks.1 = "172.29.0.0/16"
server.listener.submission.bind = "[::]:587"
server.listener.submission.protocol = "smtp"
server.listener.submissions.bind = "[::]:465"
server.listener.submissions.protocol = "smtp"
server.listener.submissions.tls.implicit = true
server.listener.submissions.proxy.override = true
server.listener.submissions.proxy.trusted-networks.0 = "172.29.0.8"
server.listener.submissions.proxy.trusted-networks.1 = "172.29.0.0/16"
server.listener.webdav.bind = "[::]:8080"
server.listener.webdav.protocol = "http"
server.listener.webdav.proxy.override = false
server.listener.webdav.socket.override = false
server.listener.webdav.tls.implicit = false
server.listener.webdav.tls.override = false
server.max-connections = 8192
server.socket.backlog = 1024
server.socket.nodelay = true
server.socket.reuse-addr = true
server.socket.reuse-port = true
storage.blob = "rocksdb"
storage.data = "rocksdb"
storage.directory = "internal"
storage.fts = "rocksdb"
storage.lookup = "rocksdb"
store.rocksdb.compression = "lz4"
store.rocksdb.path = "/opt/stalwart/data"
store.rocksdb.type = "rocksdb"
tracer.log.ansi = false
tracer.log.enable = true
tracer.log.level = "debug"
tracer.log.path = "/opt/stalwart/logs"
tracer.log.prefix = "stalwart.log"
tracer.log.rotate = "daily"
tracer.log.type = "log"
Es muy importante establecer las ips fijas, tal y como puedes ver en el ejemplo anterior. Si bien, indicarte que no es necesario que lo hagas en el archivo, lo puedes hacer directamente desde la configuración de Stalwart.
Configuración de Stalwart
La primera vez que inicias Stalwart, tienes que ejecutar docker logs stalwart
para obtener los credenciales de administrador. Por ejemplo,
$ docker logs stalwart
✅ Configuration file written to /opt/stalwart/etc/config.toml
🔑 Your administrator account is 'admin' with password 'w95Yuiu36E'.
Una vez accedas, en mi caso a mail.tuservidor.es
, recuerda cambiar estos credenciales y mantenerlos a buen recaudo. Y ahora ya te puedes dar un paseo por toda la configuración y opciones disponibles. Tampoco te agobies y solo configura lo básico.
El siguiente paso es configura el dominio. Así en Settings > Server > Network
confirma el hostname, tal y como lo pusiste en el compose.yml
, y añade el dominio que quieres utilizar. En mi caso, mail.tuservidor.es
.
Luego en Mnagemente > Directory > Domains
, añade el dominio que quieres utilizar, en mi caso tuservidor.es
. Una vez creado el dominio te mostrará los registros DNS que necesitas para tu proveedor de dominio. Esta parte es importante, pero no tienes mas que copiar esos valores. Por ejemplo,
MX tuservidor.es. 10 mail.tuservidor.es.
TXT 202404e._domainkey.tuservidor.es. v=DKIM1; k=ed25519; h=sha256; p=MCowBQYDK2VwAyEAOT2JN9F8SLTVFNEODDu22SD9RJDC282mugCAeXkzjH0=
TXT 202404r._domainkey.tuservidor.es. v=DKIM1; k=rsa; h=sha256; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAykeYJjv5N0AlnJ8gKF+/8qjbStiMFWvPg+p3JPh96GPXEN6l9W/Ee6Lag6i3vLyTVH5dnRVRBhfWhc+Dc0nKreZe4f5i4L5M4RI31+RpEgu4bCmncUIk2WzJgGBW5XbiOwXjge6OKWtJQN9d8Lc1AuryL5xeged9iS6xd/+EJz4WxAf18U+j38xmAm8fJUTBnQVeb/AZup+voSKAS59jyumsb0jQtXfX5xnwTFXdiX2OF8LRrmmNs/ObHozgHftxAv+YCiSU4bqSlKNPQIrN5kk1YnZDnLlc1Gr66AWlmdUVE7PWtZPTy4f8+uHO93EW3WUxLmynZm+Syn9FTJC2uwIDAQAB
TXT mail.tuservidor.es. v=spf1 a -all ra=postmaster
TXT tuservidor.es. v=spf1 mx -all ra=postmaster
TXT _dmarc.tuservidor.es. v=DMARC1; p=reject; rua=mailto:postmaster@tuservidor.es; ruf=mailto:postmaster@tuservidor.es
Ojo que estos registros son un ejemplo, y tienes que adaptarlos a tu dominio. En mi caso, he utilizado tuservidor.es
, pero tienes que utilizar el dominio que hayas configurado. Pero, como te digo, no te preocupes, porque cuando añadas tu dominio te mostrará toda la información que necesitas.
Creando cuentas de correo
Para crear tus primeras cuentas de correo, dirigete a Directory > Accounts
y crea todas las cuentas que necesites.
Indicarte que si seguiste bien los pasos correspondientes a los registros DNS habrás configurado el autodescubrimiento, con lo que dar de alta cuentas en tu cliente de correo electrónico, es realmente muy sencillo, y prácticamente no necesitarás hacer nada. En mi caso cree un par de cuentas para gestión como son info@tuservidor.es
y postmaster@tuservidor.es
.
Lo que tiene que venir
ME he quedado justo en la configuración del servidor de correo electrónico. Ahora me queda configurar correctamente WebDAV y sobre todo CalDAV y CardDAV, para tener mis propios calendarios y contactos alojados en mi propio servidor. Esto me hace especialmente ilusión.
Por otro lado, lo que necesito es crear un cliente de correo que ataque al servidor vía API, para hacer otro tipo de integraciones que me permitirán enviar y recibir correo electrónico de forma sencilla.
Conclusión
Por fin tengo funcionando el servidor de correo electrónico. Ahora, como siempre, queda exprimirlo al máximo y sacarle todo el partido posible. Sobre todo para recibir correos electrónicos, que es básicamente para lo que lo necesito.
Actualmente tengo contratados algunos servidores de correo, que básicamente son de lectura, y mi objetivo, es traerlos todos aquí, y configurarlos de esta forma. Pero, esto creo que me va a llevar algo mas de tiempo.
Más información,