Local development
dev/ builds a kind cluster with the full Nebari platform so the NebariApp path can be
exercised locally, not just the chart.
Prerequisites
Section titled “Prerequisites”kind, kubectl, helm, docker, and git.
Two stacks
Section titled “Two stacks”cd dev
make up # kind + MetalLB + Envoy Gateway + cert-manager + Keycloak # + nebari-operator + Superset with NebariAppmake up-standalone # kind + Superset onlymake down # delete the clustermake up finishes by printing the URL, https://superset.localhost by default, and the
Keycloak credentials, admin / nebari-admin.
make up-standalone skips the platform entirely; reach Superset with:
kubectl port-forward svc/superset 8088:8088 -n supersetThe service is named after the release, and because the release name superset already
contains the upstream chart name the two do not get concatenated. make up-standalone
prints svc/superset-superset, which does not exist.
What make up actually does
Section titled “What make up actually does”| Target | Step |
|---|---|
cluster | Creates the kind cluster, installs MetalLB, and derives an IP pool from the kind Docker network |
deps | Clones nebari-operator, runs its dev/scripts/services/install.sh (Envoy Gateway, cert-manager, Keycloak) and keycloak/setup.sh, then installs the operator release |
label-ns | Creates the namespace and labels it nebari.dev/managed=true |
deploy | Installs the chart from ../chart with the dev values |
update-hosts | Appends 127.0.0.1 superset.localhost to /etc/hosts — uses sudo |
The MetalLB pool is computed from the Docker network at runtime rather than hardcoded, which is what lets it work across machines.
update-hosts is the one step that touches your machine outside Docker. It is idempotent —
it greps before appending — but it does prompt for sudo.
Overridable variables
Section titled “Overridable variables”| Variable | Default |
|---|---|
CLUSTER_NAME | superset-dev |
NAMESPACE | superset |
HOSTNAME | superset.localhost |
OPERATOR_REF | main |
make up CLUSTER_NAME=my-superset HOSTNAME=superset.testOPERATOR_REF is worth knowing about: deps clones the operator at that ref and runs its
service-install scripts, so a breaking change on the operator’s main shows up here first.
Pin it to a release tag when you want a stable local stack.
Inspecting and iterating
Section titled “Inspecting and iterating”make test # pods, services, NebariApp, HTTPRoute, SecurityPolicymake logs # tail Superset logsmake test prints the SecurityPolicy check too. With the pack’s default
enforceAtGateway: false there should be none: the target reports “No SecurityPolicy
found”, which is the correct result, not a failure. Superset owns its own OAuth flow; see
Keycloak OAuth.
Its HTTPRoute check comes back empty for the same reason the printed URL does not work,
so treat that as expected unless you added the routing flags above. The NebariApp itself
records why:
kubectl -n superset get nebariapp -o json \ | jq '.items[] | {name: .metadata.name, conditions: .status.conditions}'Look for RoutingReady: False with reason RoutingNotConfigured.
After a chart edit, re-run the deploy step:
make deployThe cluster and platform stay up, so the loop is a helm upgrade, not a rebuild.
Cleaning up
Section titled “Cleaning up”make downDeletes the kind cluster and removes the cloned operator from /tmp. The /etc/hosts line
is left behind — remove it by hand if it bothers you.
What local development cannot tell you
Section titled “What local development cannot tell you”- TLS. The dev stack never issues a certificate for Superset. The operator only creates
one when it is started with
TLS_CLUSTER_ISSUER_NAMEset, and the dev manifests set only theKEYCLOAK_*variables, so TLS falls back to the shared gateway listener. That listener’s cert covers*.nebari.local, which does not match the defaultsuperset.localhost. Certificate issuance and ACME DNS validation are not exercised here at all. - The Argo CD secret-key rotation. It only appears under Argo CD, and the dev stack installs with Helm. Read Secret key before deploying through GitOps.
- Your identity provider. The dev Keycloak has a seeded realm; group and role names in a real realm will differ, and role mapping is where most OAuth issues live.
Docs site
Section titled “Docs site”Pages live in docs/src/content/docs/; the sidebar is in docs/astro.config.mjs. Merges to
main publish to packs.nebari.dev/superset-pack/,
and pull requests touching docs/ get a preview URL posted as a comment.
cd docsnpm cinpm run dev # hot reload at http://localhost:4321Before pushing, run what CI runs:
npm test && npm run buildbash ../scripts/check-links.shdocs/README.md has
the rest, including npm run preview and checking links against the production base path.