Mailcow vs Stalwart vs Mailu at 10,000 Mailboxes: What Holds Up in Production
Description and use
Stalwart was chosen for migrating 10,000 university mailboxes due to its JMAP support, external PostgreSQL and MinIO storage, and clustering capabilities. The configuration model changed in v0.16, requiring a datastore JSON file and database‑based settings.
Problem
Migrating a university email system to 10,000 mailboxes while ensuring high availability, scalability, and manageable administration.
Outcome
Stalwart provided a scalable, cluster‑ready mail solution that met the university’s 10,000‑mailbox requirement, with external PostgreSQL and MinIO storage, JMAP support, and manageable administration via web UI and API.
Workflow
- 1. Evaluate each candidate based on documentation and production experience.
- 2. Choose Stalwart for its Rust binary, JMAP support, and clustering model.
- 3. Configure PostgreSQL for metadata and MinIO for message blobs.
- 4. Replace the old config.toml with a datastore JSON file and use the web admin/API for settings.
- 5. Set up NATS for inter‑node coordination and HAProxy as a front‑end.
- 6. Create a shared PostgreSQL replica and MinIO distributed mode for redundancy.
- 7. Import accounts from LDAP/AD and migrate mail with imapsync, calendars and contacts with a custom script.
- 8. Apply per‑user send‑rate limits via webmail layer and reverse proxy.
- 9. Test failover by shutting down a node and verifying continuity.
- 10. Monitor performance and adjust resources as needed.
Evidence
We run Stalwart for a university with 10,000 mailboxes
Stalwart is a single binary written in Rust that speaks every mail and groupware protocol itself
We keep metadata and settings in PostgreSQL and message blobs in S3-compatible object storage (MinIO)
Version 0.16 changed the configuration model. There's no big config.toml anymore
We wanted a server‑side send rate limit per user, so a compromised account talking raw SMTP couldn't blast out mail
- Record date: 2026-10-08T13:40:54.029Z