@@ -61,6 +61,8 @@ podSecurityContext:
|
||||
runAsUser: 101
|
||||
runAsGroup: 101
|
||||
fsGroup: 101
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
|
||||
@@ -29,6 +29,8 @@ podSecurityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 101
|
||||
runAsGroup: 101
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
name: gestion-ingressroute
|
||||
description: Routage Traefik d'une démo (Host dynamique -> Services de son propre namespace) — installé une fois par démo, pointe vers le Traefik partagé (deploy/chart-gestion/traefik)
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: "1.0.0"
|
||||
@@ -0,0 +1,14 @@
|
||||
{{- define "ingressroute.labels" -}}
|
||||
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
|
||||
app.kubernetes.io/name: {{ .Chart.Name }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "ingressroute.backendService" -}}
|
||||
{{- .Values.backend.serviceName | default (printf "%s-backend-gestion-backend" .Release.Namespace) }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "ingressroute.frontendService" -}}
|
||||
{{- .Values.frontend.serviceName | default (printf "%s-frontend-gestion-frontend" .Release.Namespace) }}
|
||||
{{- end }}
|
||||
@@ -0,0 +1,53 @@
|
||||
{{- if not .Values.host }}
|
||||
{{- fail "ingressroute: .Values.host est requis (ex: demo-abc123.demo.demo-uber.club)" }}
|
||||
{{- end }}
|
||||
# Routage HTTPS de cette démo. Le TLS n'est pas précisé : Traefik utilise
|
||||
# automatiquement le certificat wildcard par défaut du TLSStore partagé
|
||||
# (voir deploy/chart-gestion/traefik/templates/tlsstore.yaml). Le redirect
|
||||
# HTTP -> HTTPS est géré au niveau de l'entrypoint Traefik (pas dupliqué ici).
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: {{ .Release.Namespace }}-routes
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "ingressroute.labels" . | nindent 4 }}
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
# API backend — WAF + headers + rate limit (middlewares partagés, définis
|
||||
# dans le namespace du Traefik commun, référencés cross-namespace).
|
||||
- match: Host(`{{ .Values.host }}`) && (PathPrefix(`/api/`) || PathPrefix(`/webhook/`))
|
||||
kind: Rule
|
||||
priority: 20
|
||||
middlewares:
|
||||
- name: waf-chain
|
||||
namespace: {{ .Values.traefikNamespace }}
|
||||
services:
|
||||
- name: {{ include "ingressroute.backendService" . }}
|
||||
port: {{ .Values.backend.servicePort }}
|
||||
|
||||
# Fichiers uploadés — WAF désactivé dans les règles Coraza pour ce path
|
||||
- match: Host(`{{ .Values.host }}`) && PathPrefix(`/uploads/`)
|
||||
kind: Rule
|
||||
priority: 15
|
||||
middlewares:
|
||||
- name: security-headers
|
||||
namespace: {{ .Values.traefikNamespace }}
|
||||
services:
|
||||
- name: {{ include "ingressroute.backendService" . }}
|
||||
port: {{ .Values.backend.servicePort }}
|
||||
|
||||
# Frontend SPA — WAF + headers + rate limit
|
||||
- match: Host(`{{ .Values.host }}`)
|
||||
kind: Rule
|
||||
priority: 1
|
||||
middlewares:
|
||||
- name: waf-chain
|
||||
namespace: {{ .Values.traefikNamespace }}
|
||||
services:
|
||||
- name: {{ include "ingressroute.frontendService" . }}
|
||||
port: {{ .Values.frontend.servicePort }}
|
||||
|
||||
tls: {}
|
||||
@@ -0,0 +1,21 @@
|
||||
# Sous-domaine complet de la démo, ex: demo-abc123.demo.demo-uber.club
|
||||
# (doit correspondre au wildcard *.demo.demo-uber.club émis par cert-manager
|
||||
# et à l'URL calculée par le control-plane pour cette démo — voir
|
||||
# control-plane/api/internal/demos/service.go).
|
||||
host: ""
|
||||
|
||||
# Namespace où tourne le Traefik partagé et ses Middlewares (waf-chain,
|
||||
# rate-limit, coraza-waf, security-headers) — voir deploy/chart-gestion/traefik.
|
||||
traefikNamespace: traefik
|
||||
|
||||
# Services de CE namespace de démo (mêmes noms que ceux générés par les
|
||||
# charts backend/frontend : <namespace>-backend-gestion-backend, etc.)
|
||||
# Laissés vides par défaut : calculés automatiquement à partir de
|
||||
# .Release.Namespace dans le template si non surchargés ici.
|
||||
backend:
|
||||
serviceName: ""
|
||||
servicePort: 8080
|
||||
|
||||
frontend:
|
||||
serviceName: ""
|
||||
servicePort: 80
|
||||
@@ -0,0 +1,6 @@
|
||||
apiVersion: v2
|
||||
name: gestion-network-policy
|
||||
description: Isolation réseau stricte d'une démo — deny-by-default, aucune communication inter-démos, pas d'accès à l'API Kubernetes ni à kube-dns au-delà du port 53
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: "1.0.0"
|
||||
@@ -0,0 +1,106 @@
|
||||
# -------------------------------------------------------------------
|
||||
# 1. Deny-by-default : sans règle explicite plus bas, AUCUN trafic entrant
|
||||
# ni sortant n'est autorisé pour les pods de ce namespace. C'est ce qui
|
||||
# empêche par défaut toute communication vers un autre namespace de démo
|
||||
# et vers l'API Kubernetes.
|
||||
# -------------------------------------------------------------------
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: default-deny-all
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
|
||||
---
|
||||
# -------------------------------------------------------------------
|
||||
# 2. Trafic intra-démo : frontend <-> backend <-> postgresql/redis, dans
|
||||
# CE namespace uniquement (le podSelector du namespaceSelector par défaut
|
||||
# de Kubernetes limite déjà à ce namespace : pas de namespaceSelector ici
|
||||
# équivaut à "même namespace").
|
||||
# -------------------------------------------------------------------
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: allow-intra-namespace
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
ingress:
|
||||
- from:
|
||||
- podSelector: {}
|
||||
egress:
|
||||
- to:
|
||||
- podSelector: {}
|
||||
|
||||
---
|
||||
# -------------------------------------------------------------------
|
||||
# 3. Ingress externe autorisé : uniquement depuis le Traefik partagé
|
||||
# (aucune autre démo, aucun autre client, ne peut ouvrir de connexion
|
||||
# directe vers les pods de cette démo).
|
||||
# -------------------------------------------------------------------
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: allow-ingress-from-traefik
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Ingress
|
||||
ingress:
|
||||
- from:
|
||||
- namespaceSelector:
|
||||
matchLabels:
|
||||
kubernetes.io/metadata.name: {{ .Values.traefikNamespace }}
|
||||
|
||||
---
|
||||
# -------------------------------------------------------------------
|
||||
# 4. DNS uniquement vers kube-system, port 53. C'est la SEULE ouverture vers
|
||||
# kube-system : aucun accès à autre chose dans ce namespace, et l'API
|
||||
# server (kubernetes.default.svc, namespace "default") n'est jamais
|
||||
# autorisé nulle part dans ce chart -> bloqué par le deny-by-default.
|
||||
# -------------------------------------------------------------------
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: allow-egress-dns
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Egress
|
||||
egress:
|
||||
- to:
|
||||
- namespaceSelector:
|
||||
matchLabels:
|
||||
kubernetes.io/metadata.name: {{ .Values.kubeSystemNamespace }}
|
||||
ports:
|
||||
- protocol: UDP
|
||||
port: 53
|
||||
- protocol: TCP
|
||||
port: 53
|
||||
|
||||
---
|
||||
# -------------------------------------------------------------------
|
||||
# 5. Internet public sortant (webhooks Telegram/NowPayments, GPS TomTom...),
|
||||
# en excluant les plages privées : ça couvre par construction l'IP de
|
||||
# l'API server et celles des autres namespaces, sans avoir besoin de la
|
||||
# connaître explicitement.
|
||||
# -------------------------------------------------------------------
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: allow-egress-internet
|
||||
spec:
|
||||
podSelector: {}
|
||||
policyTypes:
|
||||
- Egress
|
||||
egress:
|
||||
- to:
|
||||
- ipBlock:
|
||||
cidr: 0.0.0.0/0
|
||||
except:
|
||||
{{- toYaml .Values.blockedEgressCIDRs | nindent 14 }}
|
||||
@@ -0,0 +1,25 @@
|
||||
# IMPORTANT : les NetworkPolicy ne sont appliquées que si le CNI du cluster
|
||||
# les supporte (Calico, Cilium, Weave...). Avec un CNI qui ne les enforce pas
|
||||
# (ex: flannel seul), ce chart s'installe sans erreur mais n'isole RIEN —
|
||||
# à vérifier avant de considérer l'isolation comme active.
|
||||
|
||||
# Namespace où tourne CoreDNS (résolution de noms) — seul port autorisé en
|
||||
# egress vers ce namespace : 53 (DNS). Aucun autre accès à kube-system,
|
||||
# donc pas d'accès à l'API server (kubernetes.default.svc vit dans le
|
||||
# namespace "default", pas dans kube-system, et n'est de toute façon jamais
|
||||
# ajouté aux règles autorisées ci-dessous : bloqué par omission).
|
||||
kubeSystemNamespace: kube-system
|
||||
|
||||
# Namespace du Traefik partagé (voir deploy/chart-gestion/traefik) : seule
|
||||
# origine externe autorisée à ouvrir une connexion ingress vers cette démo.
|
||||
traefikNamespace: traefik
|
||||
|
||||
# Plages privées exclues de l'egress "internet" autorisé (RFC1918) : empêche
|
||||
# tout mouvement latéral vers d'autres pods/namespaces/nœuds/l'API server par
|
||||
# IP directe, tout en laissant sortir vers l'internet public (Telegram,
|
||||
# NowPayments, TomTom, etc.). Si le CIDR des pods/services de votre cluster
|
||||
# ne tombe pas dans ces plages standard, ajoutez-le ici.
|
||||
blockedEgressCIDRs:
|
||||
- 10.0.0.0/8
|
||||
- 172.16.0.0/12
|
||||
- 192.168.0.0/16
|
||||
@@ -1,3 +1,4 @@
|
||||
{{- if .Values.persistence.enabled }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
@@ -13,3 +14,4 @@ spec:
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.storageClass }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -63,8 +63,12 @@ spec:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
volumes:
|
||||
- name: data
|
||||
{{- if .Values.persistence.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ include "postgresql.fullname" . }}-data
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
- name: config
|
||||
configMap:
|
||||
name: {{ include "postgresql.fullname" . }}-config
|
||||
|
||||
@@ -10,6 +10,7 @@ auth:
|
||||
password: ""
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 10Gi
|
||||
storageClass: ""
|
||||
accessMode: ReadWriteOnce
|
||||
@@ -38,9 +39,12 @@ config:
|
||||
logMinDurationStatement: "1000"
|
||||
|
||||
podSecurityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 999
|
||||
runAsGroup: 999
|
||||
fsGroup: 999
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{- if .Values.persistence.enabled }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
@@ -13,3 +14,4 @@ spec:
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.storageClass }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -67,8 +67,12 @@ spec:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
volumes:
|
||||
- name: data
|
||||
{{- if .Values.persistence.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ include "redis.fullname" . }}-data
|
||||
{{- else }}
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
- name: config
|
||||
configMap:
|
||||
name: {{ include "redis.fullname" . }}-config
|
||||
|
||||
@@ -8,6 +8,7 @@ auth:
|
||||
password: ""
|
||||
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 2Gi
|
||||
storageClass: ""
|
||||
accessMode: ReadWriteOnce
|
||||
@@ -34,9 +35,12 @@ config:
|
||||
save: ""
|
||||
|
||||
podSecurityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 999
|
||||
runAsGroup: 999
|
||||
fsGroup: 999
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
dependencies:
|
||||
- name: traefik
|
||||
repository: https://helm.traefik.io/traefik
|
||||
version: 41.1.0
|
||||
digest: sha256:62635ee99f7e539f6a9206239003249a65f4a4cf0e5606fecc9578ed0cfa31ef
|
||||
generated: "2026-07-31T12:07:20.158740949+02:00"
|
||||
@@ -1,6 +1,6 @@
|
||||
apiVersion: v2
|
||||
name: gestion-traefik
|
||||
description: Traefik ingress + Coraza WAF (OWASP CRS) — gestion-commande
|
||||
description: Traefik partagé multi-tenant + Coraza WAF (OWASP CRS) — routeur unique pour toutes les démos, installé une seule fois (voir deploy/chart-gestion/ingressroute pour le routage par démo)
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: "3.1.0"
|
||||
|
||||
Binary file not shown.
@@ -4,9 +4,3 @@ app.kubernetes.io/name: {{ .Chart.Name }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "gestion-traefik.certResolver" -}}
|
||||
{{- if eq .Values.tls.mode "letsencrypt" -}}
|
||||
letsencrypt
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
---
|
||||
# HTTP → HTTPS redirect
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: gestion-http
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "gestion-traefik.labels" . | nindent 4 }}
|
||||
spec:
|
||||
entryPoints:
|
||||
- web
|
||||
routes:
|
||||
- match: Host(`{{ .Values.domain }}`)
|
||||
kind: Rule
|
||||
middlewares:
|
||||
- name: redirect-https
|
||||
services:
|
||||
- name: noop@internal
|
||||
kind: TraefikService
|
||||
---
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: Middleware
|
||||
metadata:
|
||||
name: redirect-https
|
||||
namespace: {{ .Release.Namespace }}
|
||||
spec:
|
||||
redirectScheme:
|
||||
scheme: https
|
||||
permanent: true
|
||||
---
|
||||
# HTTPS — routes principales
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: IngressRoute
|
||||
metadata:
|
||||
name: gestion-https
|
||||
namespace: {{ .Release.Namespace }}
|
||||
labels:
|
||||
{{- include "gestion-traefik.labels" . | nindent 4 }}
|
||||
spec:
|
||||
entryPoints:
|
||||
- websecure
|
||||
routes:
|
||||
# API backend — WAF + headers + rate limit
|
||||
- match: Host(`{{ .Values.domain }}`) && (PathPrefix(`/api/`) || PathPrefix(`/webhook/`))
|
||||
kind: Rule
|
||||
priority: 20
|
||||
middlewares:
|
||||
- name: waf-chain
|
||||
services:
|
||||
- name: {{ .Values.backend.serviceName }}
|
||||
namespace: {{ .Values.servicesNamespace }}
|
||||
port: {{ .Values.backend.servicePort }}
|
||||
|
||||
# Fichiers uploadés — WAF désactivé dans les règles Coraza pour ce path
|
||||
- match: Host(`{{ .Values.domain }}`) && PathPrefix(`/uploads/`)
|
||||
kind: Rule
|
||||
priority: 15
|
||||
middlewares:
|
||||
- name: security-headers
|
||||
services:
|
||||
- name: {{ .Values.backend.serviceName }}
|
||||
namespace: {{ .Values.servicesNamespace }}
|
||||
port: {{ .Values.backend.servicePort }}
|
||||
|
||||
# Frontend SPA — WAF + headers + rate limit
|
||||
- match: Host(`{{ .Values.domain }}`)
|
||||
kind: Rule
|
||||
priority: 1
|
||||
middlewares:
|
||||
- name: waf-chain
|
||||
services:
|
||||
- name: {{ .Values.frontend.serviceName }}
|
||||
namespace: {{ .Values.servicesNamespace }}
|
||||
port: {{ .Values.frontend.servicePort }}
|
||||
|
||||
tls:
|
||||
{{- if eq .Values.tls.mode "letsencrypt" }}
|
||||
certResolver: letsencrypt
|
||||
{{- else }}
|
||||
secretName: {{ .Values.tls.secretName }}
|
||||
{{- end }}
|
||||
domains:
|
||||
- main: {{ .Values.domain }}
|
||||
@@ -1,3 +1,6 @@
|
||||
# Certificat par défaut pour TOUTES les IngressRoute (ce namespace et les
|
||||
# namespaces de démo) qui ne précisent pas tls.secretName — c'est le wildcard
|
||||
# émis par cert-manager (voir deploy/cert-manager/wildcard-certificate.yml).
|
||||
apiVersion: traefik.io/v1alpha1
|
||||
kind: TLSStore
|
||||
metadata:
|
||||
@@ -6,11 +9,5 @@ metadata:
|
||||
labels:
|
||||
{{- include "gestion-traefik.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- if eq .Values.tls.mode "secret" }}
|
||||
defaultCertificate:
|
||||
secretName: {{ .Values.tls.secretName }}
|
||||
{{- end }}
|
||||
defaultGeneratedCert:
|
||||
resolver: {{ include "gestion-traefik.certResolver" . | default "letsencrypt" }}
|
||||
domain:
|
||||
main: {{ .Values.domain }}
|
||||
|
||||
@@ -1,26 +1,16 @@
|
||||
# =============================================================
|
||||
# Paramètres spécifiques à ce chart (IngressRoutes, Middlewares)
|
||||
# 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.
|
||||
# =============================================================
|
||||
|
||||
# Namespace des services backend et frontend
|
||||
servicesNamespace: gestion
|
||||
|
||||
domain: example.com
|
||||
|
||||
# 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:
|
||||
# "letsencrypt" | "secret"
|
||||
mode: letsencrypt
|
||||
email: admin@example.com
|
||||
# Si mode=secret : nom du Secret TLS Kubernetes
|
||||
secretName: gestion-tls
|
||||
|
||||
backend:
|
||||
serviceName: gestion-backend
|
||||
servicePort: 8080
|
||||
|
||||
frontend:
|
||||
serviceName: gestion-frontend
|
||||
servicePort: 80
|
||||
secretName: wildcard-demo-tls
|
||||
|
||||
waf:
|
||||
paranoia: 2
|
||||
@@ -37,27 +27,34 @@ rateLimit:
|
||||
# https://github.com/traefik/traefik-helm-chart
|
||||
# =============================================================
|
||||
traefik:
|
||||
# Expose les ports 80 et 443
|
||||
# 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
|
||||
redirectTo:
|
||||
port: websecure
|
||||
http:
|
||||
redirections:
|
||||
entryPoint:
|
||||
to: websecure
|
||||
scheme: https
|
||||
permanent: true
|
||||
websecure:
|
||||
port: 8443
|
||||
expose:
|
||||
default: true
|
||||
tls:
|
||||
enabled: true
|
||||
http:
|
||||
tls:
|
||||
enabled: true
|
||||
|
||||
# Logs
|
||||
logs:
|
||||
general:
|
||||
level: INFO
|
||||
access:
|
||||
enabled: true
|
||||
log:
|
||||
level: INFO
|
||||
accessLog:
|
||||
enabled: true
|
||||
|
||||
# Plugin Coraza WAF — Traefik télécharge le plugin au démarrage
|
||||
# (le cluster doit avoir accès à internet ou utiliser un plugin local)
|
||||
@@ -67,20 +64,18 @@ traefik:
|
||||
moduleName: "github.com/corazawaf/coraza-traefik"
|
||||
version: "v0.3.0"
|
||||
|
||||
# Cert resolver Let's Encrypt (ignoré si tls.mode=secret)
|
||||
certResolvers:
|
||||
letsencrypt:
|
||||
email: admin@example.com
|
||||
storage: /data/acme.json
|
||||
httpChallenge:
|
||||
entryPoint: web
|
||||
# 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
|
||||
# ACME storage persistant — plus nécessaire sans resolver Traefik interne,
|
||||
# conservé désactivé par défaut.
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 128Mi
|
||||
enabled: false
|
||||
|
||||
# Traefik lit les IngressRoutes dans tous les namespaces
|
||||
# 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
|
||||
|
||||
Reference in New Issue
Block a user