{"id":13393709,"url":"https://github.com/ortuman/jackal","last_synced_at":"2025-09-29T15:31:56.339Z","repository":{"id":38713305,"uuid":"110584282","full_name":"ortuman/jackal","owner":"ortuman","description":"💬 Instant messaging server for the Extensible Messaging and Presence Protocol (XMPP).","archived":true,"fork":false,"pushed_at":"2023-07-19T09:53:21.000Z","size":1679,"stargazers_count":1437,"open_issues_count":20,"forks_count":130,"subscribers_count":39,"default_branch":"main","last_synced_at":"2024-11-13T13:16:14.111Z","etag":null,"topics":["chat","go","golang","golang-server","iot","jabber","jabber-server","jackal","jackal-community","messaging","xmpp","xmpp-server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ortuman.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":"ortuman","patreon":"ortuman"}},"created_at":"2017-11-13T18:17:48.000Z","updated_at":"2024-11-06T11:54:33.000Z","dependencies_parsed_at":"2023-02-12T22:16:51.032Z","dependency_job_id":"691c0336-2116-4000-a372-b26ed81ec118","html_url":"https://github.com/ortuman/jackal","commit_stats":{"total_commits":135,"total_committers":5,"mean_commits":27.0,"dds":"0.051851851851851816","last_synced_commit":"142df3986439073313621b3cea164468ef9dff93"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ortuman%2Fjackal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ortuman%2Fjackal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ortuman%2Fjackal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ortuman%2Fjackal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ortuman","download_url":"https://codeload.github.com/ortuman/jackal/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234635462,"owners_count":18864089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chat","go","golang","golang-server","iot","jabber","jabber-server","jackal","jackal-community","messaging","xmpp","xmpp-server"],"created_at":"2024-07-30T17:00:59.042Z","updated_at":"2025-09-29T15:31:55.461Z","avatar_url":"https://github.com/ortuman.png","language":"Go","readme":"# jackal\n\nAn XMPP server written in Go.\n\n![CI Status](https://github.com/ortuman/jackal/workflows/CI/badge.svg)\n[![Go Report Card](https://goreportcard.com/badge/github.com/ortuman/jackal?style=flat-square)](https://goreportcard.com/report/github.com/ortuman/jackal)\n[![Godoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](https://godoc.org/github.com/ortuman/jackal)\n[![Releases](https://img.shields.io/github/release/ortuman/jackal/all.svg?style=flat-square)](https://github.com/ortuman/jackal/releases)\n[![LICENSE](https://img.shields.io/github/license/ortuman/jackal.svg?style=flat-square)](https://github.com/ortuman/jackal/blob/master/LICENSE)\n[![Docker Pulls](https://img.shields.io/docker/pulls/ortuman/jackal.svg)](https://hub.docker.com/r/ortuman/jackal/)\n[![Join the chat at https://gitter.im/jackal-im/jackal](https://badges.gitter.im/jackal-im/jackal.svg)](https://gitter.im/jackal-im/jackal?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"#\"\u003e\n        \u003cimg src=\"./logos/logo-0.png\"\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n## About\n\njackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simple configuration and low resource consumption.\n\n## Features\n\njackal supports the following features:\n\n- Customizable\n- Enforced SSL/TLS\n- Stream compression (zlib)\n- Database connectivity for storing offline messages and user settings (PostgreSQL 9.5+, BoltDB)\n- Caching (Redis 6.2+)\n- Clustering capabilities (etcd 3.4+)\n- Expose [prometheus](https://prometheus.io/) metrics\n- Cross-platform (OS X, Linux)\n\n## Installing\n\n### Getting Started\n\nTo start using jackal, install Go 1.19+ and run the following commands:\n\n```bash\n$ git clone git@github.com:ortuman/jackal.git\n$ cd jackal\n$ make install installctl\n```\n\nThis will fetch the code and install `jackal` and `jackalctl` binaries into your `$GOPATH/bin` path.\n\nBy default the application will try to locate service configuration at `config.yaml`, but alternatively you can specify a custom configuration path either through command line.\n\n```sh\n$ jackal --config=/your-custom-path/your-config.yaml\n```\n\nor environment variable:\n\n```sh\n$ env JACKAL_CONFIG_FILE=/your-custom-path/your-config.yaml jackal\n```\n\n### Helm chart\n\nTo make it easy to install jackal via Helm in Kubernetes a chart has been included into this repository.\u003cbr/\u003e \n\nAfter customizing your own [values.yaml](helm/values.yaml) file run the following command to install and configure all required components under `jackal` namespace.   \n\n```sh\nsh ./helm/scripts/install.sh \u003cyour_custom_values\u003e.yaml\n```\n\nIn turn, an active chart can be updated by running the upgrade script as follows:\n\n```sh\nsh ./helm/scripts/upgrade.sh \u003cyour_custom_values\u003e.yaml\n```\n\nOn the other hand, you can also remove the jackal chart from your Kubernetes cluster by running the uninstall script: \n\n```sh\nsh ./helm/scripts/uninstall.sh\n```\n\n### PostgreSQL database creation\n\nCreate a user and a database for that user:\n\n```sql\nCREATE ROLE jackal WITH LOGIN PASSWORD 'password';\nCREATE DATABASE jackal;\nGRANT ALL PRIVILEGES ON DATABASE jackal TO jackal;\n```\n\nDownload lastest version of the [PostgreSQL schema](sql/postgres.up.psql) from jackal Github repository.\n\n```sh\nwget https://raw.githubusercontent.com/ortuman/jackal/master/sql/postgres.up.psql\n```\n\nRun the postgres script file to create database schema:\n\n```sh\npsql --user jackal --password -f sql/postgres.up.psql\n```\n\nConfigure jackal to use PostgreSQL by editing the configuration file:\n\n```yaml\nstorage:\n  type: pgsql\n  pgsql:\n    host: 127.0.0.1:5432\n    user: jackal\n    password: password\n    database: jackal\n```\n\nThat's it!\n\nYour database is now ready to connect with jackal.\n\n### Creating jackal user\n\nAfter completing database setup and starting `jackal` service you'll have to register a new user to be able to login. To do so, you can use\njackal command-line tool to create a new user proving name and password.\n\n```sh\nmake installctl \u0026\u0026 jackalctl user add \u003cuser\u003e:\u003cpassword\u003e\n```\n\n## Clustering\n\nThe purpose of clustering is to be able to use several servers for fault-tolerance and scalability.\n\nSince `jackal` is a distributed system, it needs a distributed data store like [etcd](https://etcd.io/) to share its state across the entire cluster.\n\nTo properly run `jackal` in clustering mode make sure to add a `cluster` section configuration in each of your service nodes.\n\nHere's an example of how this section should look like:\n\n```yaml\ncluster:\n  type: kv\n  kv:\n    type: etcd\n    etcd:\n      endpoints:\n        - http://\u003cetcd-host1\u003e:\u003cetcd-port1\u003e\n        - http://\u003cetcd-host2\u003e:\u003cetcd-port2\u003e\n        ...\n  port: your-cluster-node-port # default is 14369\n```\n\nNote the defined `port` value will be used to perform cluster node communication, so make sure is reachable within your internal network.\n\n## Server extensibility\n\nThe purpose of the extensibility framework is to provide an interface between jackal server and third-party external modules, thus offering the possibility of extending the functionality of the service for particular use cases.\nExtensibility [gRPC](https://grpc.io/) API proto files can be found at jackal [proto definitions repository](https://github.com/jackal-xmpp/jackal-proto).\n\n* [Authenticators](https://github.com/jackal-xmpp/jackal-proto/blob/master/jackal/proto/authenticator/v1/authenticator.proto#L24-L27)\n* [Components](https://xmpp.org/extensions/xep-0114.html)\n\n## Run jackal in Docker\n\nThe Docker deployment framework supports easy installation and configuration of jackal server.\n\nYou need to have Docker installed on your system before you can use a jackal Docker image. See [Install Docker](https://docs.docker.com/engine/install/) for instructions.\n\nDownload the jackal Docker image from the official Docker Hub library with this command:\n\n```sh\ndocker pull ortuman/jackal:latest\n```\n\nStart a new jackal Docker container with custom configuration.\n\n```sh\ndocker run --name=jackal \\\n   --mount type=bind,src=/path-on-host-machine/my-custom-config.yaml,dst=/jackal/config.yaml \\\n   -p \"5222:5222\" \\\n   -p \"15280:15280\" \\  # used by jackalctl\n   -d ortuman/jackal:latest\n```\n\n### Docker compose\n\nAlternatively, and with the purpose of facilitating service mounting, you can make use of `docker-compose` as follows:\n\n```sh\ndocker-compose -f dockerfiles/docker-compose.yml up\n```\n\nThis command will spin up a `jackal` server along with its dependencies on a docker network and start listening for incoming connections on port `5222`.\n\nOnce up and running, don't forget to [register one or more users](#creating-jackal-user) using `jackalctl`.\n\n## Supported Specifications\n- [RFC 6120: XMPP CORE](https://xmpp.org/rfcs/rfc6120.html)\n- [RFC 6121: XMPP IM](https://xmpp.org/rfcs/rfc6121.html)\n- [XEP-0004: Data Forms](https://xmpp.org/extensions/xep-0004.html) *2.9*\n- [XEP-0012: Last Activity](https://xmpp.org/extensions/xep-0012.html) *2.0*  \n- [XEP-0030: Service Discovery](https://xmpp.org/extensions/xep-0030.html) *2.5rc3*\n- [XEP-0049: Private XML Storage](https://xmpp.org/extensions/xep-0049.html) *1.2*\n- [XEP-0054: vcard-temp](https://xmpp.org/extensions/xep-0054.html) *1.2*\n- [XEP-0059: Result Set Management](https://xmpp.org/extensions/xep-0059.html) *1.0*\n- [XEP-0092: Software Version](https://xmpp.org/extensions/xep-0092.html) *1.1*\n- [XEP-0114: Jabber Component Protocol](https://xmpp.org/extensions/xep-0114.html) *1.6*  \n- [XEP-0115: Entity Capabilities](https://xmpp.org/extensions/xep-0115.html) *1.5.2*\n- [XEP-0122: Data Forms Validation](https://xmpp.org/extensions/xep-0122.html) *1.0.2*\n- [XEP-0138: Stream Compression](https://xmpp.org/extensions/xep-0138.html) *2.0*\n- [XEP-0160: Best Practices for Handling Offline Messages](https://xmpp.org/extensions/xep-0160.html) *1.0.1*\n- [XEP-0190: Best Practice for Closing Idle Streams](https://xmpp.org/extensions/xep-0190.html) *1.1*\n- [XEP-0191: Blocking Command](https://xmpp.org/extensions/xep-0191.html) *1.3*\n- [XEP-0198: Stream Management](https://xmpp.org/extensions/xep-0198.html) *1.6*  \n- [XEP-0199: XMPP Ping](https://xmpp.org/extensions/xep-0199.html) *2.0*\n- [XEP-0202: Entity Time](https://xmpp.org/extensions/xep-0202.html) *2.0*  \n- [XEP-0220: Server Dialback](https://xmpp.org/extensions/xep-0220.html) *1.1.1*\n- [XEP-0237: Roster Versioning](https://xmpp.org/extensions/xep-0237.html) *1.3*\n- [XEP-0280: Message Carbons](https://xmpp.org/extensions/xep-0280.html) *0.13.3*\n- [XEP-0297: Stanza Forwarding](https://xmpp.org/extensions/xep-0297.html) *1.0*\n- [XEP-0313: Message Archive Management](https://xmpp.org/extensions/xep-0313.html) *1.0.1*\n- [XEP-0368: SRV records for XMPP over TLS](https://xmpp.org/extensions/xep-0368.html) *1.1.0*\n\n## Join and Contribute\n\nThe [jackal developer community](https://gitter.im/jackal-im/jackal?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=readme.md) is vital to improving jackal future releases.\n\nContributions 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.\n\n## Code of Conduct\n\nHelp us keep jackal open and inclusive. Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md).\n\n## Licensing\n\njackal is licensed under the Apache 2 License. See\n[LICENSE](https://github.com/ortuman/jackal/blob/master/LICENSE) for the full\nlicense text.\n\n## Contact\n\nIf you have any suggestion or question:\n\nMiguel Ángel Ortuño, JID: ortuman@jackal.im, email: \u003cortuman@pm.me\u003e\n","funding_links":["https://github.com/sponsors/ortuman","https://patreon.com/ortuman"],"categories":["Software","Server Applications","Go","服务器应用程序","服务端应用","Repositories","Relational Databases"],"sub_categories":["Communication - XMPP - Servers","HTTP Clients","Advanced Console UIs","HTTP客户端","查询语","交流"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fortuman%2Fjackal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fortuman%2Fjackal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fortuman%2Fjackal/lists"}