apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: ddb-cluster
  namespace: ddb
  labels:
    app: postgresql
    layer: data
spec:
  # Single instance — cp-1 is the only schedulable node in the 3-CP topology
  # (.163/.166 are dedicated control planes with no workload scheduling/storage).
  # Postgres standby HA is traded away; control-plane/etcd HA is unaffected.
  instances: 1

  # PostgreSQL 16.2
  imageName: ghcr.io/cloudnative-pg/postgresql:16.2

  # Bootstrap: create app database + extensions
  bootstrap:
    initdb:
      database: app
      owner: app
      encoding: UTF8
      localeCollate: C
      localeCType: C
      postInitApplicationSQL:
        - CREATE EXTENSION IF NOT EXISTS vector;
        - CREATE EXTENSION IF NOT EXISTS pgcrypto;
        - CREATE EXTENSION IF NOT EXISTS pg_trgm;

  # Per-app login roles, passwords sourced from secrets (CNPG reconciles the
  # role password to match the secret). Their databases are separate Database
  # CRs (see authentik-database.yaml / temporal-database.yaml) owned by these
  # roles. Replaces the old helmfile post-sync user-creation hook.
  managed:
    roles:
      - name: authentik
        ensure: present
        login: true
        passwordSecret:
          name: authentik-db-role
      - name: temporal
        ensure: present
        login: true
        passwordSecret:
          name: temporal-db-role

  # Disable superuser (security)
  enableSuperuserAccess: false

  # PostgreSQL configuration
  postgresql:
    parameters:
      shared_buffers: "256MB"
      max_parallel_workers: "4"
      max_parallel_workers_per_gather: "4"
      # WAL archiving for backups
      archive_mode: "on"
      archive_timeout: "5min"
      log_destination: "csvlog"
      log_directory: "/controller/log"
      log_filename: "postgres"
      log_rotation_age: "0"
      dynamic_shared_memory_type: "posix"

  # Storage on Longhorn
  storage:
    size: 10Gi
    storageClass: longhorn

  # Monitoring
  monitoring:
    enablePodMonitor: false
    disableDefaultQueries: false
    customQueriesConfigMap:
      - name: cnpg-default-monitoring
        key: queries

  # Pod anti-affinity for spreading replicas
  affinity:
    podAntiAffinityType: preferred
