chore: build
ci-api / test (push) Successful in 23m32s
ci-web / test (push) Successful in 14m7s

This commit is contained in:
Xor290
2026-09-20 18:52:09 +02:00
parent 9e11f01c2c
commit 8d857faa45
66 changed files with 3673 additions and 1564 deletions
@@ -0,0 +1,6 @@
apiVersion: v2
name: vitrine-ingressroute
description: Routage Traefik + certificat TLS d'un host (Services de son propre namespace) — pointe vers le Traefik partagé (namespace 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-vitrine-backend" .Release.Namespace) }}
{{- end }}
{{- define "ingressroute.frontendService" -}}
{{- .Values.frontend.serviceName | default (printf "%s-frontend-vitrine-frontend" .Release.Namespace) }}
{{- end }}
@@ -0,0 +1,19 @@
{{- if and .Values.tls.secretName .Values.tls.certificate.enabled }}
# Certificat émis par cert-manager (DNS-01) dans le namespace de la release :
# Traefik ne lit `tls.secretName` que dans le namespace de l'IngressRoute.
# Les ClusterIssuers sont définis dans ../cert-manager.
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: {{ .Values.tls.secretName }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "ingressroute.labels" . | nindent 4 }}
spec:
secretName: {{ .Values.tls.secretName }}
issuerRef:
name: {{ .Values.tls.certificate.issuerName }}
kind: {{ .Values.tls.certificate.issuerKind }}
dnsNames:
{{- toYaml .Values.tls.certificate.dnsNames | nindent 4 }}
{{- end }}
@@ -0,0 +1,58 @@
{{- if not .Values.host }}
{{- fail "ingressroute: .Values.host est requis (ex: vitrine-abc12.vitrine-omnex.club)" }}
{{- end }}
# Routage HTTPS. Le certificat est celui de `tls.secretName` (SNI) ; sans
# secretName, Traefik retombe sur le certificat par défaut du TLSStore
# partagé. 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/`))
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 }}
{{- if .Values.tls.secretName }}
tls:
secretName: {{ .Values.tls.secretName }}
{{- else }}
tls: {}
{{- end }}
@@ -0,0 +1,40 @@
# Host complet servi par cette IngressRoute, ex: vitrine-abc12.vitrine-omnex.club
# (calculé par le control-plane : <namespace>.<domaine vitrine>).
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
# TLS. Mode PARTAGÉ (défaut, celui du control-plane) : secretName vide, donc
# `tls: {}` -- Traefik choisit le certificat dans son TLSStore d'après le nom
# d'hôte (SNI) : le wildcard *.vitrine-omnex.club (Certificate dans le
# namespace traefik, voir ../cert-manager/wildcard-certificate.yml) y est
# référencé via `tls.extraSecretNames` du chart traefik. Aucun certificat par
# projet : un par projet dépasserait les limites Let's Encrypt.
#
# Mode AUTONOME (installation manuelle d'un seul projet, sans TLSStore) :
# secretName: wildcard-vitrine-tls et certificate.enabled: true -- le chart
# crée alors le Certificate dans le namespace de la release.
tls:
secretName: ""
certificate:
enabled: false
# Utiliser letsencrypt-dns-vitrine-staging pour un premier essai.
issuerName: letsencrypt-dns-vitrine
issuerKind: ClusterIssuer
dnsNames:
- vitrine-omnex.club
- "*.vitrine-omnex.club"
# Services de CE namespace. Par défaut ceux produits par le control-plane
# (release "<namespace>-backend" / "<namespace>-frontend" + nom de chart
# vitrine-backend / vitrine-frontend). À surcharger si les releases portent
# d'autres noms. servicePort doit égaler `service.port` du chart correspondant.
backend:
serviceName: ""
servicePort: 8080
frontend:
serviceName: ""
servicePort: 80