Skip to content

feat: admin-provisioned nebi OCI registries for user pods - #202

Open
tylerpotts wants to merge 7 commits into
mainfrom
feat/nebi-config-registries
Open

feat: admin-provisioned nebi OCI registries for user pods#202
tylerpotts wants to merge 7 commits into
mainfrom
feat/nebi-config-registries

Conversation

@tylerpotts

@tylerpotts tylerpotts commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Chart-side wiring for nebari-dev/nebi#475 (companion to nebari-dev/nebi#477).

Summary

Note (2026-08-07): requirements changed to support public OCI registries only. Credential fields were removed from the values schema, and since the rendered config no longer contains secrets it is now a ConfigMap rather than a Secret.

  • New values: nebi.registries (list of admin-provisioned public OCI registries, passed through verbatim in nebi's own registries.entries schema: name, url, namespace, default) and nebi.seedDefaultRegistry (set false to remove the built-in quay.io/nebari_environments registry from every user's nebi instance).
  • When either value is customized, the chart renders a nebi config.yaml into a ConfigMap and the spawner mounts it at /etc/nebi/config.yaml in every singleuser pod, a path nebi searches at boot. A single helper (nebi-config) is the source of truth for both the ConfigMap rendering and the spawner substitution, so they cannot diverge.
  • Requires a nebi image containing feat: admin-provisioned OCI registries via config.yaml nebi#477; older nebi versions ignore the mounted section harmlessly.
  • Documented in values.yaml comments and the README, including the caveat that value changes take effect for servers started after the hub restarts.

Test plan

  • 3 spawner unit tests (unrendered placeholder, empty name, real name -> volume + mount); full unit suite 96 passed
  • helm lint clean; helm template verified for all three cases (defaults -> no ConfigMap, registries set -> ConfigMap + mount, seedDefaultRegistry=false alone -> ConfigMap with seed_default: false)
  • Rendered config.yaml parses and matches nebi's public-only config schema
  • Live cluster verification (2026-08-07, NIC hetzner-k3s tyler-hetzner-dev, ArgoCD-deployed from this branch with nebi sha-a511a19): user pod gets /etc/nebi/config.yaml from the ConfigMap, nebi reports v0.13-53-ga511a19, /api/v1/registries returns only the config-managed entry (config_managed: true, is_default: true, no credentials) with the default seed suppressed, and update/delete on it return 409

nebi local mode rejects non-loopback Origin headers, which browsers send
on the SPA's crossorigin asset requests, blanking the Nebi tile
(nebari-dev/nebi#489). Inject NEBI_SERVER_ALLOWED_ORIGINS with the hub's
public origin; requires a nebi build with server.allowed_origins
(nebari-dev/nebi#490), older builds ignore the variable.
@tylerpotts

Copy link
Copy Markdown
Contributor Author

Added spawner wiring for nebari-dev/nebi#489: user pods now get NEBI_SERVER_ALLOWED_ORIGINS=https:// so nebi netguard accepts the browser's CORS-mode asset requests. Companion nebi change: nebari-dev/nebi#490. Without the pair, any nebi image newer than sha-cad5783 renders a blank Nebi tile.

…gMap

Requirements changed: admin-provisioned nebi OCI registries support
public registries only, so entries no longer carry username/password/
api_token. With no credentials in the rendered config.yaml there is no
reason for a Secret; render a ConfigMap instead and mount that.
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.

2 participants