Как установить Mattermost на облачный сервер

Как установить Mattermost на облачный сервер

Рассмотрим установку Mattermost — платформы для командного взаимодействия и совместной работы.

Что такое Mattermost

Mattermost — платформа для корпоративных коммуникаций, которая позволяет собрать рабочее общение в одном месте и структурировать его по командам, проектам и темам. 

Можно воспринимать Mattermost как решение для организаций, которым важно самостоятельно контролировать корпоративные данные. Есть версия, которую можно развернуть на собственной инфраструктуре и хранить сообщения, файлы и служебную информацию во внутреннем контуре. В общем, если предъявляются повышенные требования к информационной безопасности, то этот мессенджер может как раз подойти.

Подготовка инфраструктуры

Mattermost имеет довольно скромные требования для малых и средних команд:

  • до 1 000 пользователей достаточно 1 vCPU и 2 GB RAM;
  • до 2 000 — потребуются 2 vCPU и 4 GB RAM;
  • свыше 2 000 — предлагается использовать Enterprise Edition и инсталляцию из нескольких серверов.

Бесплатный тарифный план — Mattermost Entry рекомендован для маленьких команд до 50 человек и имеет ограничения: в интерфейсе видны только последние 10 000 сообщений во всех чатах. Полный список ограничений указан на странице различия версий. Для снятия ограничения необходимо покупать коммерческую лицензию, даже для развертывания на своей инфраструктуре.

В качестве внешних зависимостей Mattermost требует любой популярный дистрибутив Linux и СУБД PostgreSQL 14.0 или выше.

Мы рассмотрим развертывание Mattermost для маленькой команды и будем использовать один виртуальный сервер. Так как 1 vCPU и 2 GB RAM нужны для самого Mattermost, а сервер также должен вмещать СУБД, то разумным выбором кажется конфигурация 2 vCPU и 4 GB RAM.

Скриншот заказа облачного сервера.
Заказ облачного сервера.

Заходим в панель управления Selectel, выбираем Продукты → Облачные серверы → Создать сервер. Возьмем 2 vCPU, 4 GB RAM, 40 GB NVMe и Ubuntu 24.04 в Санкт-Петербурге.

Хотя это не обязательно, все же рекомендуем использовать SSH-ключ для подключения к виртуальной машине вместо пароля.

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


      $ ssh root@136.234.X.X
The authenticity of host '136.234.X.X (136.234.X.X)' can't be established.
ED25519 key fingerprint is SHA256:rbq7jTtTHvREolZw6x/RwOXLvVCPr42pgYppZrlpCjw.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '136.234.X.X' (ED25519) to the list of known hosts.
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-138-generic x86_64)

root@mattermost:~#

Mattermost — это платформа для человеческого общения, поэтому сразу же создаем доменную запись для созданного сервера. Например, chat.example.com. Купить новый домен или делегировать существующий можно не выходя из панели управления Selectel.

Развертывание Mattermost

В документации Mattermost указаны три способа развертывания.

  1. Mattermost Kubernetes Operator — развертывание в Kubernetes, со всеми удобствами контейнерной платформы.
  2. Linux — установка непосредственно в операционную систему. Простое, но надежное решение, если Kubernetes не используется или не является предпочительным.
  3. Docker — запуск в самостоятельных контейнерах возможен, но не рекомендован для использования в реальных проектах, только для тестирования.

Мы рассмотрим вариант установки Mattermost в операционную систему. Такой способ и проще, и вместе с тем рекомендован для полноценного использования.

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

  • фаервол;
  • СУБД для хранения данных;
  • обратный прокси, который возьмет на себя задачу обеспечения HTTPS;
  • непосредственно Mattermost.

Приступим.

Установка UFW

Сперва защитим виртуальную машину. Фаервол логично подключать в самом начале. Во-первых, он автоматически «прикроет» административные порты, которые могут открываться по умолчанию при установке ПО. Во-вторых, ошибка в конфигурации фаервола может привести к потере доступа к виртуальной машине, а в начале пути такая ошибка стоит дешевле.


      sudo apt update
sudo apt install ufw

Затем разрешаем SSH, HTTP, HTTPS и выбираем политику по умолчанию: не пускать.


      ufw allow ssh
ufw allow http
ufw allow https
ufw default deny
ufw enable
ufw status

Отлично, защита настроена. Продолжаем.

Установка PostgreSQL

PostgreSQL уже есть в стандартных репозиториях Ubuntu. На момент написания статьи актуальная версия — 18, а менеджер пакетов устанавливает 16‑ю. Впрочем, этого достаточно, так как минимальное требование — 14‑я или новее.


      sudo apt update
sudo apt install postgresql postgresql-contrib

Теперь нужно подготовить базу для Mattermost. Открываем psql:


      sudo -u postgres psql

Вводим команды SQL:


      -- Создаем базу данных
CREATE DATABASE mattermost WITH ENCODING 'UTF8' LC_COLLATE='en_US.UTF-8' LC_CTYPE='en_US.UTF-8' TEMPLATE=template0;

-- Создаем пользователя. ПРИДУМАЙТЕ СВОЙ ПАРОЛЬ.
CREATE USER mmuser WITH PASSWORD 'mmuser-password';

-- Даем максимальные права пользователю над созданной БД
GRANT ALL PRIVILEGES ON DATABASE mattermost to mmuser;

-- Если у вас PostgreSQL 15 или новее, передаем владение базой и схемой пользователю
ALTER DATABASE mattermost OWNER TO mmuser;
\c mattermost
ALTER SCHEMA public OWNER TO mmuser;
GRANT USAGE, CREATE ON SCHEMA public TO mmuser;

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

На этом установка базы данных завершена. 

Установка nginx

Nginx — это легковесный веб-сервер и обратный прокси. В нашем примере он возьмет на себя задачи поддержки HTTPS, а также логирования запросов. В больших инсталляциях nginx также обеспечивает балансирование нагрузки между несколькими серверами Mattermost.

Как и ранее, nginx доступен в стандартных репозиториях Ubuntu, но там устаревшая версия, поэтому добавляем официальный APT-репозиторий.


      # Устанавливаем нужные утилиты
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring

# Скачиваем ключ репозитория
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

Убеждаемся, что ключ содержит отпечаток:

573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62

Проверим подлинность репозитория, получив информацию о скачанном GPG‑ключе без его фактической установки в систему:


      root@mattermost:~# gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
pub   rsa4096 2024-05-29 [SC]
      8540A6F18833A80E9C1653A42FD21310B49F6B46
uid                      nginx signing key <signing-key-2@nginx.com>

pub   rsa2048 2011-08-19 [SC] [expires: 2027-05-24]
      573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid                      nginx signing key <signing-key@nginx.com>

pub   rsa4096 2024-05-29 [SC]
      9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3
uid                      nginx signing key <signing-key-3@nginx.com>

Убедившись в совпадении ключа, добавляем репозиторий в список источников.


      echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.

Устанавливаем nginx.


      sudo apt update
sudo apt install nginx

По умолчанию в nginx есть заглушка, на которой можно протестировать работоспособность. Открываем файл /etc/nginx/conf.d/default.conf и редактируем директиву server_name.

Было:


      server_name  localhost;

Стало:


      server_name  chat.example.com;

Теперь запускаем nginx:


      systemctl start nginx

Проверяем, что заглушка доступна по указанному домену.

Скриншот условной заглушки сервера nginx.
Заглушка nginx.

Веб-сервер отдает страницу, но браузер подсвечивает, что подключение не защищено, то есть используется открытый HTTP вместо шифрованного HTTPS. Исправим.

Подключение SSL для домена

Устанавливаем certbot — программу, которая создает сертификаты Let’s Encrypt для доменов. Установим дополнительно плагин для nginx, что позволит подключить к нему HTTPS за меньшее количество действий.


      sudo apt install certbot python3-certbot-nginx

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


      certbot --nginx -d chat.example.com

В процессе работы программа уточнит email-адрес (обязательно), спросит согласие с условиями сервиса (обязательно) и поинтересуется желанием поделиться почтовым адресом с партнерами (опционально). Выглядит это так:


      root@mattermost:~# certbot --nginx -d chat.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): trex@example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.8-July-06-2026.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.
Requesting a certificate for chat.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/chat.example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/chat.example.com/privkey.pem
This certificate expires on 2026-12-10.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for chat.example.com to /etc/nginx/conf.d/default.conf
Congratulations! You have successfully enabled HTTPS on https://chat.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Еще раз заходим на chat.example.com и видим, что подключение защищено. 

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

Теперь можем перейти к установке главного компонента.

Установка Mattermost

Как и в случае с nginx, необходимо добавить официальный APT-репозиторий.

Официальная документация Mattermost предлагает скачать shell-скрипт и передать его на исполнение с правами суперпользователя. Такой сценарий возможен, но несет риски безопасности: скрипт может скачать вредоносный код.

Скачивайте скрипт и просматривайте его перед запуском, если нет альтернатив.


      curl -sL -o- https://deb.packages.mattermost.com/pubkey.gpg \
  | gpg --dearmor \
  | sudo tee /usr/share/keyrings/mattermost-archive-keyring.gpg > /dev/null

curl -o- https://deb.packages.mattermost.com/repo-setup.sh | sudo bash -s mattermost

Затем устанавливаем mattermost.


      sudo apt update
sudo apt install mattermost

Mattermost устанавливается в /opt/mattermost и создает пользователя mattermost, а также одноименную группу. Однако, сервис не стартует по умолчанию и не ожидает запуска базы данных. Редактируем файл /lib/systemd/system/mattermost.service и в конец секции [Unit] добавляем следующие строки:


      After=postgresql.service
BindsTo=postgresql.service

Затем даем команду перечитать systemd-юниты:


      systemctl daemon-reload

Теперь настраиваем Mattermost. Сперва копируем стандартый файл конфигурации:


      sudo install -C -m 600 -o mattermost -g mattermost \
  /opt/mattermost/config/config.defaults.json \
  /opt/mattermost/config/config.json

А затем редактируем /opt/mattermost/config/config.json. Изменяем следующие значения:

  • SqlSettings.DriverName — имя драйвера для подключения к СУБД, указываем postgres;
  • SqlSettings.DataSource — строка подключения к базе данных, в нашем случае postgres://mmuser:mmuser-password@127.0.0.1:5432/mattermost?sslmode=disable&connect_timeout=10;
  • ServiceSettings.SiteURL — домен, на котором развернут сервис, https://chat.example.com.
  • SupportSettings.SupportEmail — адрес, на который пользователи могут обратиться в случае проблем.

Запускаем Mattermost.


      systemctl start mattermost

Теперь, когда Mattermost работает, он слушает все подключения на порту 8065. К счастью, настроенный фаервол ограничивает подключения из интернета и ничего непоправимого не случилось. 

Осталось подружить Mattermost и nginx. Открываем /etc/nginx/conf.d/default.conf, добавляем upstream, указывающий на наш mattermost и заменяем директивы location. После правок файл должен выглядеть так:


      # Добавляем
upstream backend {
   server 127.0.0.1:8065;
   keepalive 32;
}

server {
    server_name  chat.example.com;

    # Добавляем
    location ~ /api/v[0-9]+/(users/)?websocket$ {
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        client_max_body_size 50M;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Frame-Options SAMEORIGIN;
        proxy_buffers 256 16k;
        proxy_buffer_size 16k;
        client_body_timeout 60s;
        send_timeout 300s;
        lingering_timeout 5s;
        proxy_connect_timeout 90s;
        proxy_send_timeout 300s;
        proxy_read_timeout 90s;
        proxy_http_version 1.1;
        proxy_pass http://backend;
    }

    # Добавляем
    location / {
        client_max_body_size 100M;
        proxy_set_header Connection "";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Frame-Options SAMEORIGIN;
        proxy_buffers 256 16k;
        proxy_buffer_size 16k;
        proxy_read_timeout 600s;
        proxy_http_version 1.1;
        proxy_pass http://backend;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/chat.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/chat.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = chat.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen       80;
    server_name  chat.example.com;
    return 404; # managed by Certbot
}

Перезагружаем файл конфигурации nginx:


      systemctl reload nginx

Теперь Mattermost ждет нас!

Настройка Mattermost

Скриншот приветственной страницы Mattermost.
Стартовое окно Mattermost.

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

Скриншот пригласительного меню программы обучения работе с Mattermost.
Обучение Mattermost.

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

Скриншот административной панели Mattermost.

В верхнем правом углу есть меню, из которого можно попасть в «админ-панель» — «System console». В этом меню можно:

  • управлять лицензией;
  • администрировать пользователями и каналами;
  • добавлять интеграции;
  • настраивать параметры Mattermost.

Именно на этом моменте заканчивается общая инструкция и начинается тонкая настройка под свои нужды.

Заключение

Mattermost — это хороший инструмент для корпоративного общения, подходящий для маленьких коллективов. Простая развертываемость на собственной инфраструктуре и небольшое потребление ресурсов делают его отличным решением с маленькими затратами.