From f207a03c43fa3c1cc89a811790e5103fa0f91262 Mon Sep 17 00:00:00 2001
From: Quentin Duchemin <quentinduchemin@tuta.io>
Date: Fri, 7 Aug 2020 15:54:17 +0200
Subject: [PATCH] [Traefik] Add files for all VMs, configuration and
 documentation

---
 pica-traefik/README.md          | 42 +++++++++++++++++++++++++++++++++
 pica-traefik/docker-compose.yml | 18 ++++++++++++++
 pica-traefik/traefik.toml       | 35 +++++++++++++++++++++++++++
 3 files changed, 95 insertions(+)
 create mode 100644 pica-traefik/README.md
 create mode 100644 pica-traefik/docker-compose.yml
 create mode 100644 pica-traefik/traefik.toml

diff --git a/pica-traefik/README.md b/pica-traefik/README.md
new file mode 100644
index 00000000..0544aa4a
--- /dev/null
+++ b/pica-traefik/README.md
@@ -0,0 +1,42 @@
+## Traefik
+
+Ce dossier contient les ressources nécessaires pour lancer Traefik, un reverse proxy adapté pour Docker.
+C'est la pièce la plus importante de l'infrastructure, puisque l'ensemble des communications HTTP(S) passent d'abord par Traefik, et il est aussi utilisé pour [générer des certificats pour les services TCP](../pica-tls-certs-monitor).
+
+Ce service doit être lancé sur l'ensemble des machines de l'infrastructure.
+
+### Configuration
+
+La configuration a lieu dans le fichier [traefik.toml](./traefik.toml).
+Notez que toute modification dans ce fichier impactera l'ensemble des machines, puisque le même fichier est utilisé pour l'ensemble des machines.
+
+À des fins de tests, il peut être modifié localement sur les machines, mais doit toujours rester synchronisé avec ce dépôt à long terme.
+
+Pour la génération des certificats, Traefik utilise Let's Encrypt. Il n'y a aucune configuration à faire de ce côté. Attention, le nombre de certificats générables est limité à 50 par semaine.
+
+Si on lance plein de conteneurs de tests, on utilisera temporairement [l'environnement de qualification](https://letsencrypt.org/fr/docs/staging-environment/) de Let's Encrypt, en ajoutant la directive `caServer = "https://acme-staging-v02.api.letsencrypt.org/directory"` sous la section `[acme]`.
+
+### Lancement
+
+Assurez-vous que le dossier `/DATA/docker/traefik/certs` existe.
+C'est dans ce dossier que seront conservés tous les certificats générés par Traefik.
+
+### Mise à jour
+
+Il suffit de mettre à jour le tag de l'image dans Compose.
+Attention, Traefik v2 introduit énormément de changements et [nous ne sommes pas certains](https://wiki.picasoft.net/doku.php?id=technique:adminsys:migration-traefik-v2) de la manière d'effectuer la migration.
+
+Aussi, Traefik v1.6 est utilisé pour tenterd d'éviter un bug introduit dans la 1.7, qui rend certains services redémarrés inaccessibles (voir [cette discussion](https://team.picasoft.net/picasoft/pl/66aorsxhtffrjytyhnecn436wa)).
+
+Avant toute mise à jour, il faudra discuter avec l'équipe technique et modifier ce README le cas échéant.
+
+### Todo
+
+*Voir si on peut passer Traefik en "host" au niveau du réseau pour qu'il ait accès à tous les réseaux* :
+https://kanban.picasoft.net/b/7fCn765LCNGraBhxA/team-technique-picasoft/kjvc3iw2pFvszCTcR
+
+Actuellement, Traefik est dans le réseau `docker_default` sur toutes les machines, et les conteneurs souhaitant être accessibles via Traefik doivent être explicitement dans ce réseau.
+
+Ceci induit une complexité supplémentaire au niveau des fichiers Compose.
+
+Il serait peut être bon de permettre à Traefik d'accéder à tous les réseaux et de supprimer énormément de directives "inutiles" dans les Compose.
diff --git a/pica-traefik/docker-compose.yml b/pica-traefik/docker-compose.yml
new file mode 100644
index 00000000..daaf9802
--- /dev/null
+++ b/pica-traefik/docker-compose.yml
@@ -0,0 +1,18 @@
+version: '3.7'
+
+services:
+  traefik:
+  container_name: traefik
+  # DO NOT UPGRADE
+  # SEE THIS BEFORE AND DISCUSS : https://team.picasoft.net/picasoft/pl/66aorsxhtffrjytyhnecn436wa
+  image: traefik:1.6.6
+  ports:
+    - "80:80"
+    # Uncomment to expose the web interface. Warning : do not use without setting a password in traefik.toml
+    #- "8080:8080"
+    - "443:443"
+  volumes:
+    - /var/run/docker.sock:/var/run/docker.sock
+    - ./traefik.toml:/traefik.toml
+    - /DATA/docker/traefik/certs:/certs
+  restart: always
diff --git a/pica-traefik/traefik.toml b/pica-traefik/traefik.toml
new file mode 100644
index 00000000..35146198
--- /dev/null
+++ b/pica-traefik/traefik.toml
@@ -0,0 +1,35 @@
+logLevel = "INFO"
+debug = true
+defaultEntryPoints = ["http", "https"]
+
+[docker]
+endpoint = "unix:///var/run/docker.sock"
+watch = true
+exposedbydefault = false
+
+[api]
+
+[entryPoints]
+ [entryPoints.http]
+  address = ":80"
+  compress = false
+  [entryPoints.http.redirect]
+   entryPoint = "https"
+ [entryPoints.https]
+  address = ":443"
+  compress = false
+  [entryPoints.https.tls]
+   # Accept only TLS1.1 and 1.2
+   MinVersion = "VersionTLS11"
+   # Accept all ciphers excepting TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA and TLS_RSA_WITH_3DES_EDE_CBC_SHA
+   # CipherSuites = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA","TLS_RSA_WITH_AES_128_GCM_SHA256","TLS_RSA_WITH_AES_256_GCM_SHA384","TLS_RSA_WITH_AES_128_CBC_SHA","TLS_RSA_WITH_AES_256_CBC_SHA" ]
+   # Keep only ECDHE :
+   CipherSuites = ["TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA","TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA" ]
+
+[acme]
+ email = "picasoft@assos.utc.fr"
+ storage = "/certs/acme.json"
+ entryPoint = "https"
+ onHostRule = true
+ [acme.httpChallenge]
+  entryPoint = "http"
-- 
GitLab