Paperless-ngx chart: naming scheme, secret refs, pinned init images (conventions batch 3)

Batch-3 major PR for paperless-ngx (issue #32):

- secrets.redisRef/databaseRef/paperlessRef -> redisSecretRef/
  databaseSecretRef/paperlessSecretRef (consistent with the other
  SecretRef values in the same block); CI fixtures updated
- TLS secret renamed to the standard tls-<release>-<chart>-ingress
  (domain no longer part of the name)
- busybox init/cronjob image pinned via paperless.busybox.image
  values, default bumped 1.28 -> 1.38.0
- probes values-configurable (defaults unchanged, incl. the 600s
  startup budget); consume CronJob deliberately stays probe-less
- ingress standard: ingress.className (default nginx) and
  ingress.annotations merge; domain/clusterIssuer stay required
- additive paperless.env block rendered through tpl (value,
  secretKeyRef, configMapKeyRef forms)
- disabled scripts ConfigMap renamed to ...-configmap; PVC names kept
  as documented naming-scheme exception (comments in the templates)
- chart 8.0.1+up3.0.5 -> 9.0.0+up3.0.5 (breaking values changes)
This commit is contained in:
jklein committed 2026-08-22 19:39:54 +02:00
1 parent 6bca19d921
commit 29ac6d09c5
13 files changed
+93 -40

No files matched your search

+3 -3
View File
@@ -1,7 +1,7 @@
secrets: secrets:
redisRef: op://ci/paperless-redis redisSecretRef: op://ci/paperless-redis
databaseRef: op://ci/paperless-db databaseSecretRef: op://ci/paperless-db
paperlessRef: op://ci/paperless paperlessSecretRef: op://ci/paperless
ingress: ingress:
domain: paperless.ci.local domain: paperless.ci.local
+1 -1
View File
@@ -5,7 +5,7 @@ icon: https://raw.githubusercontent.com/paperless-ngx/paperless-ngx/dev/src-ui/s
type: application type: application
version: 8.0.1+up3.0.5 version: 9.0.0+up3.0.5
appVersion: 3.0.5 appVersion: 3.0.5
@@ -3,4 +3,4 @@ kind: OnePasswordItem
metadata: metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-db-secret name: {{ .Release.Name }}-{{ .Chart.Name }}-db-secret
spec: spec:
itemPath: {{ required "A secret-reference for the DB-Secret must be provided" .Values.secrets.databaseRef }} itemPath: {{ required "A secret-reference for the DB-Secret must be provided" .Values.secrets.databaseSecretRef }}
@@ -17,7 +17,7 @@ spec:
{{- toYaml .Values.smbConnection.cron.securityContext.pod | nindent 12 }} {{- toYaml .Values.smbConnection.cron.securityContext.pod | nindent 12 }}
containers: containers:
- name: paperless-consume-cronjob - name: paperless-consume-cronjob
image: busybox:1.28 image: "{{ .Values.paperless.busybox.image.repository }}:{{ .Values.paperless.busybox.image.tag }}"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
securityContext: securityContext:
{{- toYaml .Values.smbConnection.cron.securityContext.container | nindent 16 }} {{- toYaml .Values.smbConnection.cron.securityContext.container | nindent 16 }}
@@ -1,6 +1,9 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
# Documented exception from the "-<kind>" naming scheme (issue #32):
# renaming a PVC would provision a new, empty volume, so the historic
# "-consume-volume-claim" name stays.
name: {{ .Release.Name }}-{{ .Chart.Name }}-consume-volume-claim name: {{ .Release.Name }}-{{ .Chart.Name }}-consume-volume-claim
spec: spec:
accessModes: accessModes:
@@ -3,4 +3,4 @@ kind: OnePasswordItem
metadata: metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-secret name: {{ .Release.Name }}-{{ .Chart.Name }}-secret
spec: spec:
itemPath: {{ required "A secret-reference for the Paperless-Secret must be provided" .Values.secrets.paperlessRef }} itemPath: {{ required "A secret-reference for the Paperless-Secret must be provided" .Values.secrets.paperlessSecretRef }}
@@ -26,7 +26,7 @@ spec:
# paperless.securityContext in values.yaml) so the main container can # paperless.securityContext in values.yaml) so the main container can
# run fully hardened (non-root, no privilege escalation). # run fully hardened (non-root, no privilege escalation).
- name: init-run-ownership - name: init-run-ownership
image: busybox:1.28 image: "{{ .Values.paperless.busybox.image.repository }}:{{ .Values.paperless.busybox.image.tag }}"
imagePullPolicy: IfNotPresent imagePullPolicy: IfNotPresent
command: command:
- sh - sh
@@ -185,6 +185,26 @@ spec:
- name: PAPERLESS_DISABLE_REGULAR_LOGIN - name: PAPERLESS_DISABLE_REGULAR_LOGIN
value: "{{ .Values.oidc.disableRegularLogin }}" value: "{{ .Values.oidc.disableRegularLogin }}"
{{- end }} {{- end }}
{{- range $value := .Values.paperless.env }}
{{- if $value.value }}
- name: {{ $value.name }}
value: {{ tpl $value.value $ }}
{{- else if $value.valueFrom }}
{{- if $value.valueFrom.secretKeyRef }}
- name: {{ $value.name }}
valueFrom:
secretKeyRef:
name: {{ tpl $value.valueFrom.secretKeyRef.name $ }}
key: {{ tpl $value.valueFrom.secretKeyRef.key $ }}
{{- else if $value.valueFrom.configMapKeyRef }}
- name: {{ $value.name }}
valueFrom:
configMapKeyRef:
name: {{ tpl $value.valueFrom.configMapKeyRef.name $ }}
key: {{ tpl $value.valueFrom.configMapKeyRef.key $ }}
{{- end }}
{{- end }}
{{- end }}
volumeMounts: volumeMounts:
- mountPath: "/usr/src/paperless/data" - mountPath: "/usr/src/paperless/data"
name: "paperless-volume" name: "paperless-volume"
@@ -206,32 +226,11 @@ spec:
resources: resources:
{{- include "paperless-ngx.resources" .Values.paperless.resources | nindent 12 }} {{- include "paperless-ngx.resources" .Values.paperless.resources | nindent 12 }}
readinessProbe: readinessProbe:
httpGet: {{- toYaml .Values.paperless.readinessProbe | nindent 12 }}
path: /
port: 8000
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
livenessProbe: livenessProbe:
httpGet: {{- toYaml .Values.paperless.livenessProbe | nindent 12 }}
path: /
port: 8000
periodSeconds: 30
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
# The startup probe gates liveness/readiness. Paperless runs database
# migrations on startup, and since 3.0 the first start after an
# upgrade also rebuilds the search index from scratch (Whoosh ->
# Tantivy): budget 10s * 60 = 600s.
startupProbe: startupProbe:
httpGet: {{- toYaml .Values.paperless.startupProbe | nindent 12 }}
path: /
port: 8000
periodSeconds: 10
failureThreshold: 60
timeoutSeconds: 5
restartPolicy: Always restartPolicy: Always
volumes: volumes:
- name: tmp - name: tmp
@@ -2,6 +2,9 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
# Documented exception from the "-<kind>" naming scheme (issue #32):
# renaming a PVC would provision a new, empty volume, so the historic
# "-smb-volume-claim" name stays.
name: {{ .Release.Name }}-{{ .Chart.Name }}-smb-volume-claim name: {{ .Release.Name }}-{{ .Chart.Name }}-smb-volume-claim
spec: spec:
accessModes: accessModes:
@@ -3,11 +3,14 @@ kind: Ingress
metadata: metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-ingress name: {{ .Release.Name }}-{{ .Chart.Name }}-ingress
annotations: annotations:
cert-manager.io/cluster-issuer: {{ required "A Cluster-Issuer must be provided" .Values.ingress.clusterIssuer}} cert-manager.io/cluster-issuer: {{ required "A Cluster-Issuer must be provided" .Values.ingress.clusterIssuer }}
nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.paperless.files.maxUploadFileSize }} nginx.ingress.kubernetes.io/proxy-body-size: {{ .Values.paperless.files.maxUploadFileSize }}
nginx.org/client-max-body-size: {{ .Values.paperless.files.maxUploadFileSize }} nginx.org/client-max-body-size: {{ .Values.paperless.files.maxUploadFileSize }}
{{- with .Values.ingress.annotations }}
{{- toYaml . | nindent 4 }}
{{- end }}
spec: spec:
ingressClassName: nginx ingressClassName: {{ .Values.ingress.className }}
rules: rules:
- host: {{ required "A Domain/Host must be provided" .Values.ingress.domain }} - host: {{ required "A Domain/Host must be provided" .Values.ingress.domain }}
http: http:
@@ -22,4 +25,4 @@ spec:
tls: tls:
- hosts: - hosts:
- {{ required "A Domain/Host must be provided" .Values.ingress.domain }} - {{ required "A Domain/Host must be provided" .Values.ingress.domain }}
secretName: tls-{{ .Release.Name }}-{{ .Chart.Name }}-{{ .Values.ingress.domain }}-ingress secretName: tls-{{ .Release.Name }}-{{ .Chart.Name }}-ingress
@@ -1,6 +1,9 @@
apiVersion: v1 apiVersion: v1
kind: PersistentVolumeClaim kind: PersistentVolumeClaim
metadata: metadata:
# Documented exception from the "-<kind>" naming scheme (issue #32):
# renaming a PVC would provision a new, empty volume, so the historic
# "-volume-claim" name stays.
name: {{ .Release.Name }}-{{ .Chart.Name }}-volume-claim name: {{ .Release.Name }}-{{ .Chart.Name }}-volume-claim
spec: spec:
accessModes: accessModes:
@@ -2,7 +2,7 @@
apiVersion: v1 apiVersion: v1
kind: ConfigMap kind: ConfigMap
metadata: metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-pre-post-consumption-scripts name: {{ .Release.Name }}-{{ .Chart.Name }}-pre-post-consumption-scripts-configmap
data: data:
pre-consume-script: |- pre-consume-script: |-
#!/bin/sh #!/bin/sh
@@ -3,4 +3,4 @@ kind: OnePasswordItem
metadata: metadata:
name: {{ .Release.Name }}-{{ .Chart.Name }}-redis-secret name: {{ .Release.Name }}-{{ .Chart.Name }}-redis-secret
spec: spec:
itemPath: {{ required "A secret-reference for the Redis-Secret must be provided" .Values.secrets.redisRef }} itemPath: {{ required "A secret-reference for the Redis-Secret must be provided" .Values.secrets.redisSecretRef }}
+45 -3
View File
@@ -5,20 +5,31 @@
scaleDown: false scaleDown: false
secrets: secrets:
redisRef: null redisSecretRef: null
databaseRef: null databaseSecretRef: null
paperlessRef: null paperlessSecretRef: null
smbConnectionSecretRef: null smbConnectionSecretRef: null
oidcSecretRef: null oidcSecretRef: null
ingress: ingress:
clusterIssuer: "letsencrypt-issuer" clusterIssuer: "letsencrypt-issuer"
domain: null domain: null
className: nginx
# Extra annotations for the Ingress; merged with the cert-manager
# cluster-issuer and upload-size annotations the chart always sets.
annotations: {}
paperless: paperless:
# Replica count for this workload; 0 is allowed and scales it down. # Replica count for this workload; 0 is allowed and scales it down.
# The chart-global scaleDown flag takes precedence. # The chart-global scaleDown flag takes precedence.
replicas: 1 replicas: 1
# Auxiliary busybox image, used by the /run-ownership init container and the
# SMB consume-mover CronJob. Pinned independently of appVersion (which
# tracks paperless-ngx); reviewed alongside every app-version update round.
busybox:
image:
repository: busybox
tag: "1.38.0"
ocr: ocr:
languages: "eng" languages: "eng"
# Paperless-ngx 3.x modes: auto (default, skips OCR when embedded text # Paperless-ngx 3.x modes: auto (default, skips OCR when embedded text
@@ -53,6 +64,37 @@ paperless:
scripts: scripts:
postConsumptionScripts: [] postConsumptionScripts: []
preConsumptionScripts: [] preConsumptionScripts: []
livenessProbe:
httpGet:
path: /
port: 8000
periodSeconds: 30
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
httpGet:
path: /
port: 8000
periodSeconds: 10
failureThreshold: 3
successThreshold: 1
timeoutSeconds: 5
# The startup probe gates liveness/readiness. Paperless runs database
# migrations on startup, and since 3.0 the first start after an upgrade
# also rebuilds the search index from scratch (Whoosh -> Tantivy):
# budget 10s * 60 = 600s.
startupProbe:
httpGet:
path: /
port: 8000
periodSeconds: 10
failureThreshold: 60
timeoutSeconds: 5
# Extra environment variables, appended to the ones the chart always sets.
# Values are rendered through tpl; value, secretKeyRef and configMapKeyRef
# forms are supported.
env: []
resources: resources:
# Limits are optional: memory and ephemeral-storage limits default to # Limits are optional: memory and ephemeral-storage limits default to
# limitFactor x the request, an explicitly set limit always wins, and a # limitFactor x the request, an explicitly set limit always wins, and a