Skip to content

App CRD Reference

Complete field-by-field reference for the App custom resource.

API Version: apps.nebari.dev/v1alpha1 Kind: App Scope: Namespaced — the namespace must be labeled nebari.dev/managed=true. Source: operator/api/v1alpha1/app_types.go

apiVersion: apps.nebari.dev/v1alpha1
kind: App
metadata:
name: team-site
namespace: team-analytics
labels:
apps.nebari.dev/owner: jdoe
spec:
displayName: "Team Site"
description: "The team's documentation site"
owner: jdoe
source:
type: git
git:
url: https://github.com/org/site
ref: main
subdir: public
runtime:
replicas: 1
env:
- name: LOG_LEVEL
value: info
resources:
requests: { cpu: 250m, memory: 512Mi }
limits: { cpu: "1", memory: 1Gi }
access:
public: false
groups: ["analytics"]
users: ["alice"]
subdomain: team-site
status:
phase: Running
url: https://team-site.apps.example.ai
replicas: { desired: 1, ready: 1 }
conditions: [ ... ]
message: all replicas ready
FieldTypeRequiredDescription
displayNamestringYesHuman-readable name (max 64 chars); shown in the UI and on the landing page.
descriptionstringNoShort description (max 256 chars).
thumbnailstringNoData-URI image for catalogs / the landing-page tile.
ownerstringNoKeycloak preferred_username that manages the app. The API sets this from the caller’s token.
sourceAppSourceYesWhere the app’s content comes from.
runtimeAppRuntimeNoProcess configuration: env, resources, replicas.
accessAppAccessYesWho can reach the app and at which subdomain.
FieldTypeRequiredDescription
typestringYesgit | inline | pvc. Exactly one matching payload field must be set.
inlineInlineSourceFor inlineSmall content carried in the CR.
gitGitSourceFor gitContent cloned from a git repository.
pvcPVCSourceFor pvcContent already present on a PersistentVolumeClaim.

The source is independent of the app kind: without runtime.pixiTask the content is served statically by nginx; with it, the content is a pixi project run as a Python app.

FieldTypeRequiredDescription
filesmap[string]stringYesRelative file paths → contents (nested paths like pkg/mod.py are supported). Materialized as a ConfigMap-backed volume. Keep under ~900KB total (ConfigMap limit). Paths must be relative and must not contain ...
FieldTypeRequiredDefaultDescription
urlstringYesHTTPS git repository URL.
refstringNomainBranch, tag, or commit.
subdirstringNorepo rootPath within the repository containing the content root. Must not contain ...

The clone happens in a non-root init container at pod start; re-deploying picks up the current state of the ref.

FieldTypeRequiredDescription
claimNamestringYesName of an existing PersistentVolumeClaim in the app’s namespace.
subPathstringNoSub-path within the volume to serve.
FieldTypeRequiredDefaultDescription
env[]EnvVarNoEnvironment variables.
resourcesResourceRequirementsNoCPU/memory requests and limits.
replicasintNo1Desired replicas. 0 stops the app (phase Stopped).
keepAliveboolNofalseReserved for scale-to-zero idle reaping (not yet implemented).
pixiTaskstringNoWhen set, the app runs as a Python/pixi service: the operator copies the source into a writable workspace, runs pixi install (--locked when a pixi.lock is present), then pixi run <pixiTask>. The task must start a server on 0.0.0.0:8080 (PORT=8080 and HOME=/app are injected). Max 64 chars.
FieldTypeRequiredDescription
publicboolNotrue disables authentication entirely (anonymous access).
groups[]stringNoKeycloak groups allowed to use the app. Empty = any signed-in user.
users[]stringNoAdditional individual users.
subdomainstringYesLowercase DNS label. The app is served at https://<subdomain>.<appsDomain>.
FieldTypeDescription
phasestringPending | Deploying | Running | Failed | Stopped.
urlstringWhere the app is (or will be) reachable.
replicasobject{desired, ready} counts from the Deployment.
conditions[]ConditionSee below.
observedGenerationint64Last metadata.generation the operator processed.
messagestringHuman-readable summary.
ConditionMeaning
ValidatedThe spec is coherent and the namespace is opted in. False with reason ValidationFailed is terminal until the spec changes.
WorkloadReadyAll desired replicas are ready.
RoutingReadyMirrors the child NebariApp’s Ready condition (routing, TLS, auth).

For each App the operator creates (and owns, via ownerReferences):

ChildNamePurpose
ConfigMapapp-<name>-contentInline source files (inline apps only).
Deploymentapp-<name>The app workload (hardened: non-root, no privilege escalation, seccomp RuntimeDefault).
Serviceapp-<name>ClusterIP on port 8080.
NebariAppapp-<name>Routing + TLS + auth + landing-page tile, reconciled by the nebari-operator (contract pinned to v0.1.0-alpha.19).

Deleting the App cascades through all of them.