Summary: Из-за проблем со Slack нам нужно было искать альтернативу, а терять накопленные наработки не хотелось. Мы нашли способ переехать относительно безболезненно и с сохранением данных — рассказываем, как это сделали.

Приветствую, уважаемые читатели Хабра. Меня зовут Иван Иваньков, я руковожу направлением омниканальных решений в Лиге Цифровой Экономики. На старте одного из проектов около шести лет назад мы с заказчиком решили, что будем вести все проектные коммуникации в Slack. На тот момент для нашей небольшой команды стоил он не так дорого, да еще и был удобнее, чем альтернативные мессенджеры.

Шли годы, наши с заказчиком команды расширялись, а Slack становился не просто мессенджером, а огромной базой знаний: он оброс всевозможными ботами (как готовыми, так и самописными) и по сути превратился в цифровое рабочее место для каждого сотрудника.

Но все хорошее когда-нибудь заканчивается. Так произошло и с нашим Slack. В 2022 году появились первые новости о блокировках воркспейсов у некоторых российских компаний. Позже возникли и другие трудности, например, нельзя было оплатить подписку российскими картами. 

Сохранялись серьезные риски:

  1. Могла потеряться вся накопившаяся база знаний и боты для комфортной работы.

  2. Была вероятность лишиться удобного и привычного мессенджера.

  3. Иностранный облачный продукт было невозможно контролировать, к нему появилось недоверие: он показал свое отношение к пользователям, заблокировав несколько крупных воркспейсов без суда и следствия.

В этот момент мы начали думать об альтернативах.

Новый мессенджер должен был соответствовать нескольким важным критериям:

  1. Возможность использования on-premise без подписок и оплаты.

  2. Open Source с большим комьюнити для того, чтобы мы могли находить ответы на интересующие вопросы и кастомизировать необходимое.

  3. Возможность импортировать в новый мессенджер историю из Slack.

  4. Интерфейс, похожий на Slack, и привычные функции.

В этом посте не буду приводить сравнительную таблицу: единственным мессенджером, который удовлетворял бы нашим критериям, оказался Mattermost.

Я в деталях расскажу, как мы подошли к вопросу переезда и как решали возникшие в процессе проблемы. Не претендую на абсолютную правильность, но все работает уже около полугода, и довольно хорошо.

1. Установка Mattermost (проблем не возникло)

  • Установка БД:
    sudo apt install postgresql postgresql-contrib

  • Установка приложения:
    sudo wget https://releases.mattermost.com//mattermost--linux-amd64.tar.gz
    sudo tar -xvzf mattermost*.gz

  • Создание сервиса:
    sudo nano /lib/systemd/system/mattermost.service

  • Балансировка и HTTPS:
    sudo apt install nginx
    sudo apt install certbot
    sudo certbot certonly —standalone -d <space_url>

    Более детально на примере Ununtu 20.04 смотрите здесь.

2. Базовое администрирование

  • Запуск/остановка/перезапуск:
    sudo systemctl start mattermost.service
    sudo systemctl restart mattermost.service
    sudo systemctl stop mattermost.service

  • Файл конфигурации:
    /opt/mattermost/config/config.json
    @mm-01:/opt/mattermost/config$ ll@mm-01:/opt/mattermost/logs$ cd /opt/mattermost/config/
    @mm-01:/opt/mattermost/config$ ll
    total 40
    drwxrwxr-x 2 mattermost mattermost 4096 May 24 18:19 ./
    drwxrwxr-x 12 mattermost mattermost 4096 Mar 25 08:17 ../
    -rw-rw-r-- 1 mattermost mattermost 1069 Mar 15 15:58 cloud_defaults.json
    -rw--w---- 1 mattermost mattermost 21561 May 24 18:19 config.json
    -rw-rw-r-- 1 mattermost mattermost 243 Mar 15 15:58 README.md

3. Экспорт из Slack

Мы собрали важные каналы в Slack (публичных и приватные) для переноса истории сообщений в Mattermost. Тут сразу скажу, что нам важны были преимущественно сообщения, а не медиаконтент, поэтому его переносить мы не стали. 

Однако важно было как-то забэкапить и контент из Slack, чтобы при крайней необходимости была возможность к нему обратиться.

Мы изучили различные инструменты для бэкапирования и миграции, даже рассмотрели вариант собственного написания скриптов. В итоге решили воспользоваться инструментом backupery

Купили лицензию, добавили системного пользователя в нужные приватные каналы и экспортировали историю сообщений. На выходе получилось два артефакта: файл для дальнейшего импорта в Mattermost, а также файлы HTML и папки с контентом (при открытии index.html можно ходить по чатам и качать контент).

4. Импорт в Mattermost

Рекомендуется сначала протестить импорт/экспорт на тестовых Slack/Mattermost!

Для преобразования экспорта из Slack понадобится инструмент mmetl.

  • Для упрощения работы с файлами можно добавить каталог с утилитами в $PATH и работать с файлами из любой директории.

    export PATH="/opt/mattermost/bin:$PATH"

  • Сначала необходимо преобразовать экспорт в формат для Mattermost.

    mmetl transform slack --team <team_name> --file slackExport.zip --output mattermost_import.json

     zip mattermost-import.zip mattermost_import.json

  • Перед выполнением следующих команд надо авторизоваться через mmctl.

    mmctl auth login https://chat.address.ru  --username <username> --password <password>

  • Сначала следует загрузить получившийся файл.

    mmctl import upload ./mattermost-import.zip

  • После загрузки проверить, есть ли он в списке файлов импорта, скопировать сгенерированное инструментом имя документа и начать сам процесс.

    mmctl import list available

    mmctl import process <id>_mattermost-import.zip

  • Статус можно проверить, использовав job id, который выдаёт прошлая команда:

    mmctl import job show <job_id> --json

При успешном импорте должны появиться аккаунты пользователей и каналы.

Если учётные записи деактивированы в Slack, они снова станут активными в Mattermost. Необходимо отключить их вручную.

5. Удаление лишних пользователей через CLI

Документация по mmctl находится здесь.

Репозиторий утилиты — здесь.

●      Перед выполнением команд сначала надо авторизоваться через mmctl.

./mmctl auth login https://chat.address.ru  --username <username> --password <password>

  • Удаление пользователя (больше команд здесь):

    ./mmctl user delete <id> --confirm

6. Установка плагинов (на примере remind)

Стоит отметить, что большая часть нужных плагинов может быть установлена через GUI (в клиенте нужно перейти в раздел Marketplace и инсталлировать необходимое). Однако через GUI ставится не все, поэтому далее привожу команду, которая позволяет сделать это через CLI (на примере remind, он позволяет создавать различные напоминания).

./mmctl plugin add /opt/com.github.scottleedavis.mattermost-plugin-remind-0.4.5.tar.gz

7. Настройка привычного интерфейса и инструментария

Включаем Threads как в Slack (начиная с версии 7.2, включается в консоли администрирования для всех, в предыдущих каждому пользователю нужно делать это самостоятельно).

Settings -> Display -> Collapsed Reply Threads (Beta) -> On -> Save

Оформление (цветовая тема) как в Slack:

Settings -> Display -> Theme -> Custom Theme

Нажимаем на ссылку Import theme colors from Slack. В открывшемся поп-апе вставляем, например, следующее: 

#3F0E40,#350d36,#1164A3,#FFFFFF,#350D36,#FFFFFF,#2BAC76,#CD2553,#350d36,#FFFFFF

Сохраняем. Либо же сразу вставляем тему в окно “Copy and paste to share theme colors”.

Большое количество тем есть на нескольких порталах: для Slack, для Mattermost.

Групповое уведомление (аналог @group в Slack)

Первый вариант.

  • Групповое тегание (мы называем это "собакнуть" ????) 

Доступно через использование плагина Autolink. Реализовано через использование паттернов и автозамены слова.

Пример шаблона тегания для группы test_group:

Pattern: @test_group*

Template: **test_group**: @test1 @test2 @test3 @test4 @test5

В случае отправки @content сообщение преобразуется в такое: test_group: @test1 @test2 @test3 @test4 @test5

И все вышеперечисленные люди будут уведомлены.

Второй вариант.

  • Добавление триггеров-слов в настройки своего профиля

Идентификация профилей

Так как у нас в Mattermost больше 300 пользователей, представители нескольких компаний и разных команд, нужно уметь идентифицировать каждого по профилю.

Для этого мы воспользовались плагином Custom User Attributes.

В System Console -> Custom User Attributes

8. Настройка файлового хранилища

Наши команды шлют много медиаконтента в каналы и личные сообщения. По дефолту данные хранились на самом хосте установленного mattremost (SSD). Но это не самый лучший вариант: он привел к установке ограничений на передаваемые файлы в Mattermost.

Мы решили изменить подход, и теперь хранилище (HDD), которое подключается к VM через интерфейс Filesystem in Userspace (FUSE) как устройство virtiofs, не связано напрямую с файловой системой хоста. Сейчас, если с нашей текущий VM что-то случается, мы можем оперативно поднять из бэкапа новую машину, используя снимок, и подключить это хранилище с контентом.

В документации не описано, но важно после смены директории перезапускать сервис Mattermost на машине, “на горячую” не правится.

9. Решение проблем с пуш-уведомлениями

В момент конфигурации мы воспользовались рекомендацией из документации, где говорилось, что есть сервер пуш-уведомлений, который находится в Германии.

Но, к сожалению, функционал практически не работал. Для решения мы указали сервер push-test.mattermost.com, что позволило снова получать пуш-уведомления на все устройства.

За отображение текста в пуш-уведомлениях отвечает настройка Push Notification Contents в консоли администрирования.

Важный момент! При использовании push-test.mattermost.com не гарантируетcя production-level по SLA.

10. Решение проблем с производительностью

Когда Mattermost стало пользоваться более 300 человек, начались проблемы с производительностью: периодически не получалось отправить или прочитать сообщения. 

В нашем случае (думаю, как и в большинстве таких ситуаций) причиной стала нехватка сессий к БД.

В логе: pq: remaining connection slots are reserved for non-replication superuser connections

Решение:

Правка конфига postgresql.conf, лежит в /etc/postgresql/12/main/
Выставить значение
max_connections = 300

Проверить в панели администрирования Mattermost секцию Database: параметр Maximum Open Connections должен быть равен значению, которое мы выставили в БД.

Заключительный шаг — перезапустить сервис postgresql.

***

Описанные выше шаги помогли нам получить хорошую альтернативу Slack, которой уже практически полгода активно пользуются почти четыреста человек с desktop и mobile.  

Остаются проблемы с производительностью самих клиентов, а также периодическое излишнее кеширование, которое лечится в клиенте кликом по Clear Cache and Reload. Однако эти проблемы не критические, не мешают нормально работать и пользоваться привычными удобными интерфейсами и инструментами.

Комментарии (8)


  1. babilonsuxx
    25.11.2022 17:20

    Мне кажется, мы стали свидетелями хабрэффекта


    1. Thomas_Hanniball
      25.11.2022 17:38

      403 — это доступ запрещён, т.е. сайт блокирует обращение с российских и белорусских ip-адресов. Так делают многие вендоры, которые официально ушли с наших рынков, например, www.citrix.com, где сообщение «You don't have permission to access „www.citrix.com“ on this server.».


  1. Mi11er
    26.11.2022 01:17

    Почему не Rocket chat ?


    1. DuD
      27.11.2022 00:21

      Присоединяюсь к вопросу. Рассматривали ли rocket chat?


  1. easty
    26.11.2022 11:18

    Со слаком кончено не сравнить. Очень прожорливые клиенты, мобильный клиент для андроида просто не юзабельный. Но как говорится, нам это на "пользу", выбора особо нет, хоть какая-то замена слаку


  1. TyVik
    27.11.2022 08:06

    Преимущество Slack в приложениях и ботах. Большинство в ММ просто нет, а свои всё равно надо переносить ручками.


    1. mapcuk
      27.11.2022 09:22
      +1

      Около 8 лет использовал Slack, никогда ботами не пользовался, как-то использовали бота для деплоя, но написан in-house. Отличный пример как можно попасть в vendor-lock.


  1. werter_l
    27.11.2022 12:42

    matrix ?