Уся робота живе в чаті. Домовленості з клієнтами, паролі, які хтось колись кинув «на хвилинку», скриншоти з адмінки, рішення, яке ухвалили пів року тому. І все це лежить на чужих серверах: у безкоштовному Slack стара історія ховається за пейволом, у Teams — за ліцензіями, а в Telegram-групах взагалі ніхто не знає, хто ще там сидить.
Найболючіше — коли людина йде з команди. Її треба вручну викинути з десятка груп, а копія листування лишається в неї на телефоні. Якщо акаунт був особистий — ви його не контролюєте зовсім.
Власний чат прибирає цю проблему. Сервер ваш, база ваша, вхід через ваш каталог користувачів. Вимкнули акаунт в одному місці — людина втратила доступ.
Що ми робимо
Типова схема, яку ми ставимо на виділений сервер OVH чи Hetzner або в наявний Proxmox:
- Чат — Mattermost (частіше) або Rocket.Chat в окремій віртуалці чи LXC-контейнері.
- База — PostgreSQL для Mattermost, MongoDB з набором реплік для Rocket.Chat.
- Файли — на локальному диску або в S3-сумісному сховищі (MinIO, Object Storage у Hetzner чи OVH). Для команди, що активно кидає скриншоти й PDF, S3 зручніший: диск віртуалки не росте, а бекап файлів живе окремо.
- Вхід — через SSO: Keycloak, Authentik або ваш LDAP/Active Directory.
- Вхід ззовні — Nginx або Traefik з TLS-сертифікатом від Let’s Encrypt, fail2ban і обмеження частоти запитів на сторінку логіна.
- Інтеграції — канали для алертів з Prometheus/Alertmanager, повідомлень з GitLab CI, деплоїв.
- Бекапи і моніторинг — щоденний дамп бази і копія файлів на окреме сховище, перевірка доступності й сертифіката.
Mattermost чи Rocket.Chat — чесно
Mattermost працює на PostgreSQL і складається з одного бінарника. Обслуговувати його простіше: оновлення — це заміна версії і міграції бази, які він робить сам. Він добре дружить з GitLab: є готова інтеграція, слеш-команди, сповіщення про merge request і пайплайни. Для технічних команд це зазвичай найкращий вибір.
Дані він тримає в звичайних таблицях, тож за потреби відповідь можна дістати прямо з бази SQL-запитом. Один нюанс, про який варто знати: видалене повідомлення в базі лише позначається як видалене, а не зникає. Для аудиту це плюс. Для того, хто думав, що «стер і забув», — сюрприз.
Rocket.Chat дає більше «з коробки»: омніканал для звернень клієнтів, відеодзвінки, більше налаштувань інтерфейсу. Але він важчий. Йому потрібна MongoDB з набором реплік навіть на одному сервері, а оновлювати MongoDB між мажорними версіями доводиться покроково, через кожну проміжну.
Обидва мають безкоштовні редакції, але їхні умови вендори за останні роки міняли не раз: що входить, скільки користувачів, які функції лишились у платних планах. Тому ми не обіцяємо наперед — перед стартом звіряємо актуальні умови з вашою кількістю людей і потрібними функціями. Наприклад, у Mattermost загальний вхід через OpenID Connect, SAML і LDAP історично входив у платні редакції, а безкоштовна вміла вхід через GitLab. Від цього залежить, як саме ми підключимо SSO.
Коли власний чат НЕ підходить: якщо у вас п’ять людей, нікого з них не треба відключати й нікому не потрібна історія за три роки. Тоді витрати на сервер і супровід не окупляться.
Сповіщення на телефон, SSO і звільнення
Push-сповіщення — найменш очевидна частина. Офіційні мобільні застосунки отримують пуші через сервіси Apple і Google, а ті приймають їх лише від вендора застосунку. Тож ваш сервер шле сповіщення через push-проксі вендора, а вже той — в Apple чи Google. Тобто тут ви залежите від чужого сервісу і його умов. Щоб текст повідомлень не йшов назовні, вмикаємо режим, коли в пуші летить лише ідентифікатор, а сам текст телефон забирає з вашого сервера. Повністю свій push-проксі можливий, але тоді треба збирати власні мобільні застосунки — для малої команди це зазвичай зайве.
Звідси ж ще один компроміс: чат не сховаєш за VPN чи за загальною сторінкою логіна перед сайтом. Мобільні й десктопні клієнти ходять в API напряму. Тому захищаємо сам застосунок: SSO з другим фактором, fail2ban, обмеження частоти запитів.
SSO налаштовуємо так, щоб люди входили тим самим акаунтом, що й у пошту чи GitLab. Перед перемиканням зв’язуємо наявні акаунти за email, щоб у людей не з’явились дублікати. Окремо перевіряємо адресу сайту в конфігурації: якщо там лишилась внутрішня адреса, вхід через SSO і посилання в пушах просто не працюватимуть.
Коли людина звільняється, її вимикають у каталозі — і вона вже не увійде. Але вже відкриті сесії живуть до кінця свого строку, тому ставимо розумну тривалість сесій і пишемо коротку інструкцію, що робити в день звільнення.
Інтеграції. Mattermost приймає вебхуки у форматі Slack, тож Alertmanager шле алерти без жодних додаткових модулів:
receivers:
- name: chat-alerts
slack_configs:
- api_url_file: /etc/alertmanager/chat_webhook
channel: alerts
send_resolved: true
title: '{{ .CommonLabels.alertname }}: {{ .Status }}'
GitLab CI так само пише в канал про зламаний пайплайн чи успішний деплой.
Бекапи й оновлення. Дамп бази і копія файлів — окремо, на інше сховище, з перевіркою відновлення. Оновлюємо за планом: спершу знімок віртуалки, потім нова версія, потім перевірка входу, пушів і вебхуків.
Що ви отримуєте
- Робочий чат на вашому сервері, з вашим доменом і TLS.
- Вхід через SSO і зрозумілий порядок дій при звільненні.
- Мобільні й десктопні застосунки з налаштованими сповіщеннями.
- Канали з алертами моніторингу і подіями CI.
- Щоденні бекапи бази й файлів з перевіреним відновленням.
- Моніторинг доступності, місця на диску і строку дії сертифіката.
- Документацію: де що лежить, як оновлювати, як відновитись з бекапу.
- Повні адмінські доступи — все лишається у вас, навіть якщо ми більше не працюємо разом.
Якщо робота у вас розкидана по Telegram-групах або ви вперлися в ліміти Slack — напишіть нам. Розкажіть, скільки у вас людей і чим ви вже користуєтесь, — запропонуємо, що ставити і як переїхати.