Installer Mattermost avec 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.
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.
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.
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.
Si vous voulez gagner du temps, utilisez un template cloud-init.
Ensuite, suivez ce guide pour installer Docker, Docker Compose et préparer vos variables d'environnement.
Enfin, pour exposer l'application sur l'internet public, il vous faudra déployer 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"
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.
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.