Running Multiple Instances
While it's possible to scale up by adding more servers (recommended for HA purposes), you can better utilize your existing hardware by running multiple instances of the Rocket.Chat application (Node.js/Meteor app) on your current host(s). You should only do this if you already use a multi-core computer. A reasonable rule of thumb may be to run N-1
Rocket.Chat instances, where N=num_cores
. Running multiple instances of Rocket.Chat on a single host requires a reverse proxy before your application. This tutorial assumes you've already followed the instructions for running behind an Nginx SSL Reverse Proxy.
Essentially, there are just three steps:
Start multiple instances of Rocket.Chat bound to different ports.
Update your proxy to point at all local Rocket.Chat instances.
In the examples, we'll be using Nginx. However, you can use other reverse proxies.
Run multiple instances of Rocket.Chat
Configure Rocket.Chat to run as a systemd service. Since you want to run multiple instances simultaneously, you must run at least two services. The only difference is the service name and port. If you don't have a service yet, the easiest way to do this for Rocket.Chat is to create a file in
/usr/lib/systemd/system/
and call itrocketchat.service
Ensure the User and Group exist, and both have
read/write/execute permissions
forrocketchat
. Now you can start, stop, restart, and see the status of yourrocketchat
service. If you want multiple services, create another file in/usr/lib/systemd/system
and call itrocketchat@.service
updating the content with the these data:
Start the other Rocket.Chat services.
systemctl start rocketchat@3001
You can use any desired port instead of 3001
.
To run Rocket.Chat during boot; use the command below to enable the services:
systemctl enable rocketchat or systemctl enable rocketchat@3001
Ensure nodes can communicate
If you run Rocket.Chat instances on multiple physical nodes or containers, ensure they can communicate with each other. This means that instead of relying on a central server, the instances directly interact with one another. Rocket.Chat uses a peer-to-peer connection to inform each other of events. This becomes especially important when certain events occur that require cross-instance notification.
For example, when you type a message and tag a friend or coworker connected to another instance. Two different events are fired; the user (you) is typing and notifying the user (friend).
When you set up a Rocket.Chat instance, it registers its IP address in your database. Other instances use this list to discover each other and establish connections. If you are having trouble getting two instances to communicate, you can set the INSTANCE_IP
environment variable in the .env
file to the IP address that the other instances can use to talk to it.
Update your Nginx proxy config
Edit /etc/nginx/sites-enabled/default
or /etc/nginx/conf.d/default.conf
( if you use nginx from docker) and replace the sample hostname "your_hostname.com" with your actual hostname. You need to set up a backend if one doesn't already exist and add all local Rocket.Chat instances to it. Then swap out the host listed in the proxy section for the backend you defined with no port.
Now, update the Nginx config to point to the two Rocket.Chat instances that started running on ports
3001
and3002
.
Replace
proxy_pass http://IP:3000/;
withproxy_pass http://backend;
. Updating the sample Nginx configuration would result in a config like this:
Restart Nginx.
service nginx restart
Update your Apache proxy config
Run this as a root user to enable the necessary modules to use the proxy balancer.
Edit /etc/apache2/sites-enabled/rocketchat.conf
and confirm that your hostname has been updated.
Restart Apache.
systemctl restart apache2.service
Visit
https://your_hostname.com
and confirm the updates.
To prove you're using both services as you'd expect, you can stop one Rocket.Chat service at a time and ensure that the chat still works. Restart that service and stop the other. That will show you are using both instances. Be sure to maintain time in sync between all instances.
Check your database
The database is another vital part of this setup. First, you must ensure you are running a replicaset. It is essential due to the following reasons:
Database reliability: Confirm that your data is replicated and you have another node if something happens to your primary.
Oplog Tailing: The oplog is turned on when you set up a replicaset. Mongo uses this to publish events so the other nodes in the replicaset can ensure its data is updated. Rocket.Chat uses this to watch for database events. If someone sends a message on Instance 1 and you are connected to Instance 2. Instance 2 watches for message insert events, showing you a new message has arrived.
Last updated