chore: remove Bitnami dependency and add native PostgreSQL StatefulSet

Replaces Bitnami postgresql subchart with native StatefulSet + Service
using official postgres:16 image. Updates values.yaml schema, adds
postgresql-statefulset.yaml, postgresql-service.yaml, and fixes
db-credentials-secret.yaml to use shared password variable.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Flea Flicker
2026-03-27 17:57:57 +00:00
parent 21322ad74e
commit bb75b3237c
6 changed files with 101 additions and 13 deletions
-5
View File
@@ -15,8 +15,3 @@ keywords:
- pet-grooming - pet-grooming
- scheduling - scheduling
- crm - crm
dependencies:
- name: postgresql
version: "16.x.x"
repository: https://charts.bitnami.com/bitnami
condition: postgresql.integrated.enabled
+1 -1
View File
@@ -98,7 +98,7 @@ Migrate image reference
{{/* {{/*
Database URL differs by postgresql.mode Database URL differs by postgresql.mode
Integrated: construct from Bitnami subchart values Integrated: construct from chart-managed PostgreSQL credentials
Operator: read from credentialsSecret Operator: read from credentialsSecret
*/}} */}}
{{- define "groombook.databaseSecretName" -}} {{- define "groombook.databaseSecretName" -}}
@@ -1,4 +1,5 @@
{{- if eq .Values.postgresql.mode "integrated" }} {{- if eq .Values.postgresql.mode "integrated" }}
{{- $password := default (randAlphaNum 16) .Values.postgresql.integrated.auth.password }}
apiVersion: v1 apiVersion: v1
kind: Secret kind: Secret
metadata: metadata:
@@ -7,5 +8,6 @@ metadata:
{{- include "groombook.labels" . | nindent 4 }} {{- include "groombook.labels" . | nindent 4 }}
type: Opaque type: Opaque
stringData: stringData:
database-url: {{ printf "postgres://%s:%s@%s-postgresql:5432/%s" .Values.postgresql.integrated.auth.username (default (randAlphaNum 16) .Values.postgresql.integrated.auth.password) (include "groombook.fullname" .) .Values.postgresql.integrated.auth.database | quote }} postgresql-password: {{ $password | quote }}
{{- end }} database-url: {{ printf "postgres://%s:%s@%s-postgresql:5432/%s" .Values.postgresql.integrated.auth.username $password (include "groombook.fullname" .) .Values.postgresql.integrated.auth.database | quote }}
{{- end }}
@@ -0,0 +1,19 @@
{{- if eq .Values.postgresql.mode "integrated" }}
apiVersion: v1
kind: Service
metadata:
name: {{ include "groombook.fullname" . }}-postgresql
labels:
{{- include "groombook.labels" . | nindent 4 }}
app.kubernetes.io/component: postgresql
spec:
type: ClusterIP
selector:
{{- include "groombook.selectorLabels" . | nindent 4 }}
app.kubernetes.io/component: postgresql
ports:
- port: 5432
targetPort: 5432
protocol: TCP
name: postgresql
{{- end }}
@@ -0,0 +1,72 @@
{{- if eq .Values.postgresql.mode "integrated" }}
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: {{ include "groombook.fullname" . }}-postgresql
labels:
{{- include "groombook.labels" . | nindent 4 }}
app.kubernetes.io/component: postgresql
spec:
serviceName: {{ include "groombook.fullname" . }}-postgresql
replicas: 1
selector:
matchLabels:
{{- include "groombook.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: postgresql
template:
metadata:
labels:
{{- include "groombook.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: postgresql
spec:
containers:
- name: postgresql
image: {{ .Values.postgresql.integrated.image }}
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5432
name: postgresql
protocol: TCP
env:
- name: POSTGRES_DB
value: {{ .Values.postgresql.integrated.auth.database | quote }}
- name: POSTGRES_USER
value: {{ .Values.postgresql.integrated.auth.username | quote }}
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: {{ include "groombook.fullname" . }}-db-credentials
key: postgresql-password
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
readinessProbe:
exec:
command:
- pg_isready
- -U
- {{ .Values.postgresql.integrated.auth.username | quote }}
initialDelaySeconds: 10
periodSeconds: 10
livenessProbe:
exec:
command:
- pg_isready
- -U
- {{ .Values.postgresql.integrated.auth.username | quote }}
initialDelaySeconds: 30
periodSeconds: 30
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
{{- if .Values.postgresql.integrated.storage.storageClass }}
storageClassName: {{ .Values.postgresql.integrated.storage.storageClass }}
{{- end }}
resources:
requests:
storage: {{ .Values.postgresql.integrated.storage.size }}
{{- end }}
+5 -5
View File
@@ -52,18 +52,18 @@ migrate:
# -- PostgreSQL configuration # -- PostgreSQL configuration
postgresql: postgresql:
# Choose deployment mode: 'integrated' uses Bitnami subchart, 'operator' creates a CNPG Cluster CR # Choose deployment mode: 'integrated' deploys a native PostgreSQL StatefulSet, 'operator' creates a CNPG Cluster CR
mode: integrated mode: integrated
integrated: integrated:
enabled: true # set to false if mode is 'operator' image: postgres:16
storage:
size: 10Gi
storageClass: ""
auth: auth:
database: groombook database: groombook
username: groombook username: groombook
password: "" # auto-generated if empty password: "" # auto-generated if empty
existingSecret: "" existingSecret: ""
primary:
persistence:
size: 8Gi
operator: operator:
instances: 3 instances: 3
storage: storage: