Helm
Helm is the recommended way to run Spendemon on Kubernetes. It keeps routing, persistence, and runtime settings in one release, which makes upgrades and environment-specific overrides much easier to manage.
The chart lives in: https://github.com/FabioTavernini/spendemon/tree/main/charts/spendemon
Recommended path
Deploy with one chart
Use Helm when you want repeatable releases, per-environment values files, and cleaner upgrade workflows.
Built-in persistence
Keep settings.yaml on a PVC
The chart mounts a persistent volume and seeds the initial runtime config without forcing you to rebuild the container image.
Auth-ready
Wire credentials or OIDC through values
Ingress, Gateway API, local credentials, and OIDC secret references can all be managed from the same release values.
Install
helm upgrade --install spendemon \
oci://ghcr.io/fabiotavernini/charts/spendemon \
--values ./values.yaml
Upgrade
helm upgrade --install spendemon oci://ghcr.io/fabiotavernini/charts/spendemon --values ./values.yaml
helm upgrade --install spendemon \
oci://ghcr.io/fabiotavernini/charts/spendemon \
--values ./values.yaml
Current chart values
The block below is fetched live from the repository, so it always reflects the latest charts/spendemon/values.yaml.
Live from the repo
Current chart values.yaml
Fetched live from the Helm chart in this repository.
What the chart configures
The chart exposes these major value groups:
image: repository, tag, pull policy, and optional image pull secretservice: service type and portingress: optional KubernetesIngressgateway: optional Gateway APIHTTPRouteha: deployment replica behavior managed by the chartresources: pod requests and limitspersistence: PVC size, storage class, and mount path forsettings.yamlauth.credentials: optional local username/password auth secret wiringsettings: the runtime config rendered intosettings.yaml
The default values file is here: https://github.com/FabioTavernini/spendemon/blob/main/charts/spendemon/values.yaml
What to customize first
Most teams only need to touch a few areas for the first working deployment:
settings.clusters: point Spendemon at one or more Prometheus endpointssettings.costs: set your CPU, memory, and storage ratesingressorgateway: expose the UI inside your environmentha.enabled: run two replicas instead of one when you want chart-managed HAauth.credentials.*orsettings.oidc.*: choose one auth mode if you want loginpersistence.*: align the PVC with your cluster storage defaults
Runtime settings vs Helm values
There are two slightly different configuration layers:
- deployment-only values such as
ha.enabledstay in Helm and do not appear in the runtimesettings.yaml - application values under
settings.*are rendered into the runtimesettings.yaml
The same applies to OIDC helpers:
- Helm values include
settings.oidc.nextAuthUrlandsettings.oidc.secretRef - the runtime
settings.yamlonly stores the app-facing OIDC fields such asissuer,clientId,clientSecret,adminGroup,viewerGroup,debug, andextraScopes
Local credentials are Helm-only:
auth.credentials.*injectsAUTH_MODE=credentials,NEXTAUTH_SECRET, and optionalLOCAL_*account env vars- no local credential data is written into the runtime
settings.yaml
See Settings for the runtime file format.
Auth secret wiring
Only enable one auth mode at a time:
auth.credentials.enabled: truefor local username/password sign-insettings.oidc.enabled: truefor OIDC
Local credentials
When auth.credentials.enabled is true, the chart expects a Kubernetes secret with:
nextauthSecretlocalAdminUsernamewith eitherlocalAdminPasswordorlocalAdminPasswordHashlocalViewerUsernamewith eitherlocalViewerPasswordorlocalViewerPasswordHash
You only need one of the local account entries to enable credentials mode.
Example:
kubectl create secret generic spendemon-credentials \
--from-literal=nextauthSecret='replace-with-a-long-random-string' \
--from-literal=localAdminUsername='admin' \
--from-literal=localAdminPasswordHash='scrypt:7b91d3c5f6f6c8e0a6f2e1b4c5d6e7f8:6b1a5f8f0a7c4b6e6b667f6c2852e7416bfe2f521f3473df84c62fb4ef13a4dd9f32831f4a1dd4ec9e4b1f69aa389a6d2f31f2f5fd70888e387de0d7e47355d6'
Then point the chart at that secret:
auth:
credentials:
enabled: true
secretRef:
name: spendemon-credentials
OIDC
When settings.oidc.enabled is true, the chart expects a Kubernetes secret with:
- issuer
- client ID
- client secret
NEXTAUTH_SECRET
Example:
kubectl create secret generic oidc-secret \
--from-literal=issuer='https://id.example.com/realms/spendemon' \
--from-literal=clientId='spendemon' \
--from-literal=clientSecret='replace-me' \
--from-literal=nextauthSecret='replace-with-a-long-random-string'
Important persistence behavior
The chart stores settings.yaml on a PVC and seeds it from the rendered
template only when the file does not already exist.
That means:
- the first install creates the initial file from chart values
- later edits through the Spendemon UI persist on the PVC
- changing Helm values does not overwrite an existing
settings.yamlautomatically
If you want the chart-rendered settings to take effect again, recreate the persisted file or the PVC for that release.