Helm charts
All Helm code lives under k8s/helm/charts/. There are two layers:
k8s/helm/charts/
├── symfony/ ← app chart
├── php-generic/ ← app chart
├── node-generic/ ← app chart
├── sveltekit/ ← app chart
└── components/ ← reusable subcharts
├── tasks/
├── database/
├── redis/
├── external-secret/
├── traefik-ingress/
└── pdb/
App charts
An app chart is what a project deploys. It defines the main workload (Deployment / StatefulSet) and pulls in components as dependencies.
| Chart | Use case |
|---|---|
symfony | Symfony PHP applications |
php-generic | Generic PHP apps |
node-generic | Generic Node.js apps |
sveltekit | SvelteKit frontends |
A project picks one app chart and only writes a values file. See Publishing a project.
Components (subcharts)
A component is a reusable Helm subchart. App charts depend on them via Chart.yaml; a project enables what it needs in its values file.
| Component | What it produces |
|---|---|
component-tasks | CronJobs, worker Deployments, and manual (suspended) CronJobs |
component-database | MySQLApp CRD (Percona) |
component-redis | Redis Deployment + Service |
component-external-secret | Infisical SecretStore + ExternalSecret |
component-traefik-ingress | Traefik Ingress |
component-pdb | PodDisruptionBudget |
Shared globals
App charts and components communicate through Helm globals under the global: key. A project values file sets these once and every subchart that needs them reads from the same place.
global:
projectSlug: my-project # used by external-secret + database
environmentSlug: staging # used by external-secret + database
secretName: app-secrets # used by app + tasks + database
nameOverride: app # the workload's name
image: # the application image
repository: registry.gitlab.com/...
tag: abc123-staging
pullPolicy: IfNotPresent
imagePullSecrets: # pull secrets for the image
- name: gitlab-auth-credentials
A project values file typically only overrides projectSlug, environmentSlug, and image: — the rest defaults are good.