An XMPP server written in Go (Golang).

jackal

An XMPP server written in Go.

Build Status GoDoc Test Coverage Maintainability Codacy Badge Go Report Card License Docker Pulls Join the chat at https://gitter.im/jackal-im/jackal

About

jackal is a free, open-source, high performance XMPP server which aims to be known for its stability, simple configuration and low resource consumption.

Features

jackal supports the following features:

  • Customizable
  • 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)

Installing

Getting Started

To start using jackal, install Go 1.13+ 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 $GOPATH/bin path.

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 "CREATE USER IF NOT EXISTS 'jackal'@'localhost' IDENTIFIED BY 'password';" | mysql -h localhost -u root -p
echo "GRANT ALL ON jackal.* TO 'jackal'@'localhost';" | 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.

wget https://raw.githubusercontent.com/ortuman/jackal/master/sql/mysql.up.sql

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.

Using PostgreSQL

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

That's it!

Push notifications

Support for XEP-0357: Push Notifications is not yet available in jackal.

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.

Run jackal in Docker

Set up 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

Supported Specifications

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.

Licensing

jackal is licensed under the GNU General Public License, Version 3.0. See LICENSE for the full license text.

Contact

If you have any suggestion or question:

Miguel Ángel Ortuño, JID: [email protected], email: [email protected]

Owner
Miguel Ángel Ortuño
Miguel Ángel Ortuño
Comments
  • Server does not send enough data per packet

    Server does not send enough data per packet

    testable on wormhole.chat

    There seems to be a bug in the way the server sends stanzas, often it sends only small parts of a stanza

    <
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    iq
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    type
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    result
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    id
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    72bfa1e8-7cfe-45ae-a9d8-bc25a6fd551b
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    from
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    [email protected]
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    to
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    ="
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    [email protected]/gajim.4JHK9BLI
    _____________
    
    16.03.2019 15:01:44 (I) nbxmpp.transports        | pollin called, state == CONNECTED
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout removed for fd 700
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 55 seconds
    16.03.2019 15:01:44 (I) nbxmpp.idlequeue         | read timeout set for fd 700 on 120 seconds with function <bound method NonBlockingTransport.read_timeout2 of <nbxmpp.transports.NonBlockingTCP object at 0x0000000009569390>>
    16.03.2019 15:01:44 (I) nbxmpp.client            | raising event from transport: :::::DATA RECEIVED::::
    _____________
    "
    _____________
    
  • error code 503 on sending the message

    error code 503 on sending the message

    This was spotted on Xabber client, when two buddies communicate. From certain point only one of them is able to send the messages , the other one is getting error and cannot send any more message. Subscription is both,both in the DB.

    error-503-red-cross.txt

    Still cannot reproduce what possibly could cause this issue.

  • XEP-0045 - Multi-User Chat support (#58)

    XEP-0045 - Multi-User Chat support (#58)

    Specification described in XEP-0045 Implementation notes:

    • no support for the legacy groupchat 1.0 protocol
    • no chat logging or chat history available on the server side
    • no explicit room nickname reservation or registering with a room (any occupant with affiliation is automatically registered and the nickname is reserved)
    • no timer for the instant room creation (client has to either explicitly create an instant room or create a reserved room)
    • no support for adding admins and owners through the room configuration form (it is messy and error prone)
  • Why Jackal? Why a new XMPP Server

    Why Jackal? Why a new XMPP Server

    Hello everyone, I am searching for a xmpp server for my new project. And I just want to know the reason why you decide to create a new XMPP server even if there are already good existing one. I am just starting with xmpp so I am not an expert.

    What is the advantage of Jackal in comparison to the others like ejabberd or openfire?

    Thanks in advance.

  • s2s lookup error

    s2s lookup error

    jackal can't find a server, even though dig shows it resolves correctly.

    2019-03-11 23:51:42 💥 [ERR] s2s/server:94 - lookup _xmpp-server._tcp.riotcat.org on 9.9.9.9:53: no such host
    
    # dig riotcat.org
    
    ; <<>> DiG 9.10.3-P4-Debian <<>> riotcat.org
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59702
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;riotcat.org.			IN	A
    
    ;; ANSWER SECTION:
    riotcat.org.		3586	IN	A	87.106.127.220
    
    ;; Query time: 0 msec
    ;; SERVER: 9.9.9.9#53(9.9.9.9)
    ;; WHEN: Mon Mar 11 23:52:57 UTC 2019
    ;; MSG SIZE  rcvd: 56
    

    The error is consistent, I can't get any kind of connection to that server at all.

    This isn't a global issue, I can successfully connect to other servers and send messages to users on them. According to compliance.conversations.im, the remote server is running Prosody 0.11.

    Then when I was checking logs for more errors, I found that a server I can successfully communicate on is also returning the same error occasionally (2019-03-12 01:54:52 💥 [ERR] s2s/server:94 - lookup _xmpp-server._tcp.chat.404.city on 9.9.9.9:53: no such host). The remote server with the intermittent error is running ejabberd 18.12.1-2~bpo9+1.

    Maybe it's something I can tweak in the config? s2s section of jackal.yml is the same as in the example:

    s2s:
        dial_timeout: 15
        dialback_secret: s3cr3tf0rd14lb4ck
        max_stanza_size: 131072
    
        transport:
          bind_addr: 0.0.0.0
          port: 5269
          keep_alive: 600
    
  • Failing build due to changed dependency

    Failing build due to changed dependency

    The build is currently failing due to a checksum mismatch:

    verifying github.com/jackal-xmpp/[email protected]: checksum mismatch
            downloaded: h1:xhx6XS5VLqgMQec0qp0yQE53+9dttsL7SjQKBXnJmcQ=
            go.sum:     h1:zwcW3PwR6uF9h52myAPNQt5YmbyuIpDvyDStUobclOc=
    
  • Please add SCRAM-SHA-512(-PLUS) again and there is the SCRAM-SHA3-512(-PLUS)

    Please add SCRAM-SHA-512(-PLUS) again and there is the SCRAM-SHA3-512(-PLUS)

    Following the removal of SCRAM-SHA-512(-PLUS), I request you the addition and there is SCRAM-SHA3-512(-PLUS) in the same time.

    SCRAM-SHA-512(-PLUS):

    • https://tools.ietf.org/html/draft-melnikov-scram-sha-512

    SCRAM-SHA3-512(-PLUS):

    • https://tools.ietf.org/html/draft-melnikov-scram-sha3-512
  • Support for PostgreSQL

    Support for PostgreSQL

    This makes jackal work with PostgreSQL, but it's far from perfect. It's a bunch of switch statements in places where database-specific queries are needed. While this should be ok-ish for now, I see a need for a bigger overhaul of the storage code to better support multiple database engines. I'd be happy to discuss and work on this some more.

  • Update the logo

    Update the logo

    I have seen a beautiful logo but the XMPP logo has been updated last year, can you update it too? https://github.com/ortuman/jackal/blob/master/doc/gopher.png

    Source: https://commons.wikimedia.org/wiki/File:XMPP_logo.svg

  • how to manage users from an external script ?

    how to manage users from an external script ?

    I would like to use an external server to provide authentication. Is there builtin support in jackal for any of these protocols? If not, has this been attempted before?

    If managing authentication externally is not feasible I was thinking of creating a php script exposing an HTTP API on the jackal server for the other server to manage users (create/disable/enable/set password).

    What is the best way to tackle this without heavy modifications to both systems?

    Thanks

  • Track dependencies with dep

    Track dependencies with dep

    Makes it easier for developers to get started, plus makes sure we're all working with the same version of every dependency.

    Simply use dep ensure when you pull in a change of Gopkg.lock.

  • Add development section to README

    Add development section to README

    Checklist
    • [x] documentation is changed or added

    Description of change

    Improved README adding a development section.

    The idea is to use this section to present knowledge helping user to contribute to the codebase.

  • Docker-compose doesn't work

    Docker-compose doesn't work

    • Version: 0.62.3
    • Platform: Ubuntu 20.04
    • Docker Version: 20.10.19
    • Docker-compose Version: 1.29.1

    docker-compose doesn't work out of the box.

    Running the command sudo docker-compose -f dockerfiles/docker-compose.yml up the jackal service fails to start with this log message

    jackal_1  | exec ./wait-for-it.sh: exec format error
    
  • Digging into logger configuration

    Digging into logger configuration

    • Version: 0.63.2

    The file config/example.config.yaml presents a section about logger

    #logger:
    #  level: "debug"
    #  output_path: "jackal.log"
    

    Looking the source code output_path configuration is not present.

    In the code the part about logger configuration is here https://github.com/ortuman/jackal/blob/4d04d68f95d1fa5191d50ccf8104bbab31d7103b/pkg/jackal/config.go#L45

    In detail this struct

    type LoggerConfig struct {
    	Level  string `fig:"level" default:"debug"`
    	Format string `fig:"format"`
    }
    

    and it defines a format field never used.

    Is this situation a typo? What the code should do ?

  • VoIP

    VoIP

    A VoIP feature would be very useful.

    Is your feature request related to a problem? Please describe. I am looking for a XMPP server in Go which has both instant messaging and VoIP feature to create a full scale communication app.

    Describe the solution you'd like A VoIP feature would be great. This would enable voice chatting on Jackal as well.

    Describe alternatives you've considered We could potentially try using SIP to handle all data transfer. And also add voice/video chat as well.

A push notification server written in Go (Golang).
A push notification server written in Go (Golang).

A push notification micro server using Gin framework written in Go (Golang)

Jan 9, 2023
Simple HTTP server written in golang

Simple HTTP server written in golang Simple webserver in golang, to demonstrate basic functionalities like e.g. sending back some request header info,

Aug 31, 2022
Go-simplehttp - Simple HTTP server written in golang

Simple HTTP server written in golang Simple webserver in golang, to demonstrate

Jan 1, 2022
a simple http server as replacement of python -m http.server

ser a simple http server as replacement of python -m http.server

Dec 5, 2022
OpenAPI specs for your Go server, generated at server runtime. No CLI, no code generation, and no HTTP

Overview "oas" is short for "OpenAPI Spec". Go package for generating OpenAPI docs at runtime. Non-features: No code generation. No CLI. No magic comm

Dec 3, 2021
A Language Server Protocol (LSP) server for Jsonnet

Jsonnet Language Server A Language Server Protocol (LSP) server for Jsonnet. Features Jump to definition self-support.mp4 dollar-support.mp4 Error/War

Dec 14, 2022
Go web server - A web server that can accept a GET request and serve a response.

go_web_server A web server that can accept a GET request and serve a response. Go is a great language for creating simple yet efficient web servers an

Jan 3, 2022
⚡ A fast, lightweight, and secure chat protocol, client and server, written in Go.

⚡ A fast, lightweight, and secure chat protocol, client and server, written in Go.

Oct 27, 2022
Minimal HTTP File Server for pentesting written in Go
Minimal HTTP File Server for pentesting written in Go

Golang implementation of simple HTTP server with upload feature.

Aug 4, 2022
Ciak is a lightweight media server written in go
 Ciak is a lightweight media server written in go

Ciak allows you to show and stream your personal media tv series, movies, etc with a simple and clean web ui. The server also provide on the fly video encoding in order to stream non standard formats such as avi, mkv...

Jan 3, 2023
A simple file server written in Go. Allows files to be uploaded, downloaded, or deleted.

Go File Server This is a simple file server written in Go. Have you ever wanted to transfer files between computers on the same LAN? Simply run this p

Jan 14, 2022
Opinionated boilerplate Golang HTTP server with CORS, OPA, Prometheus, rate-limiter for API and static website.
Opinionated boilerplate Golang HTTP server with CORS, OPA, Prometheus, rate-limiter for API and static website.

Teal.Finance/Server Opinionated boilerplate HTTP server with CORS, OPA, Prometheus, rate-limiter… for API and static website. Origin This library was

Nov 3, 2022
Golang U2F Server Implementation

U2F Server Implementation This repository implements a register and authenticate endpoint and provides frontend (JavaScript) code that demonstrates a

Nov 9, 2022
Simple Golang Product API Server

Simple Golang Product API Server Layanan API untuk menambah, merubah informasi, mengambil data dan menghapus produk. Implementasi kode terinspirasi ol

Nov 20, 2022
RBTI Golang Server uses PostgreSQL and for its main database and uses Elasticsearch

RBTI Golang Server This server is used for my thesis project, it uses PostgreSQL and for its main database and uses Elasticsearch for faster query spe

Jan 17, 2022
A very simple Golang server handling basic GET and POST requests

GOLANG SERVER INTRO As a true Blockchain enthusiast, I had to learn Solidity and Golang to participate to several projects. This repository consists o

Nov 17, 2021
Backend for Workery application server implemented in Golang

workery-server Backend for Workery application server implemented in Golang. This is a rewrite of the workery-django project. Development Goals: Rewri

Dec 14, 2022
A basic server built using golang.
A basic server built using golang.

Go Server A genral purpose server built using golang Go Server is a genral purpose server meant to be simple to use and begginner friendly. Currently

Dec 19, 2021