docs: document pack setup for administrators - #229
Merged
Conversation
Closes #89. Adds five administrator pages to the existing Astro + Starlight site, covering the four questions the issue asks: Administration admin-setup cluster prerequisites, the single required value and everything derived from it, what the chart creates, the Keycloak bootstrap Job, and a verification checklist server-profiles profile_list sizing, profile_options image choices, access: all/yaml/keycloak gating, idle culling, and the two per-user PVCs nebi-integration what nebi-pack must already provide, the derived OIDC client IDs, the 3-step token exchange and its five inputs, both NetworkPolicies, workspace storage, and admin-provisioned registries mlflow-integration tracking URI, the egress rule, the client library, verification, and what the integration does not give you Reference values-reference field-by-field for keycloak, subdomains, nebariapp, singleuser, singleuserCuller, sharedStorage, nebi, rbac.bootstrap, jupyterhub.custom, and the upstream passthrough Content is derived from values.yaml, the templates, _helpers.tpl, and config/jupyterhub/*.py rather than paraphrased from the README, so the derivation rules and defaults match what the chart renders. Three things that are easy to get wrong get explicit callouts: - jupyterhub.hub.extraVolumes / extraVolumeMounts are lists, so overriding either drops the custom-config and oauth-client mounts and the hub silently falls back to dummy auth with an empty jupyterhub_config.d. - The base domain is keycloak.hostname minus its first label, so a single-label value derives an empty hub hostname, Nebi URL, and token URL - the chart renders and nothing routes. - z2jh defaults singleuser egress to deny private IPs, and a NetworkPolicy rule must name the pod port (5000 for MLflow), not the Service port, because the rule is evaluated after kube-proxy has already translated the ClusterIP. Existing pages are touched as little as possible so the other open docs PRs stay mergeable: configuration.md gains a "Detailed guides" list appended below its section table, and index.md gains an Administration section. Neither restructures what is there. Also adds a Documentation section to the README, which had no link to the published site.
Contributor
|
Docs preview for |
aktech
approved these changes
Aug 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #89.
Adds five administrator pages to the existing Astro + Starlight site on
main, covering the four questions the issue asks.Supersedes #92, which proposed a second, Docusaurus-based docs site. That PR predates #201, which landed the Astro site this repo now uses — its only content was a 10-line placeholder
introduction.mdx; the rest was Docusaurus scaffolding and a lockfile. There is nothing in it to port. I'll close it once this is reviewed.Issue requirements → pages
keycloak,subdomains,nebariapp,singleuser,singleuserCuller,sharedStorage,nebi,rbac.bootstrap,jupyterhub.custom, plus the upstream passthroughDeliberately not reinventing other open docs PRs
I read the open
docs:PRs first and scoped around them:nebi-in-jupyterlab.md— Nebi user workflowsgpu-profiles.md— GPU requests, tolerations, the replace-not-append trapgallery.md+ one row inconfiguration.mdexamples/values + ArgoCD appTo keep those mergeable, edits to existing pages are additive only:
configuration.mdgains a "Detailed guides" list appended below its table (#219 adds a row to the table, so no overlap), andindex.mdgains an Administration section. Neither is restructured.Content came from the chart, not the README
Everything is derived from
values.yaml,templates/,_helpers.tpl, andconfig/jupyterhub/*.py, so derivation rules and defaults match what actually renders. Three things get explicit callouts because they fail quietly:jupyterhub.hub.extraVolumes/extraVolumeMountsreplace on override. Both carrycustom-config(thejupyterhub_config.dConfigMap) andoauth-client(the OIDC Secret). Override either without re-including them and the hub comes up with an empty config directory and dummy auth. The values file warns about this; it now appears in Admin setup and Values reference too.The base domain is
keycloak.hostnameminus its first label. A single-label value derives an empty hub hostname, Nebi URL, and token URL — the chart renders fine and nothing routes.The MLflow NetworkPolicy must name port 5000, not 80. z2jh defaults
singleuser.networkPolicy.egressAllowRules.privateIPs: false, so user pods can't reach in-cluster services at all without an explicit rule — and the rule is evaluated after kube-proxy has translated the ClusterIP, so a rule written against the Service port matches nothing and every connection times out silently.Two smaller things worth flagging from reading the code:
mlflowis not in the JupyterLab image (images/jupyterlab/pixi.toml). SettingMLFLOW_TRACKING_URIalone does nothing —import mlflowfails. The page says so and shows the Nebi/pixi andpiproutes.jupyterhub.custom.storage-capacity(home PVC size, default20Gi) is read by01-spawner.pybut isn't invalues.yaml. It's documented in the Values reference; adding it tovalues.yamlwith its default would be a reasonable follow-up.Also
Adds a Documentation section to the README, which had no link to the published docs site. Placed before
## Licenseso it doesn't collide with #139's README edit in the Configuration section.Verification
🤖 Generated with Claude Code