Summary: Из-за проблем со Slack нам нужно было искать альтернативу, а терять накопленные наработки не хотелось. Мы нашли способ переехать относительно безболезненно и с сохранением данных — рассказываем, как это сделали.
Приветствую, уважаемые читатели Хабра. Меня зовут Иван Иваньков, я руковожу направлением омниканальных решений в Лиге Цифровой Экономики. На старте одного из проектов около шести лет назад мы с заказчиком решили, что будем вести все проектные коммуникации в Slack. На тот момент для нашей небольшой команды стоил он не так дорого, да еще и был удобнее, чем альтернативные мессенджеры.
Шли годы, наши с заказчиком команды расширялись, а Slack становился не просто мессенджером, а огромной базой знаний: он оброс всевозможными ботами (как готовыми, так и самописными) и по сути превратился в цифровое рабочее место для каждого сотрудника.
Но все хорошее когда-нибудь заканчивается. Так произошло и с нашим Slack. В 2022 году появились первые новости о блокировках воркспейсов у некоторых российских компаний. Позже возникли и другие трудности, например, нельзя было оплатить подписку российскими картами.
Сохранялись серьезные риски:
Могла потеряться вся накопившаяся база знаний и боты для комфортной работы.
Была вероятность лишиться удобного и привычного мессенджера.
Иностранный облачный продукт было невозможно контролировать, к нему появилось недоверие: он показал свое отношение к пользователям, заблокировав несколько крупных воркспейсов без суда и следствия.
В этот момент мы начали думать об альтернативах.
Новый мессенджер должен был соответствовать нескольким важным критериям:
Возможность использования on-premise без подписок и оплаты.
Open Source с большим комьюнити для того, чтобы мы могли находить ответы на интересующие вопросы и кастомизировать необходимое.
Возможность импортировать в новый мессенджер историю из Slack.
Интерфейс, похожий на 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)
easty
26.11.2022 11:18Со слаком кончено не сравнить. Очень прожорливые клиенты, мобильный клиент для андроида просто не юзабельный. Но как говорится, нам это на "пользу", выбора особо нет, хоть какая-то замена слаку
TyVik
27.11.2022 08:06Преимущество Slack в приложениях и ботах. Большинство в ММ просто нет, а свои всё равно надо переносить ручками.
mapcuk
27.11.2022 09:22+1Около 8 лет использовал Slack, никогда ботами не пользовался, как-то использовали бота для деплоя, но написан in-house. Отличный пример как можно попасть в vendor-lock.
babilonsuxx
Мне кажется, мы стали свидетелями хабрэффекта
Thomas_Hanniball
403 — это доступ запрещён, т.е. сайт блокирует обращение с российских и белорусских ip-адресов. Так делают многие вендоры, которые официально ушли с наших рынков, например, www.citrix.com, где сообщение «You don't have permission to access „www.citrix.com“ on this server.».