Installer Mattermost avec Docker

Guide d'installation de Mattermost sous Docker.

Installer Mattermost avec Docker
mattermost docker

Au sommaire :

  • 1-Qu'est-ce que Mattermost ?
  • 2-Prérequis
  • 3-Déploiement
  • 4-Configuration

Si vous cherchez à mettre en place une messagerie collaborative, jetez un œil à ces deux autres tutoriels.

Installer Rocket.Chat avec Docker
Guide d’installation de Rocket.Chat sous Docker.
Installer Synapse et Element avec Docker
Guide d’installation de Synapse et Element sous Docker.

1-Qu'est-ce que Mattermost ?

Mattermost est une messagerie collaborative open-source écrite en langage Go concurrente de Slack, MS-Teams, Rocket.Chat et Element.

Maintenue par la société Mattermost Inc et publié en 2015 en version 1.0 (elle servait auparavant pour un studio de jeu vidéo), elle est une des premières alternatives à la solution Slack, rachetée depuis par Salesforce pour la coquette somme de 27,7 milliards de dollars.

Salesforce rachète Slack pour 27,7 milliards de dollars
Salesforce s’offre Slack, c’est officiel !

Si vous avez suivi mon tutoriel sur Rocket.Chat, c'est du même acabit, c'est une messagerie collaborative avec des canaux de discussion publics et privés, un certain niveau de sécurité (chiffrement, authentification à plusieurs facteurs) et une API qui lui permet de s'intégrer à tout type d’écosystème.

À noter que seul le code source de la "team-edition" est sous licence MIT tandis que le code additionnel de la "entreprise édition" est propriétaire.

Petit détail qui peut faire pencher la balance en sa faveur si vous hésitez à choisir une solution de messagerie collaborative, il existe un service nommé Gitlab-Mattermost qui s’intègre parfaitement à GitLab pour pouvoir permettre à vos équipes d'être plus productives.

Mattermost and GitLab integrate to help teams ship software effectively
Learn how Mattermost and GitLab offer a command center experience with deep connections, interactions, automations for effective and efficient software delivery.

2-Prérequis

Il vous faudra une machine virtuelle sous Ubuntu Server 22.04 LTS.

Voici le guide pour ceux qui veulent repartir de zéro.

Virtualiser Ubuntu Server 22.04 LTS sur Proxmox VE
Guide d’installation de Ubuntu Server 22.04 LTS sur Proxmox VE avec mes meilleurs réglages.

Si vous voulez gagner du temps, utilisez un template cloud-init.

Initialiser vos machines virtuelles avec Cloud-init sur Proxmox VE
Guide d’installation de Cloud-Init qui va vous permettre d’automatiser vos déploiements

Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.

Installer Docker
Guide d’installation de Docker.

Enfin, pour exposer l'application sur l'internet public, il vous faudra déployer Traefik.

Installer Traefik avec Docker
Guide d’installation de Traefik.

3-Déploiement

Commencez par créer un dossier "docker" à la racine du dossier utilisateur"

mkdir -p ~/docker

Créez un fichier nommé "compose.yml"

touch ~/docker/compose.yml

Ouvrez le fichier "compose.yml" et copiez cette configuration.

Je me base sur le fichier docker-compose du dépôt GitHub que j'ai retaper à l'occasion :

  • Ajout de Traefik et des labels
  • Suppression dans la section "volumes" de ":rw" (lecture/écriture) qui est inutile à indiquer (activé par défaut)
  • Suppression de l'option "pids_limit" qui a été supprimés dans les dernières versions de docker-compose
  • Suppression de l'option "read_only"
GitHub - mattermost/docker: Install Mattermost server via Docker
Install Mattermost server via Docker. Contribute to mattermost/docker development by creating an account on GitHub.
version: "3.9"

networks:
  web:
  database:

services:

  traefik:
    container_name: traefik
    image: traefik:latest
    restart: always
    network:
      web:
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ${APPDATA}/traefik/logs:/logs
      - ${APPDATA}/traefik/traefik.yml:/traefik.yml
      - ${APPDATA}/traefik/dynamic.yml:/dynamic.yml
      - ${APPDATA}/traefik/letsencrypt/acme.json:/acme.json
    labels:
      - traefik.enable=true
      - traefik.http.routers.traefik-dash.entrypoints=websecure
      - traefik.http.routers.traefik-dash.rule=Host(`traefik.<votredomaine>.ovh`)
      - traefik.http.routers.traefik-dash.service=api@internal
      - "traefik.http.routers.traefik.middlewares=middlewares-basic-auth@file"

  mattermost:
    image: mattermost/mattermost-team-edition:latest
    container_name: mattermost
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    read_only: false
    tmpfs:
      - /tmp
    volumes:
      - ${APPDATA}/mattermost/config:/mattermost/config:rw
      - ${APPDATA}/mattermost/data:/mattermost/data:rw
      - ${APPDATA}/mattermost/logs:/mattermost/logs:rw
      - ${APPDATA}/mattermost/plugins:/mattermost/plugins:rw
      - ${APPDATA}/mattermost/client:/mattermost/client/plugins:rw
      - ${APPDATA}/mattermost/bleve-indexes:/mattermost/bleve-indexes:rw
    environment:
      - TZ=${TZ}
      - MM_SQLSETTINGS_DRIVERNAME=postgres
      - MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:mattermost@postgres:5432/mattermost?sslmode=disable&connect_timeout=10
      - MM_BLEVESETTINGS_INDEXDIR=/mattermost/bleve-indexes
      - MM_SERVICESETTINGS_SITEURL=https://<votre_nom_de_domaine>
    depends_on:
      - mattermostdb
    networks:
      - t2_proxy
      - database
    labels:
      - traefik.enable=true
      - traefik.http.routers.mattermost.entrypoints=websecure
      - traefik.http.routers.mattermost.tls.certresolver=letsencrypt
      - traefik.http.routers.mattermost.rule=Host(`votre_nom_de_domaine`)
      - traefik.http.routers.mattermost.service=mattermost-svc
      - traefik.http.services.mattermost-svc.loadbalancer.server.port=8065
      
  postgres:
    image: postgres:13-alpine
    container_name: postgres
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    tmpfs:
      - /tmp
      - /var/run/postgresql
    networks:
      - database
    volumes:
      - ${APPDATA}/postgres:/var/lib/postgresql/data
    environment:
      - TZ=${TZ}
      - POSTGRES_USER=mattermost
      - POSTGRES_PASSWORD=mattermost
      - POSTGRES_DB=mattermost

L'option "no-new-privileges" empêche l'utilisateur "non-root" du conteneur d'avoir des accès privilégiés.

Exemple : si votre conteneur est compromis, l'attaquant pourra effectuer une escalade des priviléges et être en root.

En l’occurrence pour Mattermost, l'utilisateur porte le même nom que l'application avec comme PGID/PUID (groupe/utilisateur) 2000.

Note : cette option devrait être ajouté à tout vos conteneurs qui ont des comptes "non-root" comme les images de chez linuxserver.io par exemple.

Pour en savoir plus.

Docker Capabilities and no-new-privileges
    security_opt:
      - no-new-privileges:true

Mattermost a besoin d'écrire des données temporaires. indiquez comme chemin "/tmp" qui se trouvera à la racine du conteneur.

    tmpfs:
      - /tmp

Ensuite il va falloir indiquer le chemin du dossier de l'application mais aussi les sous-dossiers (config, data, logs, plugins, client, bleve-indexes).

    volumes:
      - ${APPDATA}/mattermost/config:/mattermost/config
      - ${APPDATA}/mattermost/data:/mattermost/data
      - ${APPDATA}/mattermost/logs:/mattermost/logs
      - ${APPDATA}/mattermost/plugins:/mattermost/plugins
      - ${APPDATA}/mattermost/client:/mattermost/client/plugins
      - ${APPDATA}/mattermost/bleve-indexes:/mattermost/bleve-indexes

Commencez par créer le dossier "mattermost' ainsi que les sous-dossiers avec la commande suivante (très utile au passage).

mkdir -p mattermost/{config,data,logs,plugins,client,bleve-indexes}

Puis appliquez les droits de l'utilisateur du conteneur (mattermost, 2000:2000) pour qu'il puisse écrire des données persistantes sur le système hôte.

sudo chown -R 2000:2000 mattermost

Enfin indiquez dans les variables d'environnement :

  • TZ : Le fuseau horaire
  • MM_SQLSETTINGS_DRIVERNAME : indiquez postgres comme driver de base de données
  • MM_SQLSETTINGS_DATASOURCE : l'adresse qui va permettre à Mattermost d'accéder à la base de données de PostgreSQL. L'adrese se présente sous la forme suivante : postgres://user:password@nom_du_conteneur:numéro_de_port_du_conteneur/nom_de_la_base_de_données?sslmode=disable&connect_timeout=10 (SSL désactivé, délai d'attente de 10 secondes).
  • MM_BLEVESETTINGS_INDEXDIR : le chemin du dossier (dans le conteneur) de "bleve-indexes"
  • MM_SERVICESETTINGS_SITEURL : le nom de domaine de l'application
    environment:
      - TZ=${TZ}
      - MM_SQLSETTINGS_DRIVERNAME=postgres
      - MM_SQLSETTINGS_DATASOURCE=postgres://mattermost:mattermost@postgres:5432/mattermost?sslmode=disable&connect_timeout=10
      - MM_BLEVESETTINGS_INDEXDIR=/mattermost/bleve-indexes
      - MM_SERVICESETTINGS_SITEURL=https://votre_nom_de_domaine

Enfin, l'application écoute sur le port 8065 en local.

PostgreSQL

L'option "no-new-privilege" est toujours présente ainsi que les dossiers temporaires pour l'écriture de données persistentes.

Ensuite, indiquez dans les variables d'environnement :

  • TZ : le fuseau horaire
  • POSTGRES_USER : le compte utilisateur de la base de données
  • POSTGRES_PASSWORD : le mot de passe de l'utilisateur
  • POSTGRES_DB : le nom de la base de données

Maintenant qu'on a fait un tour d'horizon de la configuration, il va falloir déployer la stack.

Déployez avec la commande suivante.

docker compose up -d

4-Configuration

Tapez le nom de domaine de l'application, vous devriez tomber sur cette page d'accueil.

Cliquez sur "View in Browser" pour utiliser la version web.

Note : sachez qu'en indiquant l'adresse web de votre instance, vous pouvez évidemment utiliser le client bureautique et l'application mobile.

Indiquez une adresse mail, un pseudo et un mot de passe puis cliquez sur "Create Account".

Cliquez sur "Create a team" pour créer une équipe.

Indiquez le nom de cette équipe puis cliquez sur "Next".

Indiquez un préfixe à votre nom de domaine facilement mémorisable pour que vos amis ou collègues puissent accéder directement au canal de l'équipe.

Félicitation!!!!! Votre instance est désormais opérationnelle.