An XMPP server written in Go.
jackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simple configuration and low resource consumption.
jackal supports the following features:
- Enforced SSL/TLS
- Stream compression (zlib)
- Database connectivity for storing offline messages and user settings (BadgerDB, MySQL 5.7+, MariaDB 10.2+, PostgreSQL 9.5+)
- Cross-platform (OS X, Linux)
Support for XEP-0357: Push Notifications is not yet available in
However there's a chance to forward offline messages to some external service by configuring offline module as follows:
mod_offline: queue_size: 2500 gateway: type: http auth: a-secret-token-here pass: http://127.0.0.1:6666
Each time a message is sent to an offline user a
POST http request to the
pass URL is made, using the specified
Authorization header and including the message stanza into the request body.
To start using jackal, install Go 1.12+ and run the following commands:
$ go get -d github.com/ortuman/jackal $ cd $GOPATH/src/github.com/ortuman/jackal $ make install
This will retrieve the code and install the
jackal server application into your
By default the application will try to read server configuration from
/etc/jackal/jackal.yml file, but alternatively you can specify a custom configuration path from command line.
$ jackal --config=$GOPATH/src/github.com/ortuman/jackal/example.jackal.yml
MySQL database creation
Grant right to a dedicated 'jackal' user (replace
password with your desired password).
echo "GRANT ALL ON jackal.* TO 'jackal'@'localhost' IDENTIFIED BY 'password';" | mysql -h localhost -u root -p
Create 'jackal' database (using previously created password).
echo "CREATE DATABASE jackal;" | mysql -h localhost -u jackal -p
Download lastest version of the MySQL schema from jackal Github repository.
Load database schema into the database.
mysql -h localhost -D jackal -u jackal -p < mysql.up.sql
Your database is now ready to connect with jackal.
Create a user and a database for that user:
CREATE ROLE jackal WITH LOGIN PASSWORD 'password'; CREATE DATABASE jackal; GRANT ALL PRIVILEGES ON DATABASE jackal TO jackal;
Run the postgres script file to create database schema. In jackal's root directory run:
psql --user jackal --password -f sql/postgres.up.psql
Configure jackal to use PostgreSQL by editing the configuration file:
storage: type: pgsql pgsql: host: 127.0.0.1:5432 user: jackal password: password database: jackal
The purpose of clustering is to be able to use several servers for fault-tolerance and scalability.
jackal in clustering mode make sure to add a
cluster section configuration in each of the cluster nodes.
Here is an example of how this section should look like:
cluster: name: node1 port: 5010 hosts: [node2:5010, node3:5010]
Do not forget to include all cluster nodes, excluding the local one, in the
hosts array field. Otherwise the expected behavior will be undefined.
Run jackal in Docker
jackal in the cloud in under 5 minutes with zero knowledge of Golang or Linux shell using our jackal Docker image.
$ docker pull ortuman/jackal $ docker run --name jackal -p 5222:5222 ortuman/jackal
- RFC 6120: XMPP CORE
- RFC 6121: XMPP IM
- RFC 7395: XMPP Subprotocol for WebSocket
- XEP-0004: Data Forms 2.9
- XEP-0012: Last Activity 2.0
- XEP-0030: Service Discovery 2.5rc3
- XEP-0049: Private XML Storage 1.2
- XEP-0054: vcard-temp 1.2
- XEP-0077: In-Band Registration 2.4
- XEP-0092: Software Version 1.1
- XEP-0138: Stream Compression 2.0
- XEP-0160: Best Practices for Handling Offline Messages 1.0.1
- XEP-0191: Blocking Command 1.3
- XEP-0199: XMPP Ping 2.0
- XEP-0220: Server Dialback 1.1.1
- XEP-0237: Roster Versioning 1.3
Join and Contribute
The jackal developer community is vital to improving jackal future releases.
Contributions of all kinds are welcome: reporting issues, updating documentation, fixing bugs, improving unit tests, sharing ideas, and any other tips that may help the jackal community.
Code of Conduct
Help us keep jackal open and inclusive. Please read and follow our Code of Conduct.
jackal is licensed under the GNU General Public License, Version 3.0. See LICENSE for the full license text.
If you have any suggestion or question: