# PostgreSQL fuer Buchungen, Zahlungen, Gutscheine und Protokoll. # # SPEICHER: Blockspeicher mit ReadWriteOnce verwenden (z. B. Longhorn, # local-path, Ceph RBD). KEINE SMB/CIFS-Freigabe als Datenverzeichnis: # SMB bildet POSIX-Sperren, fsync-Garantien und Dateirechte nicht so ab, # wie PostgreSQL sie fuer Absturzsicherheit voraussetzt — Datenverlust bei # Stromausfall oder Neustart ist die Folge. Sicherungen (backup-CronJob) # duerfen dagegen auf SMB/NFS liegen. # # Alternative fuer hoehere Verfuegbarkeit: CloudNativePG-Operator; dann # dieses Manifest weglassen und DATABASE_URL auf dessen Service zeigen lassen. apiVersion: apps/v1 kind: StatefulSet metadata: name: artista-postgres spec: serviceName: artista-postgres replicas: 1 selector: matchLabels: app.kubernetes.io/name: artista-postgres template: metadata: labels: app.kubernetes.io/name: artista-postgres spec: securityContext: runAsNonRoot: true runAsUser: 70 runAsGroup: 70 fsGroup: 70 seccompProfile: { type: RuntimeDefault } containers: - name: postgres image: postgres:18.1-alpine ports: - containerPort: 5432 env: - name: POSTGRES_USER value: artista - name: POSTGRES_DB value: artista - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: { name: artista-secrets, key: DB_PASSWORD } volumeMounts: # Ab PostgreSQL 18 liegt PGDATA unter /var/lib/postgresql/18/docker. - name: data mountPath: /var/lib/postgresql readinessProbe: exec: { command: ["pg_isready", "-U", "artista"] } periodSeconds: 5 livenessProbe: exec: { command: ["pg_isready", "-U", "artista"] } initialDelaySeconds: 30 periodSeconds: 20 resources: requests: { cpu: 100m, memory: 256Mi } limits: { memory: 1Gi } securityContext: allowPrivilegeEscalation: false capabilities: { drop: ["ALL"] } volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] # storageClassName: longhorn resources: requests: storage: 10Gi --- apiVersion: v1 kind: Service metadata: name: artista-postgres spec: clusterIP: None selector: app.kubernetes.io/name: artista-postgres ports: - port: 5432