picture of my face

Vincent Déniel

Développeur chez Yaal

Déployer un container docker Mattermost sur un serveur privé avec Nginx

De nombreux développeurs utilisent quotidiennement Slack. Mais son usage peut lever des questions de respect de la vie privée. Slack n'est pas open source, ni hébergeable sur son propre serveur. Nous allons voir comment deployer Mattermost, une alternative open source à Slack, sur un serveur privé. Nous utiliserons le container docker officiel et l'exposerons avec Nginx.

Prérequis

  • docker (version 1.10.0+)
  • docker-compose version (version 1.6.0+ to support Compose file version 2.0)
  • nginx
  • certbot (nous utiliserons Let's Encrypt pour ajouter un certificat)

Déploiement du container docker

On clone le repository :

git clone https://github.com/mattermost/mattermost-docker.git

cd mattermost-docker

Nous allons maintenant éditer le fichier docker-compose.yml. Etant donné que nous allons exposer le service avec Nginx, la partie web: ne sera pas nécessaire. On ajoute le port sur lequel sera exposé le service sur le serveur local (ports:) et on lie la container db (links:). Le fichier modifié devrait ressembler à ceci :

version: "2"

services:

  db:
    build: db
    restart: unless-stopped
    volumes:
      - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data
      - /etc/localtime:/etc/localtime:ro
    environment:
      - POSTGRES_USER=mmuser
      - POSTGRES_PASSWORD=mmuser_password
      - POSTGRES_DB=mattermost
    # uncomment the following to enable backup
    #  - AWS_ACCESS_KEY_ID=XXXX
    #  - AWS_SECRET_ACCESS_KEY=XXXX
    #  - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH
    #  - AWS_REGION=us-east-1

  app:
    build:
      context: app
      # comment out 2 following lines for team edition
      # args:
      #   - edition=team
    restart: unless-stopped
    volumes:
      - ./volumes/app/mattermost/config:/mattermost/config:rw
      - ./volumes/app/mattermost/data:/mattermost/data:rw
      - ./volumes/app/mattermost/logs:/mattermost/logs:rw
      - /etc/localtime:/etc/localtime:ro
    environment:
      # set same as db credentials and dbname
      - MM_USERNAME=mmuser
      - MM_PASSWORD=mmuser_password
      - MM_DBNAME=mattermost
      # in case your config is not in default location
      #- MM_CONFIG=/mattermost/config/config.json
    ports:
      - "8081:80"
    links:
      - db:db

On lance maintenant : docker-compose build puis docker-compose up -d

Mattermost est maintenant exposé sur http://localhost:8081 sur notre serveur

Configurer Nginx

On crée un fichier de configuration pour notre serveur Mattermost, par exemple : /etc/nginx/sites-avalaible/mattermost.example.com Dans ce fichier, allons créer un serveur Nginx pour le domaine https://mattermost.example.com sur lequel sera installé Mattermost.

server {
    server_name mattermost.example.com;
}

Activons la configuration :

ln -s /etc/nginx/sites-available/mattermost.example.com /etc/nginx/sites-enabled/

Ajout du certificat SSL

Ensuite, nous lançons le Certbot pour ajouter un certificat https à notre sous domaine :

sudo certbot --authenticator standalone --installer nginx

Suivez les instructions pour ajouter le certificat. Evidemment, on sélectionnera une redirection d'http vers https, qui voudrait réellement utiliser une messagerie qui ne serait pas chiffrée ? La configuration devrait ressembler à ceci :

server {
    server_name mattermost.example.com;

    listen 80; # managed by Certbot

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mattermost.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mattermost.example.com/privkey.pem; # managed by Certbot
    ssl_session_cache shared:le_nginx_SSL:1m; # managed by Certbot
    ssl_session_timeout 1440m; # managed by Certbot

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # managed by Certbot
    ssl_prefer_server_ciphers on; # managed by Certbot

    ssl_ciphers "<SECRET>"; # managed by Certbot

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

Finir la configuration

Completons maintenant la configuration, tel que décrit ici https://wiki.archlinux.org/index.php/Mattermost#nginx

upstream mattermost {
    server 127.0.0.1:8081;
}

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mattermost_cache:10m max_size=3g inactive=120m use_temp_path=off;

server {
    server_name mattermost.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 $http_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_pass http://mattermost;
    }

    location / {
        client_max_body_size 50M;
        proxy_set_header Connection "";
        proxy_set_header Host $http_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_cache mattermost_cache;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 2;
        proxy_cache_use_stale timeout;
        proxy_cache_lock on;
        proxy_pass http://mattermost;
    }

    listen 80; # managed by Certbot

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mattermost.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mattermost.example.com/privkey.pem; # managed by Certbot
    ssl_session_cache shared:le_nginx_SSL:1m; # managed by Certbot
    ssl_session_timeout 1440m; # managed by Certbot

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # managed by Certbot
    ssl_prefer_server_ciphers on; # managed by Certbot

    ssl_ciphers "<SECRET>"; # managed by Certbot

    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
}

On recharge la configuration : sudo service nginx reload et voilà ! Vous pouvez maintenant accéder à votre serveur mattermost : https://mattermost.example.com

Customiser son serveur

Le fichier de configuration se trouve dans volumes/app/mattermost/config/config.json (chemin relatif à partir du dossier mattermost-docker)

On peut notamment y configurer le SiteURL afin de faire disparaître le bandeau bleu apparaissant à la première connection sur le site.

On peut aussi y activer les notifications push pour les applications mobiles :

"SendPushNotifications": true,
"PushNotificationServer": "https://push.mattermost.com/",
"PushNotificationContents": "generic,

Après cela, vous devriez avoir un serveur Mattermost fonctionnel et customisable. Il ne reste plus qu'à inviter votre équipe à l'utiliser !