Ceci est une ancienne révision du document !


Déployer un serveur Mattermost

Introduction

Mattermost est un système de messagerie instantanée open source conçu pour un usage privé. Ce tutoriel explique le mettre en place un afin d'échanger des messages au sein d'un même réseau local ou via Internet.

Contrairement à Microsoft Teams ou Slack, Mattermost ne supporte que les messages texte, et non les appels audio ou vidéo. Il a néanmoins l'avantage de pouvoir être personnalisé grâce à l'intégration d'applications tierces, et de permettre l'authentification via LDAP dans la version Entreprise.

On utilisera ici la version Team de Mattermost, qui est gratuite et propose moins de fonctionnalités que la version Entreprise. Elle sera installée sous Debian 12 et les clients pour les tests seront sous Windows 10.

Topologie du LAB

Une fois mis en œuvre, l'infrastructure devrait ressembler à ça (rien de bien complexe) :

Topologie du LAB : Installer et configuration de Mattermost

Pré-requis

Nous aurons besoin de :

  • Une machine (virtuelle ou physique) sous Linux (de préférence Debian 12 qui sera utilisé dans ce tutoriel) avec au moins 2Go de RAM.
  • Deux machines (virtuelles ou physiques) sous n'importe quel OS compatible avec le client lourd Mattermost et connectées au même réseau local que la première machine.

Instructions

Configuration de la base de données

Tout d'abord, installer un SGBD tel que mariadb :

apt install mariadb-server

Sécuriser le serveur en utilisant le script mysql_secure_installation qui permet de supprimer les utilisateurs anonymes et d'interdire la connexion à distance avec l'utilisateur root :

mysql_secure_installation

Suivre les instructions jusqu'au bout, puis se connecter à la CLI du SGBD :

mysql -u root -p

Executer les requêtes SQL suivantes afin de créer la base de données et un utilisateur dédié :

CREATE SCHEMA mattermost;
CREATE USER 'mattermost'@'%';
SET PASSWORD FOR 'mattermost'@'%' = PASSWORD('MyPassword!');
GRANT ALL ON mattermost.* TO 'mattermost'@'%' IDENTIFIED BY 'MyPassword!' WITH GRANT OPTION;
FLUSH PRIVILEGES;

:!: Attention à bien remplacer MyPassword! dans les commandes ci-dessus par le mot de passe qui sera utilisé pour la connexion à la BDD.

Taper quit pour sortir de la CLI mariadb.

La configuration de la base de données est réalisée. Passons à l'installation du serveur Mattermost.

Installation et configuration du serveur

Installation

Télécharger Mattermost sur le serveur au format tarball :

wget https://releases.mattermost.com/9.1.1/mattermost-9.1.1-linux-amd64.tar.gz

:!: L'URL de l'archive à jour peut être trouvée sur la page suivante : https://docs.mattermost.com/install/install-tar.html

Décompresser l'archive dans le répertoire /opt/ qui sera le chemin d'installation de Mattermost :

tar xvzf mattermost-9.1.1-linux-amd64.tar.gz -C /opt/

Ajouter un répertoire data dans le répertoire de Mattermost afin de stocker les fichiers que les utilisateurs s'échangeront :

mkdir /opt/mattermost/data

Et créer un utilisateur système qui aura tous les droits sur le répertoire d'installation :

useradd --system --user-group mattermost
chown -R mattermost:mattermost /opt/mattermost
chmod -R g+w /opt/mattermost

Configuration

Maintenant que Mattermost est installé, éditer sa configuration :

nano /opt/mattermost/config/config.json

C'est là que sont stockés tous les paramètres du serveur.

D'abord, modifier l'URL du serveur en mettant l'IP ou un nom de domaine associé à la machine :

"SiteURL": "https://192.168.1.201",

Changer les paramètres SQL pour correspondre à la BDD que l'on a préparée avant :

  "SqlSettings": {
    "DriverName": "mysql",
    "DataSource": "mattermost:MyPassword!@tcp(localhost:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s",

Puis adapter les autres paramètres comme nécessaire.

Explication de certains paramètres :

  • ServiceSettings
    • SiteURL : URL de votre application. Vous pouvez utiliser l'IP du serveur si vous ne disposez pas de domaine.
  • SqlSettings
    • DriverName : nous utilisons le driver mysql
    • DataSource : information de connexion à la base de données. Adaptez le nom de l'utilisateur et le mot de passe
  • FileSettings
    • Directory : adaptez si vous utilisez un emplacement spécifique pour le stockage des fichiers, sinon laisser la valeur par défaut.
  • PluginSettings
    • Directory : chemin des plugins, la valeur par défaut provoque chez moi des erreurs au démarrage du serveur, il semble préférable d'indiquer le chemin absolu.
    • ClientDirectory : chemin des plugins client, la valeur par défaut provoque chez moi des erreurs au démarrage du serveur, il semble préférable d'indiquer le chemin absolu.

Création du service

On va désormais créer le service Linux qui exécutera Mattermost, via systemd :

nano /lib/systemd/system/mattermost.service

Y insérer ceci :

[Unit]
Description=Mattermost
After=network.target
After=mysql.service
Requires=mysql.service

[Service]
Type=notify
User=mattermost
Group=mattermost
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
LimitNOFILE=49152

[Install]
WantedBy=mariadb.service

Ensuite recharger systemd et activer le service au lancement de la machine :

systemctl daemon-reload
systemctl enable mattermost

On peut enfin démarrer Mattermost par le biais de ce service :

systemctl start mattermost

Vérifier que le service a bien démarré :

systemctl status mattermost.service

Il doit être dans l'état Active : active (running), sinon c'est qu'il y a eu une erreur de commise lors des étapes précédentes.

La configuration de Mattermost sur le serveur est terminée. Penser à configurer les enregistrements DNS nécessaire pour joindre le serveur via son nom de domaine (sauf si on utilise une IP).

Pour vérifier que c'est fonctionnel, ouvrir un navigateur web sur un poste client et entrer l'adresse du serveur, suivi du port 8065 (port par défaut) : Interface Web de Mattermost

Pour finaliser le paramétrage (création d'une instance, gestion des comptes, etc…) il faut s'inscrire sur l'interface web et suivre l'assistant.

Configuration du serveur Web

Dans cette partie, on configure la réécriture d'URL pour sécuriser les usages extérieurs. Si l'installation de Mattermost en cours n'a pas destination à être utilisée en dehors du réseau local, passer cette étape.

Ici, on utilisera Apache, mais il est possible d'en utiliser un autre (Caddy, Nginx…).

Installer d'abord le paquet :

apt-get install apache2

Ensuite, on active les modules apache suivants :

a2enmod ssl
a2enmod rewrite
a2enmod expires
a2enmod headers
a2enmod http2
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_wstunnel

Puis, créer un nouveau VHost (site virtuel) :

nano /etc/apache2/sites-available/mattermost.conf

Insérer dans le fichier le code suivant, en prenant soin de modifier les directives ServerAdmin, ServerName, ProxyPassReverseCookieDomain et RewriteCond avec les bons paramètres (commentés) :

<VirtualHost *:80>
    ServerAdmin webmaster@localhost #adresse mail administrateur
    ServerName 192.168.1.201 #URL de l'appli

    ProxyPreserveHost On

    RewriteEngine On
    RewriteCond %{REQUEST_URI} /api/v[0-9]+/(users/)?websocket [NC]
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} \bUpgrade\b [NC]
    RewriteRule .* ws://127.0.0.1:8065%{REQUEST_URI} [P,QSA,L]

    <Location />
        Require all granted
        ProxyPass http://127.0.0.1:8065/
        ProxyPassReverse http://127.0.0.1:8065/
        ProxyPassReverseCookieDomain 127.0.0.1 192.168.1.201 #URL de l'appli (à la fin)
    </Location>

    RewriteCond %{SERVER_NAME} =192.168.1.201 #URL de l'appli (à la fin)
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Et activer le site comme ceci :

a2ensite mattermost
systemctl reload apache2

On peut aussi installer Certbot pour activer SSL, dans le cas où on aurait besoin d'un certificat SSL pour un serveur accessible depuis l'extérieur avec un nom de domaine :

apt-get install certbot python3-certbot-apache

:!: Certbot ne permet de générer des certificats SSL que pour des noms de domaines. Le site doit être accessible depuis Internet pour que ça fonctionne.

Rétention des données

Dans le cas où on Mattermost serait mis en place dans une entreprise, on peut automatiser la suppression des anciens messages à l'aide d'une requêtes SQL toute simple :

DELETE FROM Posts WHERE CreateAt > DATE_FORMAT(NOW() - INTERVAL 30 DAY, "%Y-%m-%d 00:00:00");

Ici, la commande supprime tous les messages de plus de 30 jours. Évidemment, c'est ajustable.

Test

Etape 2

Sous-étape 2.1

Sous-étape 2.2

Etape 3

Vérifications

Sources