Skip to main content

How to Self-Host Rocket.Chat: Open Source Team Communication 2026

·OSSAlt Team
rocket-chatslackteam-chatomnichannelself-hostingdocker2026

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

FeatureRocket.ChatMattermostSlack
LicenseMITMITProprietary
GitHub Stars~40K~31K
Cost (self-hosted)FreeFree$7.25/user/mo
OmnichannelYesNoNo
Video callsYes (Jitsi/BBB)PaidYes
E2E encryptionYesPaidNo
Matrix federationYesNoNo
Mobile appsYesYesYes
RAM usage~500MB+~200MB
Setup complexityHighMediumLow

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

  1. Omnichannel → Configuration → Livechat
  2. Enable Livechat
  3. 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:

  1. Omnichannel → Departments → + New Department
  2. Name: Sales, Support, Technical
  3. Assign agents to each department
  4. 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
  1. Admin Panel → Video Conference → Jitsi
  2. Enable Jitsi
  3. Jitsi Domain: jitsi.yourdomain.com (or use meet.jit.si for quick setup)
  4. Click camera icon in any channel to start a video call

Part 5: Matrix Federation

Rocket.Chat supports Matrix protocol for cross-platform federation:

  1. Admin Panel → Federation → Matrix
  2. Enable Matrix
  3. Server name: yourdomain.com
  4. Home Server URL: https://chat.yourdomain.com
  5. 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:

  1. Admin → E2E Encryption → Enable E2E
  2. Users enable E2E for specific rooms: Room → Room Info → Enable E2E Encryption
  3. Each user generates their own key pair (stored encrypted in browser)
  4. 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.

Comments