Helm Chart
Quick Install
Section titled “Quick Install”helm repo add nora https://getnora-io.github.io/helm-chartshelm repo updatehelm install nora nora/nora -n nora-system --create-namespaceThis deploys NORA with local storage (10 Gi PVC), GC enabled, and ClusterIP service on port 4000.
values.yaml Reference
Section titled “values.yaml Reference”| Key | Default | Description |
|---|---|---|
image.repository | ghcr.io/getnora-io/nora | Container image |
image.tag | "" (Chart appVersion) | Image tag override |
image.pullPolicy | IfNotPresent | Pull policy |
imagePullSecrets | [] | Registry pull secrets |
Service & Ingress
Section titled “Service & Ingress”| Key | Default | Description |
|---|---|---|
service.type | ClusterIP | Service type |
service.port | 4000 | Service port |
ingress.enabled | false | Enable Ingress |
ingress.className | "" | Ingress class |
ingress.annotations | {} | Ingress annotations |
ingress.hosts | see values.yaml | Host rules |
ingress.tls | [] | TLS configuration |
Persistence
Section titled “Persistence”| Key | Default | Description |
|---|---|---|
persistence.enabled | true | Enable PVC |
persistence.size | 10Gi | Volume size |
persistence.storageClass | "" | StorageClass (empty = default) |
persistence.accessModes | [ReadWriteOnce] | PVC access modes |
NORA Configuration
Section titled “NORA Configuration”| Key | Default | Description |
|---|---|---|
config.server.host | 0.0.0.0 | Bind address |
config.server.port | 4000 | Listen port |
config.storage.mode | local | Storage backend: local or s3 |
config.storage.path | /data/storage | Data path |
config.docker.proxy_timeout | 60 | Docker upstream timeout (s) |
config.docker.upstreams | [] | Docker upstream registries |
config.gc.enabled | true | Enable garbage collection |
config.gc.interval | 86400 | GC interval (s) |
config.retention.enabled | false | Enable retention policies |
config.retention.interval | 86400 | Retention interval (s) |
Secrets & Environment
Section titled “Secrets & Environment”| Key | Default | Description |
|---|---|---|
existingSecret | "" | Existing Secret with secrets.toml key (for private registry credentials) |
extraEnv | [] | Extra env vars — native Kubernetes env spec |
extraEnvFrom | [] | Extra envFrom entries (secretRef / configMapRef) |
Resources & Scheduling
Section titled “Resources & Scheduling”| Key | Default | Description |
|---|---|---|
resources.requests.cpu | 100m | CPU request |
resources.requests.memory | 128Mi | Memory request |
resources.limits.memory | 512Mi | Memory limit |
nodeSelector | {} | Node selector |
tolerations | [] | Tolerations |
affinity | {} | Affinity rules |
Pod Security
Section titled “Pod Security”| Key | Default | Description |
|---|---|---|
podSecurityContext.fsGroup | 1000 | Pod filesystem group |
securityContext.runAsNonRoot | true | Non-root enforcement |
securityContext.runAsUser | 1000 | Container UID |
securityContext.readOnlyRootFilesystem | true | Read-only root FS |
Configuration Patterns
Section titled “Configuration Patterns”1. Simple env var
Section titled “1. Simple env var”extraEnv: - name: NORA_AUTH_ENABLED value: "true" - name: NORA_RATE_LIMIT_ENABLED value: "false"2. Secret reference (single key)
Section titled “2. Secret reference (single key)”extraEnv: - name: NORA_STORAGE_S3_ACCESS_KEY valueFrom: secretKeyRef: name: s3-credentials key: access-key - name: NORA_STORAGE_S3_SECRET_KEY valueFrom: secretKeyRef: name: s3-credentials key: secret-key3. Bulk injection from Secret
Section titled “3. Bulk injection from Secret”Inject all keys from a Secret as env vars:
extraEnvFrom: - secretRef: name: nora-all-secrets4. existingSecret for private registry credentials
Section titled “4. existingSecret for private registry credentials”Keep Docker upstream credentials out of values.yaml. Create a Secret with a secrets.toml key:
apiVersion: v1kind: Secretmetadata: name: nora-registry-credsstringData: secrets.toml: | [[docker.upstreams]] url = "https://private.registry.io" auth = "user:token"Then reference it:
existingSecret: nora-registry-credsThese upstreams merge with config.docker.upstreams. The Secret wins for duplicate URLs.
5. ConfigMap reference
Section titled “5. ConfigMap reference”extraEnvFrom: - configMapRef: name: nora-feature-flagsIngress Example
Section titled “Ingress Example”nginx Ingress Controller
Section titled “nginx Ingress Controller”ingress: enabled: true className: nginx annotations: cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" hosts: - host: registry.example.com paths: - path: / pathType: Prefix tls: - secretName: nora-tls hosts: - registry.example.comContour HTTPProxy
Section titled “Contour HTTPProxy”Use raw manifests — see Kubernetes examples.
S3 Storage Example
Section titled “S3 Storage Example”config: storage: mode: s3 path: /data/storage # local cache path
extraEnv: - name: NORA_STORAGE_S3_URL value: "https://s3.amazonaws.com" - name: NORA_STORAGE_BUCKET value: "nora-registry" - name: NORA_STORAGE_S3_REGION value: "us-east-1" - name: NORA_STORAGE_S3_ACCESS_KEY valueFrom: secretKeyRef: name: s3-credentials key: access-key - name: NORA_STORAGE_S3_SECRET_KEY valueFrom: secretKeyRef: name: s3-credentials key: secret-keyMigration from v0.1.8
Section titled “Migration from v0.1.8”Chart v0.1.9 replaces env and secrets with extraEnv and extraEnvFrom.
Before (v0.1.8):
env: NORA_AUTH_ENABLED: "true"secrets: NORA_STORAGE_S3_SECRET_KEY: "my-key"After (v0.1.9):
extraEnv: - name: NORA_AUTH_ENABLED value: "true" - name: NORA_STORAGE_S3_SECRET_KEY valueFrom: secretKeyRef: name: my-s3-secret key: secret-keyWhy: The old secrets map stored sensitive values in values.yaml — an anti-pattern for GitOps. extraEnv with secretKeyRef keeps secrets in Kubernetes Secrets where they belong.
Uninstall
Section titled “Uninstall”helm uninstall nora -n nora-systemSee Also
Section titled “See Also”- Settings Reference — all NORA environment variables
- Production Guide — reverse proxy, TLS, systemd
- Kubernetes Examples — raw manifests, Kustomize
- Source code