--- # Shared CNPG Cluster for S5 application databases (RAILIANCE-WP-0003). # Owned by railiance-platform (S3). Operator lives in cnpg-system. # # Apply: kubectl apply -f helm/apps-pg-cluster.yaml # Status: kubectl cnpg status apps-pg -n databases (requires cnpg kubectl plugin) # or: kubectl get cluster apps-pg -n databases -o wide # # Pre-condition: apps-pg-credentials Secret must exist in databases ns. # See helm/apps-pg-secret.sops.yaml.template for the bootstrap recipe. # # Consumer onboarding: see docs/apps-pg.md. The bootstrap role apps_admin # and meta DB apps_meta exist only to anchor the cluster; per-app roles # and databases are added through the documented onboarding contract. apiVersion: postgresql.cnpg.io/v1 kind: Cluster metadata: name: apps-pg namespace: databases labels: app.kubernetes.io/name: apps-pg app.kubernetes.io/component: database app.kubernetes.io/managed-by: manual railiance.io/layer: s3-platform railiance.io/role: shared-apps-database spec: instances: 1 # bump to 3 when node RAM > 8GB imageName: ghcr.io/cloudnative-pg/postgresql:16 resources: requests: cpu: 100m memory: 256Mi limits: cpu: "1" memory: 1Gi storage: size: 10Gi bootstrap: initdb: database: apps_meta owner: apps_admin secret: name: apps-pg-credentials # Per-app PostgreSQL roles are added here (CNPG 1.28 role lifecycle is # cluster-scoped — no standalone Role CR). The credential Secret for # each role lives in the databases namespace and is mirrored into the # consumer namespace by the consuming repo. See docs/apps-pg.md. managed: roles: - name: vergabe # RAILIANCE-WP-0002 T04 (vergabe-teilnahme) ensure: present login: true connectionLimit: 20 passwordSecret: name: vergabe-app-credentials - name: coulomb_social # CSOC-WP-0002 (coulomb-social) ensure: present login: true connectionLimit: 20 passwordSecret: name: coulomb-social-app-credentials postgresql: parameters: max_connections: "100" log_connections: "on" log_disconnections: "on" log_lock_waits: "on" log_min_duration_statement: "1000" track_io_timing: "on" backup: retentionPolicy: "30d" barmanObjectStore: # The bucket policy grants this runtime identity only platform-pg/*. # Keep apps-pg distinct beneath that governed top-level prefix. destinationPath: s3://railiance-platform-pg-backup/platform-pg/apps-pg/ endpointURL: https://s3.nl-ams.scw.cloud s3Credentials: accessKeyId: name: platform-pg-backup-s3 key: ACCESS_KEY_ID secretAccessKey: name: platform-pg-backup-s3 key: ACCESS_SECRET_KEY wal: compression: gzip maxParallel: 2 data: compression: gzip jobs: 2 # HA replica + connection pooler are deferred (RAILIANCE-WP-0003 Notes): # services: # additional: # - selectorType: rw # serviceTemplate: # metadata: # name: apps-pg-pooler-rw