# Howto deploy a (room based) load balanced cluster

This example will show how to setup an HA proxy to provide load balancing between several
multiparty-meeting servers.

## IP and DNS

In this basic example we use the following names and ips:

### Backend

* `mm1.example.com` <=> `192.0.2.1`
* `mm2.example.com` <=> `192.0.2.2`
* `mm3.example.com` <=> `192.0.2.3`

### Redis

* `redis.example.com` <=> `192.0.2.4`

### Load balancer HAproxy

* `meet.example.com` <=> `192.0.2.5`

## Deploy multiple multiparty-meeting servers

This is most easily done using Ansible (see below), but can be done
in any way you choose (manual, Docker, Ansible).

Read more here: [mm-ansible](https://github.com/misi/mm-ansible)
[![asciicast](https://asciinema.org/a/311365.svg)](https://asciinema.org/a/311365)

## Setup Redis for central HTTP session store

### Use one Redis for all multiparty-meeting servers

* Deploy a Redis cluster for all instances.
  * We will use in our actual example `192.0.2.4` as redis HA cluster ip. It is out of scope howto deploy it.

OR

* For testing you can use Redis from one the multiparty-meeting servers. e.g. If you plan only for testing on your first multiparty-meeting server.
  * Configure Redis `redis.conf` to not only bind to your loopback but also to your global ip address too:

    ``` plaintext
    bind 192.0.2.1
    ```

    This example sets this to `192.0.2.1`, change this according to your local installation.

  * Change your firewall config to allow incoming Redis. Example (depends on the type of firewall):

    ``` plaintext
        chain INPUT {
            policy DROP;

            saddr mm2.example.com proto tcp dport 6379 ACCEPT;
            saddr mm3.example.com proto tcp dport 6379 ACCEPT;
        }
    ```

  * **Set a password, or if you don't (like in this basic example) take care to set strict firewall rules**

## Configure multiparty-meeting servers

### Server config

mm/configs/server/config.js

``` js
redisOptions : { host: '192.0.2.4'},
listeningPort: 80,
httpOnly: true,
trustProxy           : ['192.0.2.5'],
```

## Deploy HA proxy

* Configure certificate / letsencrypt for `meet.example.com`
  * In this example we put a complete chain and private key in /root/certificate.pem.
* Install and setup haproxy

  `apt install haproxy`

* Add to /etc/haproxy/haproxy.cfg config

  ``` plaintext
    backend multipartymeeting
        balance url_param roomId
        hash-type consistent

        server mm1 192.0.2.1:80 check maxconn 20 verify none
        server mm2 192.0.2.2:80 check maxconn 20 verify none
        server mm3 192.0.2.3:80 check maxconn 20 verify none

    frontend meet.example.com
        bind 192.0.2.5:80
        bind 192.0.2.5:443 ssl crt /root/certificate.pem
        http-request redirect scheme https unless { ssl_fc }
        reqadd X-Forwarded-Proto:\ https
        default_backend multipartymeeting
  ```
