Ich zeige euch hier, wie ihr die Chatplattform Rocket.Chat in wenigen Minuten mit Docker realisiert. Traefik dient uns hier als Reverse Proxy und stellt später den Dienst verschlüsselt per TLS bereit.
| Datum | Änderungen |
|---|---|
| 23.01.2021 | Erstellung dieser Anleitung |
| 10.01.2023 | Update Traefik Labels / Rocket.Chat / Layout |
| 29.05.2023 | Anpassung an neue Traefik Anleitung |
| 07.08.2023 | MongoDB in Docker Compose auf V5 geändert. Danke an @mortuslupus |
| 02.12.2023 | Anpassungen an die aktuelle Version (Docker Compose + env) |
| 11.02.2026 | Anpassung an Version 8 |
0. Grundvoraussetzungen
- Docker & Docker Compose v2 (Debian / Ubuntu)
- Traefik ab v3.6 mit CrowdSec installieren und konfigurieren
1. Ordner anlegen
Zuerst legen wir uns passende Ordner-Strukturen an.
mkdir -p /opt/containers/rocketchat/
2. Docker Compose anlegen
Nun legen wir die eigentliche Docker Datei an. Hierfür habe ich mir die offizielle Konfiguration angeschaut und sehr viel abändern müssen, damit diese lauffähig wird.
nano /opt/containers/rocketchat/compose.yml
Inhalt
services:
rocketchat:
image: ${IMAGE:-registry.rocket.chat/rocketchat/rocket.chat}:${RELEASE:-8.0.1}
restart: always
environment:
ROOT_URL: ${ROOT_URL:-http://localhost}
PORT: ${PORT:-3000}
DEPLOY_METHOD: docker
DEPLOY_PLATFORM: compose
REG_TOKEN: ${REG_TOKEN:-}
LICENSE_DEBUG: true
MONGO_URL: ${MONGO_URL:-mongodb://mongodb:27017/rocketchat?replicaSet=rs0}
TRANSPORTER: "${NATS_URL-monolith+nats://nats:4222}"
INSTANCE_IP: "${INSTANCE_IP:-}"
# depends_on:
# mongodb-init-container:
# condition: service_completed_successfully
entrypoint: sh
command:
- -c
- |
echo "=====> Waiting for MongoDB (mongodb:27017) to be ready before starting Rocket.Chat...";
for i in $(seq 1 60); do
if nc -z mongodb 27017 >/dev/null 2>&1; then
echo "=====> MongoDB is up - starting Rocket.Chat";
exec node main.js;
fi;
echo "=====> MongoDB not ready yet, retrying in 5 seconds...";
sleep 5;
done;
echo "=====> Giving up waiting for MongoDB after 5 minutes";
exit 1
expose:
- ${PORT:-3000}
- ${METRICS_PORT:-9458}
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#rocketchat#{{.Name}}"
# healthcheck:
# test: ["CMD", "nc", "-zv", "-w", "10", "rocketchat", "${PORT:-3000}"]
# interval: 30s
# timeout: 10s
# retries: 10
# start_period: 30s
Code-Sprache: PHP (php)
Nun legen wir die nächste Datei an:
nano /opt/containers/rocketchat/compose.database.yml
Inhalt:
services:
nats:
image: docker.io/nats:${NATS_VERSION:-2.11-alpine}
restart: always
expose:
- 4222
- 8222
- 6222
# healthcheck:
# test: ["CMD", "nc", "-zv", "-w", "10", "nats", "4222"]
# interval: 30s
# timeout: 10s
# retries: 10
# start_period: 30s
command: --http_port 8222
ports:
- "${NATS_BIND_IP:-127.0.0.1}:${NATS_PORT_NUMBER:-4222}:4222"
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#nats#{{.Name}}"
nats-exporter:
image: docker.io/natsio/prometheus-nats-exporter:${NATS_EXPORTER_VERSION:-0.17.3}
depends_on:
- nats
expose:
- 7777
command:
- -healthz
- -varz
- "http://nats:8222"
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#nats-exporter#{{.Name}}"
mongodb-fix-permission-container:
image: docker.io/mongodb/mongodb-community-server:${MONGODB_VERSION:-8.2}-ubi8
restart: on-failure
user: "0"
volumes:
- ${MONGODB_HOST_PATH:-mongodb_data}:/data/db:rw
environment:
MONGODB_USER_ID: ${MONGODB_USER_ID:-1001}
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#mongodb-fix-permission-container#{{.Name}}"
entrypoint: |
sh -xc '
owner="$(stat -c %u /data/db)";
# for fresh installs
if [ "$$owner" != "$$MONGODB_USER_ID" ]; then
echo "=====> Fixing directory ownership to uid $$MONGODB_USER_ID"
chown -R "$$MONGODB_USER_ID" /data/db;
else echo "=====> Nothing to do"; fi;
'
# TODO: add user creation here
mongodb-init-container:
image: docker.io/mongodb/mongodb-community-server:${MONGODB_VERSION:-8.2}-ubi8
restart: on-failure
# depends_on:
# mongodb:
# condition: service_healthy
user: "0"
environment:
MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
MONGODB_URI: ${MONGODB_URI:-mongodb://mongodb:27017/?directConnection=true}
MONGODB_ADVERTISED_HOSTNAME: ${MONGODB_ADVERTISED_HOSTNAME:-mongodb}
volumes:
- ${MONGODB_HOST_PATH:-mongodb_data}:/data/db:rw
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#mongodb-init-container#{{.Name}}"
entrypoint: |
sh -xc '
echo "=====> Waiting for MongoDB to be healthy before initiating replica set...";
until mongosh "$$MONGODB_URI" --eval "db.adminCommand(\"ping\")" >/dev/null 2>&1; do
echo "=====> MongoDB not ready yet, retrying in 5 seconds...";
sleep 5;
done;
echo "=====> Initiating ReplSet $$MONGODB_REPLICA_SET_NAME at $$MONGODB_ADVERTISED_HOSTNAME:$$MONGODB_PORT_NUMBER...";
mongosh "$$MONGODB_URI" --eval "rs.initiate({_id: \"$$MONGODB_REPLICA_SET_NAME\", members: [{ _id: 0, host: \"$$MONGODB_ADVERTISED_HOSTNAME:$$MONGODB_PORT_NUMBER\" }]})";
echo "=====> Initiating ReplSet done...";
'
mongodb:
image: docker.io/mongodb/mongodb-community-server:${MONGODB_VERSION:-8.2}-ubi8
restart: always
# depends_on:
# mongodb-fix-permission-container:
# condition: service_completed_successfully
volumes:
- ${MONGODB_HOST_PATH:-mongodb_data}:/data/db:rw
user: "${MONGODB_USER_ID:-1001}"
entrypoint:
- sh
- -ec
- |
echo "=====> Waiting for /data/db to be owned by uid=$$MONGODB_USER_ID (mongodb user) ...";
for i in $(seq 1 60); do
owner="$(stat -c %u /data/db 2>/dev/null || true)";
if [ "$$owner" = "$$MONGODB_USER_ID" ]; then
echo "=====> /data/db ownership OK ($$owner) - starting MongoDB";
exec mongod --replSet "$$MONGODB_REPLICA_SET_NAME" --bind_ip_all;
fi;
echo "=====> /data/db owner is '$$owner' (expected $$MONGODB_USER_ID), retrying in 5 seconds...";
sleep 5;
done;
echo "=====> Giving up waiting for /data/db ownership after 5 minutes";
exit 1
environment:
MONGODB_USER_ID: ${MONGODB_USER_ID:-1001}
MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
MONGODB_ADVERTISED_HOSTNAME: ${MONGODB_ADVERTISED_HOSTNAME:-mongodb}
ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#mongodb#{{.Name}}"
healthcheck:
test:
- CMD
- mongosh
- "mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_PORT_NUMBER:-27017}/?directConnection=true"
- --eval
- "\"db.adminCommand('ping')\""
interval: 30s
timeout: 10s
retries: 10
start_period: 30s
ports:
- "${MONGODB_BIND_IP:-127.0.0.1}:${MONGODB_PORT_NUMBER:-27017}:${MONGODB_PORT_NUMBER:-27017}"
mongodb-exporter:
image: docker.io/percona/mongodb_exporter:${MONGODB_EXPORTER_VERSION:-0.44.0}
depends_on:
- mongodb
expose:
- 9216
command:
- --mongodb.uri=${MONGODB_URI:-mongodb://mongodb:27017}
- --collect-all
- --compatible-mode
logging:
driver: "journald"
options:
tag: "${COMPOSE_PROJECT_NAME:-rocketchat}#mongodb-exporter#{{.Name}}"
volumes:
mongodb_data: {driver: local}
Code-Sprache: PHP (php)
Jetzt legen wir noch unsere Docker Compose Override für Traefik an:
nano /opt/containers/rocketchat/docker-compose.override.yml
services:
rocketchat:
networks:
- proxy
- default
labels:
- "traefik.enable=true"
- "traefik.http.routers.rocketchat.rule=Host(`rocket.euredomain.de`)"
- "traefik.http.routers.rocketchat.entrypoints=websecure"
- "traefik.http.routers.rocketchat.tls=true"
- "traefik.http.routers.rocketchat.tls.certresolver=http_resolver"
- "traefik.http.services.rocketchat.loadbalancer.server.port=3000"
- "traefik.http.routers.rocketchat.middlewares=default@file"
networks:
proxy:
external: true
Code-Sprache: JavaScript (javascript)
Anpassung:
- Traefik Domain anpassen (rocket.euredomain.de)
3. env Datei anlegen
Nun legen wir noch eine weitere Datei an. Dazu gebt ihr folgendes ein:
nano /opt/containers/rocketchat/.env
Kopiert nun folgendes in die Datei:
REG_TOKEN=
DOMAIN=rocket.euredomain.de
ROOT_URL=https://rocket.euredomain.de
RELEASE=latest
LETSENCRYPT_ENABLED=false
LETSENCRYPT_EMAIL=demo@email.com
#TRAEFIK_PROTOCOL=https
# MongoDB
MONGODB_BIND_IP=127.0.0.1
MONGODB_PORT_NUMBER=27017
# Nats
NATS_PORT_NUMBER=4222
NATS_BIND_IP=127.0.0.1
Code-Sprache: PHP (php)
Notwendige Anpassungen:
- Bei DOMAIN gebt ihr eure Domain an, identisch zur Traefik Domain
- Bei ROOT_URL gebt ihr eure Domain an, identisch zur Traefik Domain
4. Rocket.Chat starten
Rocket.Chat startet ihr wie gewohnt mit folgendem Befehl:
cd /opt/containers/rocketchat
docker compose -f compose.database.yml -f compose.yml -f docker-compose.override.yml up -d
5. Rocket.Chat Login
Nun müsst ihr ein paar Minuten warten.
Wenn ihr nun auf “rocket.euredomain.de” geht, dann solltet ihr auf diese Webseite kommen. Hier legt ihr nun den Administrator an.

Anschließend könnt ihr noch Infos über eure Firma eingeben. Dies ist jedoch alles FREIWILLIG.

Nun legt ihr noch einen Seitennamen fest.

Jetzt müsst ihr noch euren Server Modus wählen.

Jetzt habt ihr es geschafft und könnt Rocket.Chat nutzen.

6. Quellen
https://docs.rocket.chat/installation/docker-containers/docker-compose

Hallo Christian,
hast Du vielleicht mal die Muße einen funktionierenden Upgrade Pfad auf die neue Server Version 8 (braucht MongoDB 8.2…) zu posten?
Die aktuelle compose Datei von den Rocket Leuten sieht schon sehr anders aus als die von 2023. (https://github.com/RocketChat/Docker.Official.Image/blob/main/compose.yml)
Neuinstallation funktioniert auch mit deren Compose File, aber Migration…. krieg ich nicht hin.
Danke und viele Grüße
Hallo,
ich bin kein Profi, nur privat im IT-Bereich unterwegs und immer wieder interessiert Neues zu lernen. Jetzt Docker.
Traefik konnte ich nach eurer Anleitung installieren. Läuft. Auch WordPress konnte ich ausprobieren.
Aber Rocketchat bringt immer ein “Bad Gateway” beim Aufruf der Domain. Ich habe die Anleitungen auf einem frischen System Schritt für Schritt copy/paste befolgt (außer natürlich meine Domain eingegeben, die richtig eingerichtet ist, da sie mit dem WordPress-Container schon funktioniert hat).
Vielleicht gibt es eine leichte Lösung? Oder wären noch ein paar Logs gut anzuschauen? Welche?
Vielen Dank schonmal und viele Grüße
Felix
EDIT: Nach dem Start des rocketchat-Containers geht der Status von traefik (mit “docker compose ps”) zu unhealthy. Wenn ich rc wieder stoppe, geht er zurück zu healthy.
Vielen Dank für eure Arbeit. Ein kleiner Hinweis aber zu MongoDB. Man sollte Version 5.0 nehmen 😉