chore: build
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user