Создание внутреннего корпоративного чата на базе Rocket.Chat


Вот мы наконец то и пришли к тому, что скайпом дальше пользоваться уже проблемно (кажется, что в Microsoft есть специальный отдел который работает над тем, чтобы сделать скайп еще хуже) и надо выбирать какой-то внутренний корпоративный чат (желательно бесплатный, так как сотрудников стало довольно много). Разного рода Jabber-ы типа OpenFire это уже мягко скажем прошлый век и изобилуют детскими ошибками которые никто исправлять не будет и одним из адекватных вариантов которые я уже неоднократно настраивал является Rocket.Chat.

Подробнейшее пошаговое руководство по установке и настройке Rocket.Chat для использования внутри компании

На страницах моего блога вы наверное уже видели инструкции по настройке Rocket.Chat и сейчас я просто решил собрать их в одну кучу на практическом внедрении. Итак, поехали все устанавливать, настраивать и главное конспектировать каждый шаг.

Устанавливаем Debian 9.7

  • 1 процессор
  • 32 гб свободного дискового пространства
  • 1 виртуальный CPU
  • 2 гб оперативной памяти

Думаю, что таких характеристик должно вполне хватить (возможно в дальнейшем даже попробую кластеризовать его если сотрудникам понравиться).

Создаем виртуальную машину для корпоративного чата

Настраиваем:

  • Доступ root по SSH
  • Сервер в прод-vlan
  • Статический сетевой адрес
  • Разрешение DNS в зоне Local (будем с доменом интегрироваться)

Устанавливаем пакеты которые нам понадобятся для работы:

# apt-get install mc aptitude curl net-tools sudo software-properties-common dirmngr

Устанавливаем MongoDB

Добавляем ключ репозитария:

# curl https://www.mongodb.org/static/pgp/server-4.0.asc | apt-key add -

Проверяем текущий релиз дистрибутива:

# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 9.9 (stretch)
Release:        9.9
Codename:       stretch

Добавляем репозитарий для нашего дистрибутива:

# add-apt-repository 'deb http://repo.mongodb.org/apt/debian stretch/mongodb-org/4.0 main'

Устанавливаем MongoDB:

# apt-get update
# apt-get upgrade
# apt-get install mongodb-org

Настраиваем автозапуск MongoDB:

# systemctl enable mongod
# systemctl start mongod

Устанавливаем NodeJS и сопутствующие компоненты:

# apt-get -y update && sudo apt-get install -y curl && curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
# apt-get install gcc g++ make
# curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
# echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
# apt-get update && sudo apt-get install yarn
# apt-get install nodejs graphicsmagick
# npm install -g inherits n && sudo n 8.11.4

Подготовительные операции завершены и мы можем перехоить непосредственно к установке Rocket.Chat и естественно, что мы не будем использовать всякие Docker и т.п. поэтому нам понадобится нормальный не оконтейнереный дистрибутив Rocket.Chat (последний стабильный релиз, это всетаки продакшн, а не тесты всякие что бы с GIT развлекаться):

# curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
# tar -xzf /tmp/rocket.chat.tgz -C /tmp
# cd /tmp/bundle/programs/server && npm install
# npm audit fix
# mv /tmp/bundle /opt/Rocket.Chat

Создаем пользователя (непривелигированного от имени которого будем все это хозяйство запускать):

# useradd -M rocketchat && sudo usermod -L rocketchat
# chown -R rocketchat:rocketchat /opt/Rocket.Chat

Как я уже говорил, мне хотелось бы в дальнейшем сделать его кластеризуемым и поэтому сразу проведем подготовку MongoDB:

# sed -i "s/^#  engine:/  engine: mmapv1/"  /etc/mongod.conf
# sed -i "s/^#replication:/replication:\n  replSetName: rs01/" /etc/mongod.conf
# systemctl restart mongod

Проверка:

# mongo --eval "printjson(rs.initiate())"
MongoDB shell version v4.0.10
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("bea835d9-f6be-4e03-9fe7-5edb2b4bd988") }
MongoDB server version: 4.0.10
{
        "info2" : "no configuration specified. Using a default configuration for the set",
        "me" : "127.0.0.1:27017",
        "ok" : 1,
        "operationTime" : Timestamp(1559276718, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1559276718, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

Перелогиниваемся в созданного пользователя rocketchat, задаем переменные окружения и проводим первый тестовый запуск:

# su rocketchat
$ /bin/bash
$ export MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01
$ export MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01
$ export ROOT_URL=http://10.54.254.103:3000
$ export PORT=3000
$ /usr/local/bin/node /opt/Rocket.Chat/main.js

Переходим по нашему внутреннему URL и конфигурируем базовые параметры RocketChat.

Базовые настройки Rocket.Chat

Создаем службу SystemD для автоматического запуска сервера (/lib/systemd/system/rocketchat.service):

[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
[Service]
ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
Environment=MONGO_URL=mongodb://localhost:27017/rocketchat?replicaSet=rs01 MONGO_OPLOG_URL=mongodb://localhost:27017/local?replicaSet=rs01 ROOT_URL=https://chat.prodv.net PORT=3000
[Install]
WantedBy=multi-user.target

Активируем автозапуск при старте сервера и запускаем сервис:

# systemctl enable rocketchat
# systemctl start rocketchat

На фронтальном nginx компании регистрируем SSL-сертификат для нашего чата:

# certbot --webroot -w /var/www.bot/ certonly -d chat.prodv.net

Настраиваем конфигурацию Nginx на фронте для реверс-проксирования запросов к чату:

upstream backend {
    server 10.54.254.103:3000;
}

server {
    listen 80;
    server_name chat.prodv.net;
    return 301 https://chat.prodv.net$request_uri;

    access_log /var/log/nginx/chat.prodv.net.access.log;
    error_log /var/log/nginx/chat.prodv.net.error.log;

}

server {
    listen 443;
    server_name chat.prodv.net;
    ssl on;
    ssl_certificate /etc/letsencrypt/live/chat.prodv.net/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/chat.prodv.net/privkey.pem; # managed by Certbot
    ssl_ciphers         'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    ssl_dhparam         key/dhparam.pem;
    client_max_body_size 4096m;


    access_log /var/log/nginx/chat.prodv.net.access.log;
    error_log /var/log/nginx/chat.prodv.net.error.log;

    location / {
        proxy_pass http://backend/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forward-Proto http;
        proxy_set_header X-Nginx-Proxy true;

        proxy_redirect off;
    }
}

Пост-установочные операции.

Запрещаем регистрацию пользователей на нашем Chat-сервере. Для этого авторизуйтесь в качестве администратора и перейдите "Администрирование -> Учетные записи -> Регистрация" и в разделе "Регистрационная форма" смените режим на "Отключена".

Запретить регистрацию пользователей в Docket.Chat

Создаем пользователя для отправки почты (для этого домена мы используем яндекс-почту для домена) и настраиваем механизмы отправки почты чат-сервером. Для настройки механизмов отправки почты переходим "Администрирование -> Электронная почта -> Протокол SMTP" и настраиваем параемтры для отправки электронной почты через сервера Яндекса.

  • Протокол: SMTPS
  • Хост: smtp.yandex.ru
  • Порт: 465
  • IgnoreTLS: Да
  • Pool: да
  • Логин: chat@prodv.net
  • Пароль: заданный пароль
  • Адрес электронной почты отправителя: chat@prodv.net

Настройка Rocket.Chat для работы с сервисами Яндекса

Для настройки интеграции Rocket.Chat с доменом Active Directory переходим "Администрирование -> Протокол LDAP" и здесь нам придется уже основательно настраивать, а перед началом настройки создайте пользователя Active Directory с правами чтения данных из LDAP (обычный непривелигированный пользователь).

На странице основных настроек устанавливаем следующие значения.

  • Включить LDAP - Да
  • Резервная авторизация  - Да
  • Найти пользователя после входа в систему - Да
  • Хост - main-fs.laximo.local
  • LDAP порт - 369
  • Переподключение - Да
  • Шифрование - Без шифрования
  • Base DN - DC=laximo,DC=local
  • Уровень внутреннего логирования - Отключено

Базовое подключение к LDAP

 

Раздел "Аутентификация"

  • Включить - Да
  • User DN - CN=ldap,CN=Users,DC=laximo,DC=local
  • Пароль - Пароль LDAP-пользователя

Настройка авторизации

Дальнейшие настроки проводятся, что называется на вкус и цвет.