Files
Xor290 8d857faa45
ci-api / test (push) Successful in 23m32s
ci-web / test (push) Successful in 14m7s
chore: build
2026-09-20 18:52:09 +02:00

147 lines
5.8 KiB
YAML

# =============================================================
# Traefik partagé multi-tenant : un seul déploiement pour toutes les démos.
# Le routage par démo (Host -> Service) est fourni par le chart
# deploy/chart-gestion/ingressroute, installé une fois par namespace de démo.
# =============================================================
# TLS : certificat wildcard émis une fois par cert-manager
# (voir deploy/cert-manager/), référencé ici comme certificat par défaut
# du TLSStore. Toutes les IngressRoute (dans ce namespace ou les namespaces
# de démo) qui ne précisent pas de tls.secretName utilisent automatiquement
# ce certificat.
tls:
secretName: wildcard-demo-tls
# Certificats supplémentaires servis par SNI (voir templates/tlsstore.yaml).
# NB : les clients ne voient PAS ce certificat — le TLS public est terminé par
# le WAF (deploy/chart-gestion/waf-cluster, `tls.extra`) ; celui-ci ne couvre
# que la connexion interne WAF -> Traefik.
# wildcard-vitrine-tls : *.vitrine-omnex.club, projets vitrine (voir
# deploy/chart-vitrine/cert-manager/wildcard-certificate.yml). Le Certificate
# doit exister AVANT le prochain démarrage du control-plane (qui refait un
# `helm upgrade --install` de ce chart) : sinon Traefik journalise une erreur
# pour ce secret manquant (les autres certificats restent servis).
extraSecretNames:
- wildcard-vitrine-tls
waf:
paranoia: 2
anomalyInbound: 5
anomalyOutbound: 4
rateLimit:
# requêtes moyennes par seconde par IP
average: 20
burst: 50
# =============================================================
# Valeurs passées au subchart officiel traefik
# https://github.com/traefik/traefik-helm-chart
# =============================================================
traefik:
# Injecté par le provisioner (voir deploy/chart-gestion/registry-credentials,
# installé dans le namespace traefik par EnsureSharedInfra) si un compte
# Docker Hub authentifié est configuré — évite le rate-limit de pull
# anonyme. Vide = pull anonyme (défaut). Sous "deployment", pas à la racine
# : c'est l'emplacement attendu par values.schema.json du chart officiel
# traefik/traefik (voir charts/traefik-41.1.0.tgz) — un imagePullSecrets à
# la racine est rejeté ("Additional property imagePullSecrets is not
# allowed").
deployment:
imagePullSecrets: []
# Expose les ports 80 et 443. Le port web redirige automatiquement vers
# websecure au niveau de l'entrypoint (pas besoin d'IngressRoute dédiée).
# Schéma valable pour le chart traefik/traefik >= 34 (vendored : 41.1.0,
# voir charts/traefik-41.1.0.tgz).
ports:
web:
port: 8000
expose:
default: true
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
port: 8443
expose:
default: true
http:
tls:
enabled: true
# Logs
log:
level: INFO
accessLog:
enabled: true
# Plugin Coraza WAF — module/version confirmés directement depuis les tags
# git du dépôt (github.com/jcchavezs/coraza-http-wasm-traefik, dernier tag
# v0.3.0, vérifié via l'API GitHub le 2026-08-03) et son .traefik.yml
# (runtime: wasm, type: middleware). L'ancien module "github.com/corazawaf/
# coraza-traefik" n'existe pas (404 au chargement) et cassait toute la
# chaîne de middlewares — ne jamais y revenir. Le CRS (OWASP Core Rule Set)
# est embarqué dans le binaire WASM du plugin (voir coraza-http-wasm/main.go,
# includeCRS=true par défaut) : les directives "Include @owasp_crs/*.conf"
# etc. dans templates/middleware-waf.yaml fonctionnent sans fichiers externes.
experimental:
plugins:
coraza-traefik:
moduleName: github.com/jcchavezs/coraza-http-wasm-traefik
version: v0.3.0
# ACME interne désactivé : c'est cert-manager qui gère le cycle de vie du
# certificat wildcard (voir deploy/cert-manager/), Traefik ne fait que le
# consommer via le TLSStore (templates/tlsstore.yaml).
# ACME storage persistant — plus nécessaire sans resolver Traefik interne,
# conservé désactivé par défaut.
persistence:
enabled: false
# Traefik lit les IngressRoute/Middleware dans tous les namespaces de démo,
# et peut référencer les Middlewares partagés (waf-chain) définis ici depuis
# une IngressRoute d'un autre namespace.
providers:
kubernetesCRD:
enabled: true
allowCrossNamespace: true
# Cluster (pas Local) : sur un cluster bare-metal multi-nœuds sans
# LoadBalancer, "Local" fait DROP le trafic NodePort sur tout nœud qui ne
# fait pas tourner le pod Traefik (comportement kube-proxy documenté —
# "has no local endpoints"), donc l'URL casse selon le nœud contacté et
# où le pod est schedulé. "Cluster" relaie toujours vers le bon nœud, au
# prix de perdre l'IP réelle du client (SNAT par kube-proxy) — le
# rate-limiter/logs verront l'IP du nœud plutôt que celle du client tant
# qu'il n'y a pas de LoadBalancer (MetalLB) devant.
#
# type: ClusterIP — Traefik n'est plus exposé directement à internet
# depuis l'ajout du WAF ModSecurity natif devant lui (voir
# deploy/chart-gestion/waf-cluster, remplace coraza-http-wasm-traefik :
# bug mémoire non résolu upstream, jcchavezs/coraza-http-wasm-traefik#9).
# Le WAF termine le TLS public et rouvre une connexion vers l'entryPoint
# websecure (port 8443) de ce Service, désormais interne au cluster —
# aucun changement requis côté IngressRoute/entryPoints.
service:
spec:
type: ClusterIP
externalTrafficPolicy: Cluster
# Métriques Prometheus
metrics:
prometheus:
enabled: true
# Ressources
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi