You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Chart Helm réutilisable pour applications web full-stack
(frontend React + backend Node.js + MongoDB) sur K3s / K3d, publié en OCI sur GHCR.
Un même chart couvre le développement local, la préproduction et la production :
chaque environnement active ses propres options (TLS, sécurité, autoscaling,
sauvegardes, monitoring) par simple combinaison de fichiers de values.
Dépôt vitrine. Version publique d'un chart utilisé en production comme
dépendance d'un chart applicatif privé. Les valeurs propres à l'application
réelle ont été remplacées par des valeurs génériques (my-app, example.com).
L'infrastructure qui l'héberge est présentée dans
k3s-gitops-platform.
# 1. Installer les dépendances du chart
helm dependency update
# 2. Déployer en local (k3d, sans TLS)
helm upgrade --install my-release . -f values-k3d.yaml
C'est tout pour un environnement de développement local. Pour preprod/production,
voir Installation et Environnements ci-dessous.
Points d'attention
Ces quatre points sont les pièges les plus probables lors d'un déploiement :
⚠️ Point
Détail
TLS
Géré nativement par Traefik via ACME/Let's Encrypt. cert-manager n'est pas requis et ne doit jamais être activé (ingress.tls.certManager.enabled=true) en même temps que le certResolver Traefik : les deux mécanismes entrent en conflit silencieux et aucun certificat n'est émis.
Monitoring
Prometheus, Grafana, Loki et Promtail sont installés au niveau infra via ArgoCD, pas par ce chart. Ce chart crée uniquement les ServiceMonitor / PrometheusRule qui s'y branchent via les CRDs déjà présentes sur le cluster.
Secrets obligatoires
backend.secrets.mongodbUri, backend.secrets.jwtSecret et database.secrets.password n'ont pas de valeur par défaut : le déploiement échoue tant qu'ils ne sont pas renseignés (directement en dev, via Infisical/External Secrets en preprod/prod).
Seed Job en production
seedJob.enabled doit être mis à false en production : il est pensé pour initialiser des données de démo, pas pour une base contenant des données réelles.
Garde-fous
templates/00-validation.yaml ne crée aucune ressource : il fait échouer
helm install / helm upgradeavant tout déploiement si la configuration est
dangereuse. Exemples :
préprod / production sans External Secrets, ou sans ClusterSecretStore défini ;
images en latest ou sans tag en préprod / production (tag sha-… obligatoire) ;
backups de production sans copie hors site (R2), ou sans nom de base valide ;
restore-test ou restore-prod activés sans R2 ou sans collection à vérifier ;
restauration de production avec un nom de backup implicite ou dangereux
(le job exige en plus la confirmation RESTORE:<dbName> à l'exécution).
Ces garde-fous sont eux-mêmes testés en CI (voir CI & release).
Prérequis
Helm v3.x
Kubernetes 1.25+ (K3s ou K3d)
External Secrets Operator (pour les secrets en preprod/prod)
Infisical (gestionnaire de secrets)
Stack monitoring installée au niveau infra via ArgoCD (kube-prometheus-stack + loki-stack)
Installation
Utilisation comme dépendance dans un autre chart
Déclarer la dépendance dans le Chart.yaml du chart applicatif :
La stack monitoring (Prometheus, Grafana, Loki) est installée au niveau infra via ArgoCD,
indépendamment de ce chart. Ce chart crée uniquement les ressources qui s'y branchent.
Service
k3d local
preprod
production
ServiceMonitor backend
❌
❌
✅
PrometheusRules (alertes)
❌
❌
✅
Prometheus
✅ infra
✅ infra
✅ infra
Grafana
✅ infra
✅ infra
✅ infra
Loki + Promtail
✅ infra
✅ infra
✅ infra
Stockage & Backups
Paramètre
k3d local
preprod
production
StorageClass
local-path
local-path
local-path
Volume MongoDB
10 Gi
10 Gi
20 Gi
Backup MongoDB
❌
✅ (rétention 7j)
✅ (rétention 30j, R2)
Values
Global
Paramètre
Description
Défaut
global.appName
Nom de l'application
my-app
global.environment
Environnement (development, preprod, production)
development
global.domain
Domaine de l'application
localhost
global.imageRegistry
Registry des images Docker
my-registry.example.com
Backend
Paramètre
Description
Défaut
backend.enabled
Activer le backend
true
backend.image.repository
Image Docker du backend
my-registry.example.com/my-app/backend
backend.image.tag
Tag de l'image — surchargé par le CI
latest
backend.replicaCount
Nombre de replicas
1
backend.secrets.mongodbUri
URI MongoDB complète
""⚠️ obligatoire
backend.secrets.jwtSecret
Clé secrète JWT (min. 32 caractères)
""⚠️ obligatoire
backend.jwtExpiry
Durée de validité des tokens JWT
24h
backend.autoscaling.enabled
Activer le HPA
false
backend.autoscaling.minReplicas
Replicas minimum (HPA)
1
backend.autoscaling.maxReplicas
Replicas maximum (HPA)
3
backend.resources.requests.cpu
CPU demandé
100m
backend.resources.requests.memory
Mémoire demandée
256Mi
backend.resources.limits.cpu
CPU limite
500m
backend.resources.limits.memory
Mémoire limite
512Mi
Frontend
Paramètre
Description
Défaut
frontend.enabled
Activer le frontend
true
frontend.image.repository
Image Docker du frontend
my-registry.example.com/my-app/frontend
frontend.image.tag
Tag de l'image — surchargé par le CI
latest
frontend.replicaCount
Nombre de replicas
1
frontend.autoscaling.enabled
Activer le HPA
false
frontend.resources.requests.cpu
CPU demandé
50m
frontend.resources.requests.memory
Mémoire demandée
128Mi
frontend.resources.limits.cpu
CPU limite
200m
frontend.resources.limits.memory
Mémoire limite
256Mi
Base de données (MongoDB)
Paramètre
Description
Défaut
database.enabled
Activer MongoDB
true
database.image.tag
Version MongoDB
7.0
database.secrets.username
Utilisateur MongoDB
mongoUser
database.secrets.password
Mot de passe MongoDB
""⚠️ obligatoire
database.persistence.storageClass
StorageClass Kubernetes
local-path
database.persistence.size
Taille du volume MongoDB
10Gi
database.backup.enabled
Activer les backups
false
database.backup.schedule
Cron de backup
0 2 * * *
database.backup.retentionDays
Rétention des backups (jours)
7
database.backup.storage
Taille du volume de backup
20Gi
database.backup.r2.enabled
Activer l'upload vers Cloudflare R2
false
database.exporter.image.repository
Image du sidecar mongodb_exporter
percona/mongodb_exporter
database.exporter.image.tag
Tag du sidecar mongodb_exporter
0.40
database.exporter.port
Port exposé par le sidecar mongodb_exporter
9216
ℹ️ Le sidecar mongodb_exporter n'a pas de flag d'activation dédié : il est ajouté automatiquement
au pod MongoDB dès que monitoring.enabled=true (voir templates/database/statefulset.yaml).
Limite moyenne de requêtes (rate limiting Traefik)
100
ingress.rateLimit.burst
Limite en pic (rate limiting Traefik)
200
Sécurité (paramètres)
Paramètre
Description
Défaut
security.podSecurityStandards.enabled
Activer Pod Security Standards
false
security.podSecurityStandards.enforce
Niveau PSS
restricted
security.networkPolicies.enabled
Activer les NetworkPolicies
false
security.networkPolicies.ingressNamespace
Namespace de l'ingress controller
kube-system
security.rbac.enabled
Activer le RBAC
true
security.resourceQuota.enabled
Activer le ResourceQuota
false
security.limitRange.enabled
Activer le LimitRange
false
External Secrets (Infisical)
Paramètre
Description
Défaut
externalSecrets.enabled
Activer External Secrets
false
externalSecrets.secretStores.backend
ClusterSecretStore pour le backend
my-secret-store
externalSecrets.secretStores.database
ClusterSecretStore pour MongoDB
my-secret-store
externalSecrets.secretStores.r2
ClusterSecretStore pour Cloudflare R2
my-secret-store
Seed Job
Paramètre
Description
Défaut
seedJob.enabled
Activer le job d'initialisation de la base
true
seedJob.backoffLimit
Nombre de tentatives en cas d'échec
3
seedJob.ttlSecondsAfterFinished
Durée avant suppression automatique du job
3600
seedJob.initContainer.image
Image busybox pour l'init container
busybox:1.36
Observabilité (paramètres)
Paramètre
Description
Défaut
monitoring.enabled
Activer ServiceMonitor + PrometheusRules
false
monitoring.stack.enabled
Déployer kube-prometheus-stack (local uniquement)
false
monitoring.logs.enabled
Déployer loki-stack (local uniquement)
false
monitoring.alerts.enabled
Activer les alertes Prometheus
false
monitoring.minimalAlerts.enabled
Activer les alertes minimales (CrashLoop, restarts)
false
monitoring.minimalAlerts.podRestartThreshold
Seuil de restarts pour alerte
3
monitoring.prometheus.interval
Intervalle de scrape
30s
monitoring.prometheus.scrapeTimeout
Timeout de scrape
10s
⚠️monitoring.stack.enabled et monitoring.logs.enabled sont réservés au développement local (k3d).
En preprod/production, la stack monitoring est gérée par ArgoCD au niveau infra.
helm lint --strict sur les values par défaut, k3d, préprod et production
Tests de rendu
PR et push
helm template par environnement + assertions sur le rendu (probes, CronJobs de backup et de restore, alertes)
Test négatif
PR et push
vérifie que le chart refuse un backup de production sans R2
Release
push sur main
semantic-release : version calculée depuis les Conventional Commits, Chart.yaml mis à jour, tag et release GitHub
Publication
nouvelle release
helm package + helm push vers oci://ghcr.io/roxane451/fullstack-app
La stack de monitoring (kube-prometheus-stack, Loki) n'est pas une dépendance du
chart : elle est installée au niveau infrastructure. Le chart ne crée que les
ServiceMonitor et PrometheusRule qui s'y branchent.