How to Self-Host Rocket.Chat: Open Source Team Communication 2026
TL;DR
Rocket.Chat (MIT, ~40K GitHub stars, TypeScript) is the most feature-rich self-hosted team communication platform. Beyond Slack-like channels and DMs, Rocket.Chat adds omnichannel — receive and respond to customers via live chat, email, WhatsApp, and Telegram all from one inbox. It also supports voice/video calls (Jitsi/BigBlueButton), federation with other Rocket.Chat instances, and E2E encrypted rooms. For customer support teams who want an all-in-one platform, Rocket.Chat is unmatched in open source.
Key Takeaways
- Rocket.Chat: MIT, ~40K stars, TypeScript — team chat + customer omnichannel in one
- Omnichannel: Live chat widget, email, WhatsApp, Telegram in a unified inbox
- Voice/video: Built-in via Jitsi Meet (self-hosted) or BigBlueButton
- Federation: Matrix protocol federation with other Rocket.Chat and Matrix servers
- E2E encryption: End-to-end encrypted rooms for sensitive communications
- vs Mattermost: Rocket.Chat wins on features; Mattermost is lighter and simpler
Rocket.Chat vs Mattermost vs Slack
| Feature | Rocket.Chat | Mattermost | Slack |
|---|---|---|---|
| License | MIT | MIT | Proprietary |
| GitHub Stars | ~40K | ~31K | — |
| Cost (self-hosted) | Free | Free | $7.25/user/mo |
| Omnichannel | Yes | No | No |
| Video calls | Yes (Jitsi/BBB) | Paid | Yes |
| E2E encryption | Yes | Paid | No |
| Matrix federation | Yes | No | No |
| Mobile apps | Yes | Yes | Yes |
| RAM usage | ~500MB+ | ~200MB | — |
| Setup complexity | High | Medium | Low |
Part 1: Docker Setup
# docker-compose.yml
services:
rocketchat:
image: registry.rocket.chat/rocketchat/rocket.chat:latest
container_name: rocketchat
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- rocketchat_uploads:/app/uploads
environment:
MONGO_URL: "mongodb://mongo:27017/rocketchat"
MONGO_OPLOG_URL: "mongodb://mongo:27017/local"
ROOT_URL: "https://chat.yourdomain.com"
PORT: 3000
DEPLOY_PLATFORM: "docker"
# Optional: admin setup
ADMIN_USERNAME: "admin"
ADMIN_PASS: "${ADMIN_PASSWORD}"
ADMIN_EMAIL: "${ADMIN_EMAIL}"
# Email:
SMTP_HOST: "smtp.yourdomain.com"
SMTP_PORT: 587
SMTP_USERNAME: "${SMTP_USER}"
SMTP_PASSWORD: "${SMTP_PASS}"
SMTP_From: "chat@yourdomain.com"
depends_on:
- mongo
mongo:
image: mongo:6.0
container_name: rocketchat_mongo
restart: unless-stopped
volumes:
- mongo_data:/data/db
command: >
bash -c "mongod --oplogSize 128 --replSet rs0 --storageEngine=wiredTiger"
mongo-init-replica:
image: mongo:6.0
command: >
bash -c "sleep 10 && mongosh mongo/rocketchat --eval \"rs.initiate({ _id: 'rs0', members: [{ _id: 0, host: 'mongo:27017' }]})\""
depends_on:
- mongo
volumes:
rocketchat_uploads:
mongo_data:
# .env
ADMIN_PASSWORD=your-admin-password
ADMIN_EMAIL=admin@yourdomain.com
docker compose up -d
Visit http://your-server:3000 → complete setup wizard.
Part 2: HTTPS with Caddy
chat.yourdomain.com {
reverse_proxy localhost:3000
}
Part 3: Omnichannel Setup
Rocket.Chat Omnichannel unifies customer communication:
Live Chat Widget
- Omnichannel → Configuration → Livechat
- Enable Livechat
- Omnichannel → Livechat → Installation → copy the embed code:
<!-- Add to your website: -->
<script type="text/javascript">
(function(w, d, s, u) {
w.RocketChat = function(c) { w.RocketChat._.push(c) };
w.RocketChat._ = [];
w.RocketChat.url = u;
var h = d.getElementsByTagName(s)[0],
j = d.createElement(s);
j.async = true;
j.src = u + '/livechat/rocketchat-livechat.min.js?_=201903270000';
h.parentNode.insertBefore(j, h);
})(window, document, 'script', 'https://chat.yourdomain.com');
</script>
Visitors see a chat widget. Agents receive chats in the Omnichannel inbox.
Departments
Route incoming chats to specific teams:
- Omnichannel → Departments → + New Department
- Name:
Sales,Support,Technical - Assign agents to each department
- Set routing policy (round-robin, load balanced, etc.)
Part 4: Video Calls with Jitsi
Integrate Jitsi Meet for voice/video:
# Admin → Administration → Video Conference → Jitsi
- Admin Panel → Video Conference → Jitsi
- Enable Jitsi
- Jitsi Domain:
jitsi.yourdomain.com(or usemeet.jit.sifor quick setup) - Click camera icon in any channel to start a video call
Part 5: Matrix Federation
Rocket.Chat supports Matrix protocol for cross-platform federation:
- Admin Panel → Federation → Matrix
- Enable Matrix
- Server name:
yourdomain.com - Home Server URL:
https://chat.yourdomain.com - Configure a Matrix homeserver (Synapse) if federating externally
# Test federation:
# In Rocket.Chat, invite a Matrix user by their MXID:
# @user:matrix.org
Part 6: Incoming Webhooks and Bots
# Create integration:
# Admin → Integrations → New Integration → Incoming WebHook
# Channel: #deployments
# Copy webhook URL
# Send message:
curl -X POST https://chat.yourdomain.com/hooks/YOUR-TOKEN \
-H "Content-Type: application/json" \
-d '{
"text": "Build complete",
"username": "ci-bot",
"icon_emoji": ":white_check_mark:",
"attachments": [{
"color": "#36a64f",
"title": "Deployment successful",
"fields": [
{"title": "Environment", "value": "production", "short": true},
{"title": "Version", "value": "v2.4.1", "short": true}
]
}]
}'
REST API bot
import requests
BASE = "https://chat.yourdomain.com/api/v1"
# Login:
resp = requests.post(f"{BASE}/login",
json={"user": "bot", "password": "botpassword"})
token = resp.json()["data"]["authToken"]
user_id = resp.json()["data"]["userId"]
headers = {"X-Auth-Token": token, "X-User-Id": user_id}
# Send a message:
requests.post(f"{BASE}/chat.postMessage", headers=headers,
json={"roomId": "GENERAL", "text": "Hello from Python!"})
# Get messages from a channel:
msgs = requests.get(f"{BASE}/channels.messages",
headers=headers, params={"roomId": "GENERAL", "count": 10})
Part 7: E2E Encryption
Enable end-to-end encryption for sensitive rooms:
- Admin → E2E Encryption → Enable E2E
- Users enable E2E for specific rooms: Room → Room Info → Enable E2E Encryption
- Each user generates their own key pair (stored encrypted in browser)
- Messages are encrypted client-side — server never sees plaintext
Note: E2E breaks search, notifications on locked devices, and message export. Use selectively for sensitive channels.
Part 8: Scaling with Multiple Instances
For larger teams (500+ users), run multiple Rocket.Chat instances:
services:
rocketchat-1:
image: registry.rocket.chat/rocketchat/rocket.chat:latest
environment:
MONGO_URL: "mongodb://mongo:27017/rocketchat"
MONGO_OPLOG_URL: "mongodb://mongo:27017/local"
# (same config as single instance)
rocketchat-2:
image: registry.rocket.chat/rocketchat/rocket.chat:latest
environment:
MONGO_URL: "mongodb://mongo:27017/rocketchat"
MONGO_OPLOG_URL: "mongodb://mongo:27017/local"
chat.yourdomain.com {
reverse_proxy rocketchat-1:3000 rocketchat-2:3000 {
lb_policy round_robin
}
}
Maintenance
# Update Rocket.Chat:
docker compose pull
docker compose up -d
# Backup MongoDB:
docker exec rocketchat_mongo mongodump --out /data/backup-$(date +%Y%m%d)
docker cp rocketchat_mongo:/data/backup-$(date +%Y%m%d) ./rocketchat-backup-$(date +%Y%m%d)
# Logs:
docker compose logs -f rocketchat
# Check health:
curl https://chat.yourdomain.com/api/v1/info
See all open source team communication tools at OSSAlt.com/categories/communication.