Skip to content

Instantly share code, notes, and snippets.

@Miouyouyou
Last active April 28, 2020 12:02
Show Gist options
  • Select an option

  • Save Miouyouyou/0c6a15fcf7d56ae7263b525017b2f9f0 to your computer and use it in GitHub Desktop.

Select an option

Save Miouyouyou/0c6a15fcf7d56ae7263b525017b2f9f0 to your computer and use it in GitHub Desktop.
Fichier Docker-compose pour Mattermost avec config d'un Reverse Proxy HAProxy en prime
version: '2.4'
# Le réseau rproxy_network est un réseau créé via :
# docker network create rproxy_network
# (Au moins) Un reverse proxy est censé être connecté au réseau
# rproxy_network.
# Ce proxy va gérer les certificats SSL et rediriger les connexions
# vers le serveur de chat Mattermost, accessible depuis l'adresse
# 'mattermost:8065' sur le même réseau.
# Le déploiement et la connexion du reverse proxy au réseau
# rproxy_network est faite au travers d'un autre fichier
# docker-compose.yml (ou à la main, si vous savez comment faire).
# Quelques indications sont fournies plus bas sur comment
# mettre en place un reverse proxy 'HAProxy', sur ce même réseau,
# et rediriger les requêtes vers le chat.
services:
postgres:
image: "postgres:9.4"
restart: always
networks:
internal:
aliases:
- postgres
environment:
POSTGRES_USER: SuperNomDUtilisateurQueJeConseilleDeChanger
POSTGRES_PASSWORD: CeMotDePasseTiendraPas30Secondes
POSTGRES_DB: mattermost
volumes:
- "mm_pgdata:/var/lib/postgresql/data"
elasticsearch:
image: "mattermost/mattermost-elasticsearch-docker"
networks:
internal:
aliases:
- elasticsearch
environment:
ELASTIC_PASSWORD: ApresOnEstSurUnReseauInterne
volumes:
- "mm_esdata:/usr/share/elasticsearch/data"
mattermost:
image: "mattermost/mattermost-team-edition"
networks:
internal:
aliases:
- mattermost
rproxy_network:
aliases:
- mattermost
volumes:
- "./mm/data:/mattermost/data"
- "./mm/logs:/mattermost/logs"
- "./mm/config:/mattermost/config"
- "./mm/plugins:/mattermost/plugins"
- "./mm/client/plugins:/mattermost/client/plugins"
networks:
internal:
driver: bridge
rproxy_network:
external: true
volumes:
mm_pgdata:
mm_esdata:
version: '3'
# HAProxy requiert des certificats PEM contenant à la fois :
# - Le certificat en lui même
# - Tous les certificats de la chaîne de confiance
# - La clef privée utilisée pour signer le certificat.
# Si vous récupérer vos certificats SSL via Let's Encrypt,
# voici comment vous pouvez concatener le tout, et l'utiliser
# ensuite via HAProxy :
# cat fullchain.pem privkey.pem > concat.pem
# Vous pouvez ensuite agrafer un OCSP à votre certificat, pour
# accélérer les connexions SSL :
# openssl ocsp -issuer chain.pem -cert fullchain.pem -respout concat.pem.ocsp -noverify -no_nonce -url http://ocsp.int-x3.letsencrypt.org
services:
haproxy:
image: haproxy:latest
volumes:
- "./haproxy/config:/usr/local/etc/haproxy:ro"
- "/path/to/your/letsencrypt/live:/etc/ssl/mine:ro" # Z'êtes pas obligé d'utiliser Let's Encrypt.
- "/dev/log:/dev/log"
restart: always
ports:
- 80:80
- 443:443
networks:
rproxy_network:
aliases:
- haproxy
- loadbalancer
networks:
rproxy_network:
external: true
# A placer dans ./haproxy/config
global
daemon
maxconn 1024
tune.ssl.default-dh-param 4096
log /dev/log local0
ssl-default-bind-options no-tls-tickets
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK:!DSS:!SRP:!LOW
defaults
mode http
timeout connect 10s
timeout client 20s
timeout server 20s
timeout tarpit 1m
log global
frontend blogfront
bind :80
bind :443 ssl crt /etc/ssl/mine/votre-domaine.fr/concat.pem ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3 alpn h2,http/1.1
# Si vous avez plusieurs domaines, avec des certificats différents pour chacun
# bind :443 ssl crt /etc/ssl/mine/votre-domaine.fr/concat.pem crt /etc/ssl/mine/chat.votre-domaine.fr/concat.pem crt /etc/ssl/mine/encore-un-autre-domaine.com/concat.pem ssl-min-ver TLSv1.0 ssl-max-ver TLSv1.3 alpn h2,http/1.1
mode http
option httplog
default_backend chat
# Pour rediriger les requêtes vers le bon serveur, en fonction
# du nom de domaine, vous pouvez faire ça : (fonctionne qu'en SSL)
# use_backend chat if { ssl_fc_sni chat.votre-domaine.fr }
# default_backend blogback
backend chat
mode http
option http-keep-alive
balance roundrobin
server chat pouipmaster:8065 check
# Configuration d'une redirection vers un serveur NGINX servant
# des sites statiques (Hugo, Jekyll), ainsi que les fichiers
# nécessaires à Let's Encrypt.
# Le serveur NGINX est normalement connecté au réseau rproxy_network,
# et son alias sur le réseau est 'blog'
# Si c'est chelou, ça dégage
#backend blogback
# mode http
# balance roundrobin
# Pour servir les fichiers nécessaires à Let's Encrypt,
# il faut accepter les requêtes vers tous les noms de domaines
# pour lesquels on veut un certificat SSL
# acl valid_domains hdr_dom(Host) -i votre-domaine.fr chat.votre-domaine.fr encore-un-autre-domaine.com
# http-request deny if !valid_domains
# acl valid_method method GET OPTION HEAD
# acl have_payload hdr_val(content-length) gt 0
# acl php_file path_end .php
# http-request deny if !valid_method OR have_payload OR php_file
# http-response set-header Strict-Transport-Security "max-age=16000000; includeSubDomains; preload;" if { ssl_fc }
# server web01 blog:80 check
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment