Git Product home page Git Product logo

simplexmq's Introduction

SimpleXMQ

GitHub build GitHub release

📢 v0.5.1 brings a hotfix to the server's subscription management logic, to apply it log in to your server via SSH and run the following command. If you have store log enabled for your server, information about already established queues will be preserved. If you're doing a custom installation instead of Linode or DigitalOcean you may have to change the path for binary download.

systemctl stop smp-server
curl -L -o /opt/simplex/bin/smp-server https://github.com/simplex-chat/simplexmq/releases/download/v0.5.1/smp-server-ubuntu-20_04-x86-64
systemctl start smp-server

Message broker for unidirectional (simplex) queues

SimpleXMQ is a message broker for managing message queues and sending messages over public network. It consists of SMP server, SMP client library and SMP agent that implement SMP protocol for client-server communication and SMP agent protocol to manage duplex connections via simplex queues on multiple SMP servers.

SMP protocol is inspired by Redis serialization protocol, but it is much simpler - it currently has only 8 client commands and 6 server responses.

SimpleXMQ is implemented in Haskell - it benefits from robust software transactional memory (STM) and concurrency primitives that Haskell provides.

SimpleXMQ roadmap

  • SMP queue redundancy and rotation in SMP agent duplex connections.
  • SMP agents synchronization to share connections and messages between multiple agents (it would allow using multiple devices for simplex-chat).
  • Streams - high performance message queues. See Streams RFC for details.

Components

SMP server

SMP server can be run on any Linux distribution without any dependencies. It uses in-memory persistence with an optional append-only log of created queues that allows to re-start the server without losing the connections. This log is compacted on every server restart, permanently removing suspended and removed queues.

To enable the queue logging, uncomment enable: on option in smp-server.ini configuration file that is created the first time the server is started.

On the first start the server generates an RSA key pair for encrypted transport handshake and outputs hash of the public key every time it runs - this hash should be used as part of the server address: <hostname>:5223#<key hash>.

SMP server implements SMP protocol.

Running SMP server on MacOS

SMP server requires OpenSSL library for initialization. On MacOS OpenSSL library may be replaced with LibreSSL, which doesn't support required algorithms. Before initializing SMP server verify you have OpenSSL installed:

openssl version

If it says "LibreSSL", please install original OpenSSL:

brew update
brew install openssl
echo 'PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zprofile # or follow whatever instructions brew suggests
. ~/.zprofile # or restart your terminal to start a new session

Now openssl version should be saying "OpenSSL". You can now run smp-server init to initialize your SMP server.

SMP client library

SMP client is a Haskell library to connect to SMP servers that allows to:

  • execute commands with a functional API.
  • receive messages and other notifications via STM queue.
  • automatically send keep-alive commands.

SMP agent

SMP agent library can be used to run SMP agent as part of another application and to communicate with the agent via STM queues, without serializing and parsing commands and responses.

Haskell type ACommand represents SMP agent protocol to communicate via STM queues.

See simplex-chat terminal UI for the example of integrating SMP agent into another application.

SMP agent executable can be used to run a standalone SMP agent process that implements plaintext SMP agent protocol via TCP port 5224, so it can be used via telnet. It can be deployed in private networks to share access to the connections between multiple applications and services.

Using SMP server and SMP agent

You can either run your own SMP server locally or deploy using Linode StackScript, or try local SMP agent with the deployed servers:

smp2.simplex.im#z5W2QLQ1Br3Yd6CoWg7bIq1bHdwK7Y8bEiEXBs/WfAg= (London, UK) smp3.simplex.im#nxc7HnrnM8dOKgkMp008ub/9o9LXJlxlMrMpR+mfMQw= (Fremont, CA)

It's the easiest to try SMP agent via a prototype simplex-chat terminal UI.

Linode

Deploy SMP server on Linode

* You can get Linode free credits to deploy SMP server.

Deployment on Linode is performed via StackScripts, which serve as recipes for Linode instances, also called Linodes. To deploy SMP server on Linode:

  • Create a Linode account or login with an already existing one.
  • Open SMP server StackScript and click "Deploy New Linode".
  • You can optionally configure the following parameters:
    • SMP Server store log flag for queue persistence on server restart (recommended).
    • Linode API token for attaching server info as tags to Linode (server address, public key hash, version) and adding A record to your 2nd level domain (Note: 2nd level e.g. example.com domain should be created in your account prior to deployment). The API token access scope should be read/write access to "linodes" (to update linode tags - you need them), and "domains" (to add A record for the 3rd level domain, e.g. smp).
    • Domain name to use instead of Linode ip address, e.g. smp.example.com.
  • Choose the region and plan according to your requirements (for regular use Shared CPU Nanode should be sufficient).
  • Provide ssh key to be able to connect to your Linode via ssh. This step is required if you haven't provided a Linode API token, because you will need to login to your Linode and get a public key hash either from the welcome message or from the file /etc/opt/simplex/pub_key_hash on your Linode after SMP server starts.
  • Deploy your Linode. After it starts wait for SMP server to start and for tags to appear (if a Linode API token was provided). It may take up to 5 minutes depending on the connection speed on the Linode. Connecting Linode IP address to provided domain name may take some additional time.
  • Get hostname and hash either from Linode tags (click on a tag and copy it's value from the browser search panel) or via ssh. Linode has a good guide about ssh.
  • Great, your own SMP server is ready! Use address#hash as SMP server address in the client.

Please submit an issue if any problems occur.

DigitalOcean

Deploy SMP server on DigitalOcean

* When creating a DigitalOcean account you can use this link to get free credits. (You would still be required either to provide your credit card details or make a confirmation pre-payment with PayPal)

To deploy SMP server use SimpleX Server 1-click app from DigitalOcean marketplace:

  • Create a DigitalOcean account or login with an already existing one.
  • Click 'Create SimpleX server Droplet' button.
  • Choose the region and plan according to your requirements (Basic plan should be sufficient).
  • Finalize Droplet creation.
  • Open "Console" on your Droplet management page to get SMP server fingerprint - either from the welcome message or from /etc/opt/simplex/fingerprint. Alternatively you can manually SSH to created Droplet, see instruction.
  • Great, your own SMP server is ready! Use ip_address#hash as SMP server address in the client.

Please submit an issue if any problems occur.

SMP server design

SMP server design

SMP agent design

SMP agent design

License

AGPL v3

simplexmq's People

Contributors

epoberezkin avatar markaleksanderh avatar space-d-n avatar spaced4ndy avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.