Запуск нескольких экземпляров Чат Ракета позволяет рабочему пространству обслуживать больше пользователей и эффективнее распределять трафик. В многоэкземплярной архитектуре несколько экземпляров Чат Ракета работают одновременно, подключаются к общему набору реплик MongoDB и балансируются через обратный прокси.
Это руководство объясняет, как развернуть Чат Ракета в схеме с несколькими экземплярами с помощью Docker. В нём рассматриваются:
Примечание. Горизонтальное масштабирование на нескольких серверах лучше подходит для высокой доступности, но можно масштабироваться и вертикально — запуская несколько экземпляров на одном большом многоядерном хосте. Практическое правило: запускать N−1 экземпляров Чат Ракета, где N — число ядер CPU.
Перед началом убедитесь, что есть следующее:
Примечание. В руководстве показан пример с двумя экземплярами Чат Ракета. Фактические шаги могут отличаться в зависимости от требований и конфигурации организации.
Первый компонент многоэкземплярного развёртывания — общая база данных. Все экземпляры Чат Ракета должны подключаться к одному набору реплик MongoDB. Официальная конфигурация Docker Compose Чат Ракета также включает стек мониторинга, который отдаёт метрики в Prometheus и визуализирует их в Grafana.
Перейдите на сервер MongoDB и выполните шаги:
mkdir -p files/prometheus/file_sd_configs.d/
rocketchat.yaml) в новом каталоге:nano files/prometheus/file_sd_configs.d/rocketchat.yaml
rocketchat.yaml следующее содержимое:- targets:
- <first-rocketchat-ip>:9458
- <second-rocketchat-ip>:9458
labels:
job: rocketchat
service: rocketchat
Этот файл задаёт IP-адреса, по которым Prometheus должен собирать метрики Чат Ракета.
Замените <first-rocketchat-ip> и <second-rocketchat-ip> на частные IP-адреса соответствующих серверов Чат Ракета.
Если экземпляров Чат Ракета больше, добавьте цели в том же формате.
В выбранном каталоге скачайте официальные файлы compose для базы и мониторинга:
curl -O https://rce-gitlab.fgts.ru/rce/rce-compose-files/-/raw/main/compose.monitoring.yml
curl -O https://rce-gitlab.fgts.ru/rce/rce-compose-files/-/raw/main/compose.database.yml
.env и добавьте переменные:# MongoDB
MONGODB_BIND_IP=<mongo-ip>
MONGODB_PORT_NUMBER=27017
MONGODB_ADVERTISED_HOSTNAME=<mongo-ip>
MONGODB_INITIAL_PRIMARY_HOST=<mongo-ip>
# Nats
NATS_PORT_NUMBER=4222
NATS_BIND_IP=<mongo-ip>
# Grafana
GRAFANA_DOMAIN=
GRAFANA_PATH=/grafana
GRAFANA_ADMIN_PASSWORD=rc-admin
GRAFANA_HOST_PORT=5050
<mongo-ip> на частный IP-адрес сервера MongoDB.https://<workspace-domain>/grafana. Чтобы вынести Grafana на поддомен, задайте:GRAFANA_DOMAIN=<grafana-subdomain>
GRAFANA_PATH=
Замените <grafana-subdomain> на имя поддомена, по которому хотите открывать Grafana.
docker compose -f compose.database.yml -f compose.monitoring.yml up -d
Так запускаются MongoDB, Prometheus и Grafana, чтобы остальная часть кластера могла к ним подключиться.
На каждом сервере Чат Ракета выполните следующие шаги:
https://rce-gitlab.fgts.ru/rce/rce-compose-files/-/raw/main/compose.yml
compose.yml. В секции сервиса rocketchat добавьте network_mode: host:services:
rocketchat:
...
network_mode: host
labels:
...
Режим network_mode: host позволяет Чат Ракета привязаться напрямую к сети хоста. Это упрощает связь с Traefik и избегает конфликтов проброса портов при запуске нескольких экземпляров на разных серверах.
.env со следующими значениями:NATS_URL=monolith+nats://<mongo-ip>:4222
MONGO_URL=mongodb://<mongo-ip>:27017/rocketchat?replicaSet=rs0
RELEASE=<enter-rocketchat-release>
ROOT_URL=<enter-workspace-url>
Замените <mongo-ip> на частный IP-адрес сервера MongoDB. Задайте RELEASE и ROOT_URL для своего рабочего пространства.
NATS_URL: включает связь между экземплярами (присутствие, уведомления и т. д.).
MONGO_URL: направляет все экземпляры Чат Ракета на один набор реплик MongoDB.
RELEASE: точная версия Чат Ракета, которую вы хотите развернуть. Список стабильных версий — в заметках о релизах Чат Ракета.
ROOT_URL: полный URL, по которому пользователи открывают рабочее пространство, включая защищённый протокол (https://), например https://chat.example.com.
Запустите экземпляр Чат Ракета командой:
docker compose up -d
Совет. Повторите этот шаг на всех серверах Чат Ракета.
Traefik выступает обратным прокси и балансировщиком нагрузки. Он стоит на границе сети, принимает весь входящий веб-трафик и равномерно распределяет его по работающим экземплярам Чат Ракета, обеспечивая равномерную нагрузку и высокую доступность.
Перейдите на сервер Traefik и продолжите шаги:
curl -O https://raw.githubusercontent.com/RocketChat/rocketchat-compose/main/compose.traefik.yml
override-traefik.yaml и сохраните в него следующее содержимое:services:
traefik-init:
image: docker.io/alpine:latest
entrypoint: sh
command:
- -c
- |-
set -e
# quote 'eof' to prevent variable expansion
rm -rf /traefik_config/* || true
mkdir -p /traefik_config/http /traefik_config/https
cat <<'EOF' | tee /traefik_config/http/dynamic.yml
http:
routers:
rocketchat:
entryPoints:
- http
service: rocketchat
rule: Host(`{{ env "DOMAIN" }}`) && PathPrefix(`/`)
grafana:
entryPoints:
- http
service: grafana
rule: |-
{{ if eq (env "GRAFANA_DOMAIN") "" }}
Host(`{{ env "DOMAIN" }}`) && PathPrefix(`{{ env "GRAFANA_PATH" }}`)
{{ else }}
Host(`{{ env "GRAFANA_DOMAIN" }}`)
{{ end }}
services:
rocketchat:
loadBalancer:
servers:
- url: "http://<first-rocketchat-ip>:3000"
- url: "http://<second-rocketchat-ip>:3000"
grafana:
loadBalancer:
servers:
- url: "http://<mongo-ip>:5050"
EOF
cat <<'EOF' | tee /traefik_config/https/dynamic.yml
https:
address: ":443"
http:
redirections:
entryPoint:
to: "http"
scheme: "https"
http:
routers:
rocketchat:
entryPoints:
- https
service: rocketchat
rule: Host(`{{ env "DOMAIN" }}`)
tls:
certResolver: le
grafana:
entryPoints:
- https
rule: |
{{ if eq (env "GRAFANA_DOMAIN") "" }}
Host(`{{ env "DOMAIN" }}`) && PathPrefix(`{{ env "GRAFANA_PATH" }}`)
{{ else }}
Host(`{{ env "GRAFANA_DOMAIN" }}`)
{{ end }}
service: grafana
tls:
certResolver: le
services:
rocketchat:
loadBalancer:
servers:
- url: "http://<first-rocketchat-ip>:3000"
- url: "http://<second-rocketchat-ip>:3000"
grafana:
loadBalancer:
servers:
- url: "http://<mongo-ip>:5050"
EOF
echo "files generated, keeping container alive to podman-compose detect it"
tail -f /dev/null
volumes:
- traefik_config:/traefik_config:z
restart: "no"
Замените <mongo-ip> на частный IP-адрес сервера MongoDB.
Замените <first-rocketchat-ip> на IP-адрес первого сервера Чат Ракета.
Замените <second-rocketchat-ip> на IP-адрес второго сервера Чат Ракета.
Если экземпляров Чат Ракета больше, добавьте их во все списки servers в секции rocketchat.loadBalancer.
Создайте файл .env с переменными окружения Traefik, включая домен и адрес электронной почты для Let's Encrypt (автоматические сертификаты SSL/TLS):
DOMAIN=<domain-name>
LETSENCRYPT_ENABLED=true
LETSENCRYPT_EMAIL=<email-address>
TRAEFIK_PROTOCOL=https
# Grafana
GRAFANA_DOMAIN=
GRAFANA_PATH=/grafana
GRAFANA_ADMIN_PASSWORD=rc-admin
GRAFANA_HOST_PORT=5050
# Traefik ports
TRAEFIK_HTTP_PORT=80
TRAEFIK_DASHBOARD_PORT=8080
TRAEFIK_HTTPS_PORT=443
Замените <domain-name> на фактическое доменное имя (например, chat.example.com).
Замените <email-address> на адрес электронной почты для Let's Encrypt.
Запустите Traefik командой:
docker compose -f compose.traefik.yml -f override-traefik.yaml up -d
Когда сервер Traefik запущен, многоэкземплярное развёртывание готово.

> Рабочее пространство.Дашборд Grafana доступен по пути или поддомену, которые вы настроили (например, https://your-domain.com/grafana или https://grafana.your-domain.com). Для входа используйте:
adminGRAFANA_ADMIN_PASSWORD в файле .env.Предупреждение. Пароль
GRAFANA_ADMIN_PASSWORDиз.envприменяется только один раз — при первой настройке контейнера. Чтобы сменить пароль позже, меняйте его непосредственно в настройках пользователя Grafana.
По умолчанию Чат Ракета хранит загрузки файлов в MongoDB GridFS. Это работает без дополнительной настройки, но увеличивает нагрузку на базу и ограничивает масштабируемость. Для продакшен-развёртывания с несколькими экземплярами настройте выделенное объектное хранилище: Amazon S3, Google Cloud Storage (GCS) или MinIO. Подробные инструкции — в руководстве File Uploads.
Примечание.
- Проверьте требования к версии MongoDB, чтобы текущая версия MongoDB была совместима с новой версией Чат Ракета.
- В схеме с несколькими экземплярами лучше обновлять экземпляры по одному (скользящее обновление), чтобы рабочее пространство оставалось доступным.
Чтобы обновить версию Чат Ракета, выполните эти шаги на каждом сервере Чат Ракета:
.env и обновите переменную RELEASE до нужного тега версии:RELEASE=<desired version>
docker compose up -d
Через несколько минут можно перейти в Управление
Рабочее пространство и проверить новую версию рабочего пространства.
Примечание. Важно всегда держать подключённые экземпляры Чат Ракета на одной версии рабочего пространства.
Чтобы индикаторы набора текста и эфемерные события работали по всему кластеру, экземпляры должны общаться друг с другом напрямую. В среде Docker без host-networking задайте следующие переменные:
INSTANCE_IP: переменная задаёт IP-адрес, доступный другим экземплярам Чат Ракета. Укажите в каждом .env IP текущего хоста. Не используйте внутренние IP контейнеров — они недоступны с других хостов.TCP_PORT: по умолчанию Чат Ракета выбирает случайный порт для связи между экземплярами. Если вы за файрволом, задайте фиксированный TCP_PORT (например, 3001), чтобы нужный порт был открыт и доступен.И INSTANCE_IP, и TCP_PORT сохраняются в коллекции экземпляров, по которой Чат Ракета отслеживает и поддерживает связность. Этот внутренний реестр позволяет каждому экземпляру обнаруживать новых соседей и устанавливать TCP-соединения при добавлении экземпляров. Если экземпляр не обновляет свою запись, она со временем истекает и удаляется из реестра — остаются только активные соединения.
При использовании MongoDB Atlas или собственной базы убедитесь, что база настроена корректно — это критичная часть схемы. Запускайте MongoDB как набор реплик: репликация обеспечивает избыточность данных и даёт вторичный узел на случай отказа первичного.