initial commit
This commit is contained in:
3
traefik/.gitignore
vendored
Normal file
3
traefik/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
*.secrets
|
||||
.env
|
||||
certs
|
||||
46
traefik/README.md
Normal file
46
traefik/README.md
Normal file
@@ -0,0 +1,46 @@
|
||||
## 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.
|
||||
|
||||
Les explications sont sur le Wiki et doivent être modifiées en cas de changement majeur de configuration : https://wiki.picasoft.net/doku.php?id=technique:tech_team:traefik
|
||||
|
||||
### Configuration
|
||||
|
||||
La configuration a lieu dans les fichiers [traefik.toml](./traefik.toml) et [traefik_dynamic.toml](./traefik_dynamic.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 `[certificatesResolvers.letsencrypt.acme]`.
|
||||
|
||||
### Lancement
|
||||
|
||||
#### Certs
|
||||
|
||||
Au premier lancement, assurez-vous que :
|
||||
|
||||
- Le dossier `/DATA/docker/traefik/certs` existe
|
||||
- Créez un fichier `acme.json` à l'intérieur
|
||||
- Changez son propriétaire à `root`
|
||||
- Changez ses permissions à `600`
|
||||
|
||||
C'est dans ce fichier que seront conservés tous les certificats générés par Traefik.
|
||||
|
||||
#### Métriques
|
||||
|
||||
Pour le bon fonctionnement des métriques, il faut aussi créer un fichier `.env` (dans le même dossier que le Docker Compose) qui devra contenir 2 variables :
|
||||
|
||||
- `SERVER_NAME` qui correspond au nom du serveur, par exemple `SERVER_NAME=pica01-test.picasoft.net`
|
||||
- `METRICS_AUTH` qui correspond à la chaîne d'identification htpasswd utilisée pour authentifier sur l'endpoint des métriques, par exemple `METRICS_AUTH="traefik:$apr1$bXnknJ0S$GsC.ozNJc/dAkh9uH7Qlg."`
|
||||
|
||||
### Mise à jour
|
||||
|
||||
Il suffit de mettre à jour le tag de l'image dans Compose.
|
||||
Lire la documentation [sur les mises à jour mineures](https://docs.traefik.io/v2.2/migration/v2/) pour voir s'il y a des opérations à effectuer ou des options dépréciées.
|
||||
|
||||
La mise à jour vers Traefik v2 a été effectuée ; quelques détails sont à consulter [sur le wiki](https://wiki.picasoft.net/doku.php?id=technique:adminsys:migration-traefik-v2).
|
||||
32
traefik/docker-compose.yml
Normal file
32
traefik/docker-compose.yml
Normal file
@@ -0,0 +1,32 @@
|
||||
version: "3.7"
|
||||
|
||||
networks:
|
||||
proxy:
|
||||
name: "proxy"
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:2.6
|
||||
container_name: traefik
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./traefik.toml:/traefik.toml
|
||||
- ./traefik_dynamic.toml:/traefik_dynamic.toml
|
||||
- /DATA/docker/traefik/certs:/certs
|
||||
environment:
|
||||
TZ: Europe/Paris
|
||||
# labels:
|
||||
# traefik.http.routers.traefik-metrics.entrypoints: websecure
|
||||
# traefik.http.routers.traefik-metrics.rule: "Host(`${SERVER_NAME}`) && PathPrefix(`/metrics`)"
|
||||
# traefik.http.routers.traefik-metrics.service: traefik-metrics
|
||||
# traefik.http.routers.traefik-metrics.middlewares: "traefik-metrics-auth@docker"
|
||||
# traefik.http.middlewares.traefik-metrics-auth.basicauth.users: "${METRICS_AUTH}"
|
||||
# traefik.http.services.traefik-metrics.loadbalancer.server.port: 8082
|
||||
# traefik.enable: true
|
||||
networks:
|
||||
- proxy
|
||||
restart: unless-stopped
|
||||
57
traefik/traefik.toml
Normal file
57
traefik/traefik.toml
Normal file
@@ -0,0 +1,57 @@
|
||||
[global]
|
||||
sendAnonymousUsage = false
|
||||
checkNewVersion = true
|
||||
|
||||
[entryPoints]
|
||||
[entryPoints.web]
|
||||
address = ":80"
|
||||
[entryPoints.web.http.redirections.entryPoint]
|
||||
to = "websecure"
|
||||
scheme = "https"
|
||||
[entryPoints.websecure]
|
||||
address = ":443"
|
||||
[entryPoints.websecure.http]
|
||||
middlewares = ["hardening@file", "compression@file"]
|
||||
[entryPoints.websecure.http.tls]
|
||||
# certResolver = "letsencrypt"
|
||||
options = "tls12@file"
|
||||
# [entryPoints.metrics]
|
||||
# address = ":8082"
|
||||
|
||||
[providers]
|
||||
providersThrottleDuration = "2s"
|
||||
[providers.docker]
|
||||
watch = true
|
||||
endpoint = "unix:///var/run/docker.sock"
|
||||
exposedByDefault = true
|
||||
network = "proxy"
|
||||
[providers.file]
|
||||
filename = "/traefik_dynamic.toml"
|
||||
watch = true
|
||||
|
||||
[api]
|
||||
insecure = true
|
||||
|
||||
[log]
|
||||
level = "DEBUG"
|
||||
|
||||
[accessLog]
|
||||
format = "json"
|
||||
[accessLog.fields.headers]
|
||||
defaultMode = "keep"
|
||||
# See https://doc.traefik.io/traefik/observability/access-logs/#time-zones
|
||||
[accessLog.fields.names]
|
||||
"StartUTC" = "drop"
|
||||
"ClientUsername" = "drop"
|
||||
|
||||
#[certificatesResolvers]
|
||||
# [certificatesResolvers.letsencrypt]
|
||||
# [certificatesResolvers.letsencrypt.acme]
|
||||
# email = "picasoft@assos.utc.fr"
|
||||
# storage = "/certs/acme.json"
|
||||
# [certificatesResolvers.letsencrypt.acme.httpChallenge]
|
||||
# entryPoint = "web"
|
||||
|
||||
#[metrics]
|
||||
# [metrics.prometheus]
|
||||
# entryPoint = "metrics"
|
||||
34
traefik/traefik_dynamic.toml
Normal file
34
traefik/traefik_dynamic.toml
Normal file
@@ -0,0 +1,34 @@
|
||||
[tls.options]
|
||||
[tls.options.tls12]
|
||||
minVersion = "VersionTLS12"
|
||||
cipherSuites = [
|
||||
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
|
||||
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
|
||||
"TLS_AES_256_GCM_SHA384",
|
||||
"TLS_CHACHA20_POLY1305_SHA256",
|
||||
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
|
||||
]
|
||||
curvePreferences = ["CurveP521","CurveP384", "CurveP256"]
|
||||
|
||||
[http]
|
||||
[http.middlewares.hardening.headers]
|
||||
browserXssFilter = true
|
||||
contentTypeNosniff = true
|
||||
forceSTSHeader = true
|
||||
frameDeny = true
|
||||
stsIncludeSubdomains = true
|
||||
stsPreload = true
|
||||
customFrameOptionsValue = "SAMEORIGIN"
|
||||
referrerPolicy = "same-origin"
|
||||
permissionsPolicy = "vibrate='self'"
|
||||
stsSeconds = 315360000
|
||||
|
||||
[http.middlewares.compression.compress]
|
||||
excludedContentTypes = ["text/event-stream"]
|
||||
|
||||
[http.middlewares.allowFrameAndCORS.headers]
|
||||
contentSecurityPolicy = "frame-ancestors *"
|
||||
accessControlAllowHeaders = ["*"]
|
||||
accessControlAllowMethods = ["GET", "POST", "OPTIONS"]
|
||||
accessControlAllowOriginList = ["*"]
|
||||
accessControlExposeHeaders = ["*"]
|
||||
Reference in New Issue
Block a user