Skip to content

docs: document pack setup for administrators - #229

Merged
aktech merged 1 commit into
mainfrom
docs/admin-setup
Aug 20, 2026
Merged

docs: document pack setup for administrators#229
aktech merged 1 commit into
mainfrom
docs/admin-setup

Conversation

@jbouder

@jbouder jbouder commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

Issue asks Where
What are the yaml config options and what does each one do? Values reference — every field in keycloak, subdomains, nebariapp, singleuser, singleuserCuller, sharedStorage, nebi, rbac.bootstrap, jupyterhub.custom, plus the upstream passthrough
How do I integrate nebi to this? Nebi integration
How do I integrate MLflow to this? MLflow integration
General JHub setup (server sizes, etc.) Server profiles
(setup itself) Admin setup — prerequisites, the derivation model, what the chart creates, verification

Deliberately not reinventing other open docs PRs

I read the open docs: PRs first and scoped around them:

PR Adds How this PR relates
#204 nebi-in-jupyterlab.md — Nebi user workflows My Nebi page is the admin side (images, OIDC clients, token exchange, registries, NetworkPolicies) and links out to #204 rather than restating it
#139 gpu-profiles.md — GPU requests, tolerations, the replace-not-append trap Server profiles covers the general profile model and defers the GPU specifics to #139 with a link
#219 gallery.md + one row in configuration.md Untouched
#142 examples/ values + ArgoCD app Untouched

To keep those mergeable, edits to existing pages are additive only: configuration.md gains a "Detailed guides" list appended below its table (#219 adds a row to the table, so no overlap), and index.md gains an Administration section. Neither is restructured.

Content came from the chart, not the README

Everything is derived from values.yaml, templates/, _helpers.tpl, and config/jupyterhub/*.py, so derivation rules and defaults match what actually renders. Three things get explicit callouts because they fail quietly:

  1. jupyterhub.hub.extraVolumes / extraVolumeMounts replace on override. Both carry custom-config (the jupyterhub_config.d ConfigMap) and oauth-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.

  2. The base domain is keycloak.hostname minus its first label. A single-label value derives an empty hub hostname, Nebi URL, and token URL — the chart renders fine and nothing routes.

  3. 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:

  • mlflow is not in the JupyterLab image (images/jupyterlab/pixi.toml). Setting MLFLOW_TRACKING_URI alone does nothing — import mlflow fails. The page says so and shows the Nebi/pixi and pip routes.
  • jupyterhub.custom.storage-capacity (home PVC size, default 20Gi) is read by 01-spawner.py but isn't in values.yaml. It's documented in the Values reference; adding it to values.yaml with 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 ## License so it doesn't collide with #139's README edit in the Configuration section.

Verification

npm test               9 passed
npm run build          12 pages, pagefind index built
check-links.sh         LINKS_OK at BASE=/ and BASE=/data-science-pack/

🤖 Generated with Claude Code

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.
@github-actions

Copy link
Copy Markdown
Contributor

Docs preview for docs/admin-setup:
https://docs-admin-setup.data-science-pack.pages.dev

@aktech
aktech merged commit d98c4f9 into main Aug 20, 2026
15 of 16 checks passed
@aktech
aktech deleted the docs/admin-setup branch August 20, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[DOC] - Document pack setup as an admin

3 participants