Stalwart v1.0 bat Postfix et Dovecot sur 35 des 38 tests après cinq ans de développement
Le 26 octobre 2026, Stalwart a publié sa première version stable, cinq ans après le premier commit. Le serveur de messagerie tout-en-un écrit en Rust revendique des performances supérieures à la pile Postfix + Dovecot sur 35 des 38 tests de référence, au prix d’une migration de schéma.
26 octobre 2026. Stalwart a publié v1.0, sa première version stable, cinq ans après le premier commit du 3 octobre 2021 — alors une simple bibliothèque d’analyse d’e-mails en Rust. Le projet est devenu un serveur de messagerie complet (JMAP, IMAP, POP3, SMTP, CalDAV, CardDAV, WebDAV), avec filtre antispam, clustering et une demi-douzaine de backends de stockage. Le point qui compte : Stalwart affirme désormais être « le serveur de messagerie le plus rapide de la planète », après avoir battu la pile Postfix + Dovecot sur 35 des 38 comparaisons de référence. C’est une revendication lourde, car cette pile est le moteur caché derrière docker-mailserver, mailcow et Mail-in-a-Box.
Deux objectifs : la vitesse et la stabilité des données
Stalwart v1.0 n’a pas été pensé comme une version de plus. L’équipe de Mauro D., le mainteneur, lui a assigné deux buts : la performance, démontrée par des chiffres, et la stabilité du schéma de base de données, pour que les prochaines mises à niveau se résument à installer une nouvelle version. Autrement dit, la fin des migrations destructrices qui avaient rendu certaines mises à niveau précédentes « cahoteuses ».
Le travail de performance a été mené sous profileur. Les parseurs ont été réécrits avec des instructions SIMD (SSE2, SSSE3, AVX2, NEON) et la technique SWAR pour traiter 16 ou 32 octets à la fois au lieu d’un. Deux bibliothèques sortent en 1.0 avec le serveur : mail-parser 1.0, annoncé 3 fois plus rapide que la crate mailparse, 9 fois plus rapide que le parseur de Dovecot et 15 à 31 fois plus rapide que libEtPan!, VMime et GMime ; et encodify, qui décode le Base64 22 fois plus vite que la crate standard sur un serveur AMD EPYC.
En dessous, le stockage a été réécrit pour réduire les allers-retours : identifiants attribués dans la même transaction que leur usage, opérations de lecture-modification-écriture fusionnées dans le backend, et compression zstd avec des dictionnaires entraînés sur du courrier, des calendriers et des contacts. Le nouveau moteur de recherche plein texte indexe la position des mots, ce qui rend possibles les recherches d’expressions exactes, et renvoie une recherche dans le corps de tous les messages d’une boîte de 250 000 messages en moins de 4 millisecondes.
Le face-à-face avec Postfix et Dovecot
Le chiffre qui fait date est celui du benchmark. Stalwart v1.0 a été confronté à Postfix 3.11 (SMTP) et Dovecot 2.4 (IMAP) sur des serveurs Azure identiques — 8 vCPU AMD EPYC Zen 5, 32 Gio de RAM, NVMe local — chargés avec les mêmes 1 000 boîtes plus trois très grosses allant jusqu’à 250 000 messages, et soumis exactement au même travail.
Le verdict : Stalwart est plus rapide dans 35 des 38 comparaisons. Dans le détail :
- IMAP : plus rapide que Dovecot sur 14 des 15 opérations quotidiennes, d’un facteur 1,4 à 19. Une connexion avec poignée de main TLS complète prend 5,1 ms au lieu de 28 ms ; la récupération d’un message de 1 Mo est 6 fois plus rapide ; déplacer ou supprimer 100 messages l’est 18 à 19 fois plus.
- SMTP : Stalwart accepte un message 3,6 à 12 fois plus vite que Postfix, et soutient 5 445 messages entrants par seconde contre 723.
- Livraison : un message est visible par un client IMAP 16 fois plus tôt, et un client en IDLE est notifié en 3,3 ms au lieu d’une demi-seconde.
- Charge : 5,4 fois plus de sessions IMAP simultanées servies par seconde, et 3,8 fois plus de courrier relayé avant de ralentir.
L’écart se creuse avec la taille de la boîte : sur 250 000 messages, une recherche plein texte prend 3,75 ms contre 136 ms chez Dovecot, et déplacer ou supprimer 25 000 messages s’achève en un dixième de seconde contre 24 à 34 secondes — soit plus de 200 fois plus rapide. Les trois tests remportés par Dovecot sont une seule et même opération : marquer tous les messages d’une boîte comme lus d’un coup.
La méthode est publique : scripts, configuration, scénarios et résultats bruts sont dans le dépôt stalwartlabs/benchmarks, avec une liste franche de réserves — notamment les différences de comportement de synchronisation disque entre les deux systèmes.
Ce que coûte la migration
La stabilité du schéma a un prix, payé une seule fois : Stalwart v1.0 utilise un nouveau format de base de données, et un serveur 1.0 n’ouvre pas un stock créé par une version antérieure. Deux chemins existent :
- stalwart-migrate, pour les déploiements en v0.16 (préalable : être en v0.16.27). L’outil convertit la configuration et copie les données dans un nouveau stock 1.0 vide, de façon incrémentale : la première copie tourne pendant que v0.16 continue de servir, et seule la dernière passe, très courte, impose un arrêt. Les identifiants de comptes, les UID IMAP et l’historique sont préservés, donc les clients ne retéléchargent rien.
- Le proxy de migration et Vandelay, pour les versions v0.15 et antérieures, ou pour migrer depuis Dovecot et Postfix : un proxy place les utilisateurs un par un sur l’ancien ou le nouveau serveur, sans coupure pour chacun.
Deux changements demandent une attention avant de migrer : les clusters exigent désormais Redis (le repli sur le data store, trop lent sous charge, a été retiré), et OAuth suit désormais le profil client public ouvert — un point à vérifier si vous dépendez d’un fournisseur d’identité externe. La version ajoute aussi une signature DKIM2 post-quantique (ML-DSA-44 + Ed25519) et l’indexation du texte des PDF et documents bureautiques joints.
# Déployer Stalwart v1.0 en un seul conteneur (Docker) :
docker run -d --name stalwart \
-p 25:25 -p 143:143 -p 443:443 -p 993:993 \
-v /opt/stalwart:/opt/stalwart \
ghcr.io/stalwartlabs/mail-server:v1.0.0
# Pour un cluster, ajouter un store en mémoire Redis (obligatoire en v1.0) :
# config : storage.in-memory = "redis" + URL du cluster Redis Des chiffres de laboratoire qui racontent la même histoire
Le banc d’essai interne — monté sur Microsoft Azure, plus de 30 régions, des centaines de vCPU en parallèle — a déjà payé. La première passe a trouvé 64 problèmes, la seconde 33 de plus, tous corrigés et re-testés. Quelques exemples : la réouverture d’une boîte de 5 millions de messages est passée de 61 ms à 0,21 ms ; une requête JMAP sur un compte de 5 millions de messages de 3,3 secondes à 12 ms ; et le débit entrant de pointe sur RocksDB a presque doublé, de 9 690 à 18 394 messages par seconde. Un problème de mémoire — le processus retenait jusqu’à 9,6 Gio alors que le tas réel faisait moins de 0,4 Gio — a été corrigé, et la mémoire reste stable sur des tests de six heures.
Le serveur propose six backends de stockage (RocksDB, PostgreSQL, MySQL, FoundationDB, SQLite) et, en édition Enterprise, des modèles d’IA et un classificateur antispam IA compatibles avec les API OpenAI, Anthropic, Gemini et Ollama. Le cœur reste libre et gratuit : la performance mesurée ne demande pas l’édition payante.
Verdict
Si vous démarrez un serveur de messagerie auto-hébergé aujourd’hui, évaluez Stalwart v1.0 avant de choisir la pile historique : sur une boîte unique, un seul conteneur remplace Postfix + Dovecot et leur attirail, avec un gain mesuré de 5,1 ms contre 28 ms sur une connexion TLS et une recherche plein texte 36 fois plus rapide sur grosse boîte. Si vous exploitez déjà une pile Postfix/Dovecot éprouvée, ne migrez pas pour les benchmarks : le coût réel est la migration de schéma et, en cluster, l’ajout de Redis — un effort qui ne se justifie que si la latence ou le débit vous coûtent concrètement. Et si vous tenez à l’auto-hébergement sur le long terme, pesez la dette de maintenance : un serveur en Rust, tout-en-un, avec un schéma désormais figé, promet des mises à niveau « installer et rien d’autre » que la pile fragmentée Postfix/Dovecot n’a jamais offertes. La performance fait le titre ; c’est la stabilité du schéma qui fait la promesse.