Сценарий docker-compose для развертывания своего сервера Rocket.Chat
Опубликовано:
В данной инструкции мы рассмотрим пример файла docker-compose для быстрой установки и настройки мессенджера Rocket.Chat. Все команды будут выполняться на Linux. Для работы у вас должны быть установлены Docker и docker-compose.
Файл docker-compose
Создаем каталог для хранения файлов приложения и сценария. Сразу переходим в него:
mkdir /opt/rocket.chat && cd /opt/rocket.chat
Создаем docker compose файл:
vi docker-compose.yml
- services:
- rocketchat:
- image: rocket.chat:${RC_VER}
- container_name: rocketchat
- hostname: rocketchat
- restart: unless-stopped
- expose:
- - 3000
- depends_on:
- mongodb:
- condition: service_healthy
- environment:
- TZ: ${TZ}
- HTTP_FORWARDED_COUNT: 1
- ROOT_URL: https://${RC_URL}
- MONGO_URL: mongodb://${MG_USER}:${MG_PASS}@${MG_HOST}:${MG_PORT}/${MG_DBNAME}?authSource=admin&replicaSet=rs0
- MONGO_OPLOG_URL: mongodb://${MG_USER}:${MG_PASS}@${MG_HOST}:${MG_PORT}/local?authSource=admin&replicaSet=rs0
- healthcheck:
- test: ["CMD-SHELL", "node -e \"require('http').get('http://localhost:3000/api/info', (res) => { if (res.statusCode === 200) process.exit(0); else process.exit(1); })\""]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 60s
- mongodb:
- image: mongo:${MG_VER}
- container_name: mongodb
- hostname: mongodb
- restart: unless-stopped
- expose:
- - ${MG_PORT}
- environment:
- TZ: ${TZ}
- MONGO_INITDB_ROOT_USERNAME: ${MG_USER}
- MONGO_INITDB_ROOT_PASSWORD: ${MG_PASS}
- MONGO_INITDB_DATABASE: ${MG_DBNAME}
- volumes:
- - ./mongodb/data:/data/db
- - ./mongodb/mongodb.key:/data/configdb/mongodb.key:ro
- deploy:
- resources:
- limits:
- memory: 1G
- command: >
- mongod --replSet rs0
- --bind_ip_all
- --port 27017
- --keyFile /data/configdb/mongodb.key
- --wiredTigerCacheSizeGB 0.5
- healthcheck:
- test: ["CMD-SHELL", "mongosh --port ${MG_PORT} --quiet --eval \"db.runCommand('ping').ok\""]
- interval: 10s
- timeout: 5s
- retries: 5
- caddy:
- image: caddy:${CD_VER}
- hostname: caddy
- container_name: caddy
- restart: unless-stopped
- environment:
- TZ: ${TZ}
- RC_URL: ${RC_URL}
- ports:
- - 80:80
- - 443:443
- volumes:
- - ./caddy/Caddyfile:/etc/caddy/Caddyfile
- - ./caddy/ssl:/etc/caddy/ssl
- - ./caddy/data:/data
- healthcheck:
- test: ["CMD-SHELL", "curl -fI http://127.0.0.1:2019/metrics"]
- interval: 30s
- timeout: 5s
- retries: 3
- start_period: 10s
Обратите внимание, что в данном docker-compose файле добавлен http прокси на базе Caddy. Он будет слушать на веб-портах 80 и 443. Если в вашей системе уже есть другой прокси, который занимает эти порты, caddy можно убрать из сценария.
Создаем файл конфигурации:
vi .env
RC_VER=8.1
RC_URL=chat.dmosk.ru
TZ=Europe/Moscow
MG_VER=8.0
MG_USER=rocketchat
MG_PASS=12345678
MG_HOST=mongodb
MG_PORT=27017
MG_DBNAME=rocketchat
CD_VER=2.11-alpine
* указываем свои значения:
- RC_VER — версия Rocket.Chat, которая будет развернута.
- RC_URL — доменное имя, на котором будет работать чат.
- TZ — временная зона.
- MG_VER — версия сервера баз данных MongoDB.
- MG_USER — имя пользователя для подключения к базе MongoDB. Будет создан при первом запуске.
- MG_PASS — пароль пользователя для подключения к базе MongoDB.
- MG_HOST — имя сервиса для MongoDB.
- MG_PORT — порт, на котором слушает MongoDB.
- MG_DBNAME — имя базы данных в MongoDB. Будет создана при первом запуске.
- CD_VER — версия Caddy.
Подготовка среды и запуск
Создадим конфигурационный файл для прокси Caddy:
mkdir caddy
vi caddy/Caddyfile
{$RC_URL} {
encode zstd gzip
request_body {
max_size 100MB
}
reverse_proxy rocketchat:3000 {
header_up X-Forwarded-Proto {scheme}
}
}
* в данном случае мы просто переводим все запросы на порт 3000 контейнера rocketchat.
Теперь создадим каталог для данных mongodb:
mkdir -p mongodb/data
Сгенерируем секретный ключ для mongodb:
openssl rand -base64 756 > mongodb/mongodb.key
Зададим для него приватные права (доступ только владельцу):
chmod 400 ./mongodb/mongodb.key
И укажем владельца для папки данных mongodb:
chown -R 999:999 ./mongodb
* внутри контейнера сервис работает от пользователя и группы с идентификатором 999.
Запускаем базу данных:
docker-compose up -d mongodb
Читаем значения переменных для создания системных переменных:
source .env
Выполняем инициализацию Replica Set (набора реплик) внутри контейнера mongodb:
docker-compose exec mongodb mongosh -u "${MG_USER}" -p "${MG_PASS}" --eval "rs.initiate()"
Запускаем остальные контейнеры:
docker-compose up -d
Готово. Проверить состояние контейнеров можно командой:
docker-compose ps
Ждем, когда все контейнеры будут иметь статус healthy (на это, обычно, нужно около 40 секунд).
Переходим по ссылке, указанной в конфигурационном env файле, в нашем примере https://chat.dmosk.ru — должна открыться страница регистрации сервиса и создания первого пользователя.