Local development
Prerequisites
Section titled “Prerequisites”docker, kind, helm, kubectl, git.
Two stacks
Section titled “Two stacks”cd dev
make up # kind + MetalLB + Envoy Gateway + cert-manager + Keycloak # + nebari-operator + Langfuse with SSOmake up-standalone # kind + Langfuse only, port-forward accessmake down # delete the clustermake up deploys at https://langfuse.nebari.local by default (HOSTNAME), into cluster
nebari-langfuse-dev (CLUSTER_NAME), release langfuse (RELEASE).
make update-hosts adds the NebariApp hostnames to /etc/hosts (via the operator’s script;
it uses sudo). make down deletes the cluster.
Watching it come up
Section titled “Watching it come up”kubectl get pods -wkubectl logs -l app=web -fkubectl get nebariapp,httproute,certificateOrdering to expect: datastores first, then langfuse-web running migrations, then ready.
A langfuse-web restarting during that window is usually waiting on ClickHouse rather than
failing.
Iterating on the chart
Section titled “Iterating on the chart”make up # re-runs the helm install against the existing clusterFor a values change with no cluster at all:
helm template langfuse chart -f my-values.yaml \ | grep -E "NEXTAUTH_URL|AUTH_KEYCLOAK_ISSUER" -A2That is the fastest way to catch a nesting mistake — placeholders in the
output (localhost:3000, REPLACE-ME) mean the value did not land.
Chart tests
Section titled “Chart tests”The repository has helm-unittest suites and two shell checks:
helm dependency update chart/helm plugin install https://github.com/helm-unittest/helm-unittesthelm unittest chart/ # nebariapp, podmonitor, secrets
bash chart/tests/values-wiring.sh # cross-value wiring assertionsbash chart/tests/check-pack-metadata.sh pack-metadata.yamlThe unit tests cover exactly the templates most likely to break quietly — the NebariApp,
the generated Secret, and the opt-in PodMonitor. CI adds kubeconform over the rendered
manifests, and two render assertions worth knowing about: that the prod example really does
disable every bundled datastore, and that the bundled images are bitnamilegacy rather than
paid Bitnami or a floating :latest.
End-to-end tests
Section titled “End-to-end tests”tests/e2e/ holds HTTP-only black-box tests that run against any deployed instance.
run.sh needs nothing but curl:
BASE_URL=https://langfuse.mycluster MODE=sso ./tests/e2e/run.shBASE_URL=https://langfuse.mycluster MODE=standalone ./tests/e2e/run.shMODE selects the auth expectations — SSO-only versus email/password.
To run the whole thing locally against a throwaway cluster:
./tests/e2e/kind-e2e.shIt creates a kind cluster named nebari-langfuse-e2e, installs the chart with
tests/e2e/ci-values.yaml (standalone, no operator), waits up to 12 minutes for
helm install --wait, port-forwards svc/langfuse-web:3000, polls the health endpoint,
runs run.sh in standalone mode, and tears the cluster down on exit — including on failure.
tests/e2e/README.md has the full detail.
What local development cannot tell you
Section titled “What local development cannot tell you”- The Argo CD secret rotation. It only appears under Argo CD; the dev stack uses Helm,
where
lookupworks. Read Secrets and GitOps before deploying via GitOps. - Clustered ClickHouse migrations. The dev stack runs the single-node default, which is precisely the configuration that avoids the problem.
- Real TLS and a real Keycloak realm. Certificates are local, and the dev realm’s group and role names will not match yours.
Docs site
Section titled “Docs site”cd docsnpm cinpm run dev # hot reload at http://localhost:4321npm run build # static build into docs/dist/npm test # unit testsPages live in docs/src/content/docs/; the sidebar is in docs/astro.config.mjs. Merges to
main publish to packs.nebari.dev/langfuse-pack/,
and pull requests touching docs/ get a preview URL posted as a comment.