ejabberd

Robust, scalable XMPP messaging server

Matrix & XMPP ★ 6.7k stars Hard setup GPL-2.0

ejabberd is a robust and scalable XMPP server powering instant messaging, presence, and real-time communication. It targets operators running large messaging deployments. It is deployed via Docker or native packages.

Key features

  • Highly scalable XMPP server
  • Clustering support
  • Many extension modules
  • MQTT and SIP support

Pros & cons

Strengths

  • Extremely scalable
  • Battle-tested
  • Standards-based

Trade-offs

  • XMPP UX depends on clients
  • Advanced config is complex

ejabberd replaces

Last reviewed Sep 13, 2026 · 767 words

ejabberd is the XMPP server you run when a Prosody deployment would eventually need to become two Prosody deployments. For a family, a friend group or a 30-person community, Prosody or Snikket gives you the same modern-XMPP feature set with a tenth of the configuration surface. ejabberd's reason to exist is scale: clustering across nodes, an SQL backend, and a 20-year record of carrying millions of concurrent sessions. It will also run your 5-user server perfectly well; it just makes you learn more than you need to.

The ports and the one config file

Everything lives in ejabberd.yml. The listeners you care about are 5222 for clients, 5269 for federation with other servers, 5443 for HTTPS (file upload, BOSH and WebSocket, the admin console), 1883 if you turn on MQTT, and 3478 for the built-in STUN/TURN that voice and video calls need. The official ejabberd/ecs image puts the config at /home/ejabberd/conf/ejabberd.yml and the database under /home/ejabberd/database; mount both. Add your own account to the admin ACL in that file and the web admin console on port 5443 becomes usable for day-to-day tasks, though most people end up back at ejabberdctl. Creating the first account is one command:

docker exec -it ejabberd ejabberdctl register alice example.com 'a-long-passphrase'

DNS needs _xmpp-client._tcp and _xmpp-server._tcp SRV records pointing at your host, and the certificate has to cover the base domain plus the subdomains your modules use, typically conference. for group chats and upload. for files. ejabberd has ACME built in, so it can fetch and renew those certificates itself, which removes one of the classic XMPP setup failures.

Modern XMPP is a checklist, and the defaults pass it

An XMPP server from 2010 works with a 2026 client but feels broken: no message history across devices, no push notifications, no file sharing. The fix is a set of modules, and the default ejabberd.yml enables the important ones: mod_mam for archives, mod_carbons for multi-device sync, mod_stream_mgmt for flaky mobile connections, mod_http_upload for files, mod_push for iOS and Android notifications, mod_pubsub so that OMEMO encryption keys can be published, and mod_muc for rooms. Once deployed, run the public XMPP compliance tester against your domain; a fresh ejabberd scores at or near 100 percent, and the report tells you exactly which module to turn on if it does not.

The encrypted tag on the listing is accurate but needs a footnote: transport encryption is the server's job, and it does it. End-to-end encryption with OMEMO is entirely the client's job. Conversations on Android, Monal on iOS, and Gajim or Dino on the desktop all handle it, and which client your users pick shapes their experience far more than the server does.

Clustering is the reason to be here

A second ejabberd node joins the first with ejabberdctl join_cluster, after which sessions, rooms and routing are shared across both. This is what a community server with 10,000 accounts or a company that cannot tolerate a single box rebooting needs, and it is what Prosody does not offer. At that scale you also move off the built-in Mnesia store to PostgreSQL or MySQL, which ejabberd supports natively. Setting this up is where the Hard difficulty rating comes from: Erlang node names, cookies and network topology are unfamiliar to most self-hosters, and mistakes are quiet rather than loud.

MQTT in the same process

ejabberd includes an MQTT broker that shares the server's authentication and clustering. For a homelab that already runs an XMPP server, it means one fewer service under home automation; for anyone else it is a curiosity. It is also a hint at the project's shape: a general real-time messaging platform that happens to speak XMPP first, rather than a chat server.

What I'd do

If your user count has 2 digits, run Snikket, which is Prosody with the client apps, invitations and certificates already arranged, and you will have a working, encrypted, federated messenger in under an hour. If it has 4 digits, or you need a cluster, or you are replacing an internal messaging system for a company, run ejabberd from the official image with PostgreSQL behind it, verify with the compliance tester, and read the Matrix and XMPP category once to decide whether Synapse and Matrix fit your users better, since that decision is about which clients your people will tolerate, not about the server.

Compare ejabberd

27 head-to-head comparisons.

Similar matrix & xmpp apps