/MongooseIM

Jabber / XMPP server with focus on performance and scalability, by Erlang Solutions

Primary LanguageErlangOtherNOASSERTION

MongooseIM Build Status Documentation Status Coverage Status Buildtime trend GitHub release

============ <img align="left" src="doc/MongooseIM_logo.png"

MongooseIM is Erlang Solutions' robust and efficient XMPP server aimed at large installations. Specifically designed for enterprise purposes, it is fault-tolerant, can utilize resources of multiple clustered machines and easily scale in need of more capacity (by just adding a box/VM).

MongooseIM can accept client sessions over vanilla XMPP, Websockets, and HTTP long-polling (a.k.a. BOSH).

Its home on GitHub is at http://github.com/esl/MongooseIM.

The product page is available at https://www.erlang-solutions.com/products/mongooseim.html

Download packages

For a quick start just download the pre-built package that suits your platform: Ubuntu, Debian, CentOS, and Mac OS X.

An experimental Docker image exists on: https://registry.hub.docker.com/u/mongooseim/mongooseim-docker/ You can contribute on: https://github.com/ppikula/mongooseim-docker

Main differences from the parent project

This project began its life as a fork of ejabberd v.2.1.8 back in 2011, and later underwent some major cleanup, refactorization and optimization.

Major steps performed at that time:

  • bringing the project source tree to compliance with OTP project structure recommendations,
  • swapping autotools for the Erlang community-standard build tool rebar,
  • removal of obsolete and/or rarely used modules to reduce maintenance burden,
  • reduction of runtime memory consumption by refactoring the code to use Erlang's binary data type for string manipulation and storage instead of operating on linked lists of characters,
  • functional test coverage of the system according to corresponding RFCs and XEPs.

Key differences today:

  • massive scalability
  • code quality, through extensive refactoring, subtantial optimisations, and continuous integration
  • unique version, fully open source, fully open standards, innovations contributed to the XSF
  • professional support, and flexible customer service

Documentation

Up-to-date documentation for the MongooseIM master branch can be found on ReadTheDocs:

When developing new features/modules, please take care to add basic documentation to the doc/ directory, and add a link to your document in doc/README.md.

Original documentation for Ejabberd-2.1.8, from which MongooseIM was forked, is preserved in doc/ejabberd-2.1.8-OLD.

Features and supported standards

  • XMPP Core: RFC 3920, RFC 6120
  • Client connections over TCP (with TLS/STARTTLS available), Websockets, and HTTP(S) (BOSH).
  • Configurable database backends: MySQL, Postgres, generic ODBC. Mnesia and Redis for transient data.
  • Supports XEPs:
XEP-0012: Last Activity XEP-0016: Privacy Lists XEP-0018: Invisible Presence XEP-0022: Message Events
XEP-0023: Message Expiration XEP-0030: Service Discovery XEP-0045: Multi-User Chat XEP-0049: Private XML Storage
XEP-0050: Ad-Hoc Commands XEP-0054: vcard-temp XEP-0055: Jabber Search XEP-0059: Result Set Management
XEP-0060: Publish-Subscribe XEP-0068: Field Standardization for Data Forms XEP-0077: In-Band Registration XEP-0078: Non-SASL Authentication
XEP-0079: Advanced Message Processing XEP-0082: XMPP Date and Time Profiles XEP-0083: Nested Roster Groups XEP-0085: Chat State Notifications
XEP-0086: Error Condition Mappings XEP-0092: Software Version XEP-0093: Roster Item Exchange XEP-0114: Jabber Component Protocol
XEP-0115: Entity Capabilities XEP-0124: Bidirectional-streams Over Synchronous HTTP (BOSH) XEP-0126: Invisibility XEP-0138: Stream Compression
XEP-0157: Contact Addresses for XMPP Services XEP-0160: Best Practices for Handling Offline Messages XEP-0163: Personal Eventing Protocol XEP-0175: Best Practices for Use of SASL ANONYMOUS
XEP-0185: Dialback Key Generation and Validation XEP-0191: Blocking Command XEP-0198: Stream Management XEP-0199: XMPP Ping
XEP-0202: Entity Time XEP-0206: XMPP Over BOSH XEP-0212: XMPP Basic Server 2008 XEP-0237: Roster Versioning
XEP-0248: PubSub Collection Nodes XEP-0279: Server IP Check XEP-0280: Message Carbons XEP-0313: Message Archive Management
XEP-0313: Message Archive Management XEP-0313: Message Archive Management XEP-0313: Message Archive Management XEP-0352: Client State Indication

How to build

  1. Requirements.

    To compile MongooseIM you need:

    • GNU Make,
    • GCC,
    • Libexpat 1.95 or higher,
    • Erlang/OTP 17.5 or higher,
    • Reltool 0.6.6 or higher,
    • OpenSSL 0.9.8 or higher, for STARTTLS, SASL and SSL encryption,
    • Zlib 1.2.3 or higher for Stream Compression support (XEP-0138). Optional.
  2. Compiling on UNIX-like systems.

    To compile MongooseIM, go to the main repo directory $REPO and execute the command ($ stands for the shell prompt):

    $ make
    

    or

    $ ./rebar get-deps
    $ ./rebar compile
    

    To generate full MongooseIM release (with mysql, pgsql or other deps):

    $ make rel
    

    If more advanced release is required (with some specific db support only, f.e. mysql or pgsql) or you want to set prefix or user for the installation script please refer to the release configuration page in our documentation

    make rel commands will generate a self-contained OTP system image in the project's rel/mongooseim subdirectory. The contents of that directory are as follows:

    • rel/mongooseim/bin - startup/administration scripts,
    • rel/mongooseim/etc - configuration files,
    • rel/mongooseim/lib - MongooseIM binary, header and runtime files,
    • rel/mongooseim/var - spool directory,
    • rel/mongooseim/log - log file directory,
    • rel/mongooseim/releases - release files directory.
  3. Running MongooseIM.

    To run MongooseIM from the project tree after compiling it, change to $REPO/rel/mongooseim.

    There you can use the mongooseim command line administration script to start and stop MongooseIM. For example:

    $ bin/mongooseim start
    

    will start the server.

    You can also run the server in interactive mode:

    $ bin/mongooseim live
    

    There's also a tool called mongooseimctl allowing you to perform some operations on a running instance, e.g.:

    $ bin/mongooseimctl status
    MongooseIM node mongooseim@localhost:
      operating system pid: 86026
      Erlang VM status: started (of: starting | started | stopping)
      boot script status: started
      version: 1.6.2-61-g48b8332
      uptime: 1:12:46
      logs:
        log/ejabberd.log
    
  4. Building the testing target and running tests.

    For testing purposes there's a different make target available:

    $ make devrel
    

    which will generate releases in $REPO/dev/ and prepare them for testing and generating coverage reports.

    To run the tests (from project's root directory, i.e. $REPO):

    $ dev/mongooseim_node1/bin/mongooseim start
    $ dev/mongooseim_node2/bin/mongooseim start
    $ make quicktest
    

    The test results will show up in the console`.

Test suite

In order to test and validate your XMPP servers, here are useful tools:

  • escalus: Erlang XMPP client
  • amoc: a load testing tools

Public testing

Continuous integration: https://travis-ci.org/esl/MongooseIM

Code coverage: https://coveralls.io/github/esl/MongooseIM

Want to get in touch with us?

In case of any suggestions, questions or any thoughts on this project, please feel free to contact us by the standard GitHub ways or at mongoose-im@erlang-solutions.com.

Want to discuss MongooseIM, problems with your deployement or anything else? Try: https://erlangcentral.org/forum/mongooseim/.

Announcements mailing-list

We have set up a new public mailing-list for all announcements of major events happening on the MongooseIM front. Expect one or two emails per month, the archives are free and open. We highly encourage you to subscribe here: https://groups.google.com/d/forum/mongooseim-announce Click on the blue button "Join group", then click in "Email delivery preference" on "Notify me for every new message".

Client libraries

We recommend following client libraries: