Compare commits

...

26 Commits

Author SHA1 Message Date
e49f293690 default to monitor on
All checks were successful
renovate / renovate (push) Successful in 41s
lint-and-test / lint-helm (push) Successful in 14s
lint-and-test / chart-testing (push) Successful in 29s
release-charts-generic-device-plugin / release (push) Successful in 23s
release-charts-postgres-cluster / release (push) Successful in 20s
2025-12-14 22:23:36 -06:00
98b01ba2a4 major version upgrade 2025-12-14 22:23:36 -06:00
fdc027a298 add database management 2025-12-14 22:23:36 -06:00
74577ae63d refactor external clusters to a helper 2025-12-14 22:23:36 -06:00
1e52cebbd3 organize 2025-12-14 22:23:36 -06:00
5bc8c7286c add default values 2025-12-14 22:23:36 -06:00
7c8145f741 Merge pull request 'Update ghcr.io/squat/generic-device-plugin:latest Docker digest to aa0571c' (#152) from renovate/ghcr.io-squat-generic-device-plugin-latest into main
All checks were successful
lint-and-test / lint-helm (push) Successful in 25s
lint-and-test / chart-testing (push) Successful in 41s
release-charts-generic-device-plugin / release (push) Successful in 55s
renovate / renovate (push) Successful in 51s
2025-12-15 00:05:37 +00:00
c2ef2a6e0b Update ghcr.io/squat/generic-device-plugin:latest Docker digest to aa0571c
Some checks failed
renovate/stability-days Updates have not met minimum release age requirement
lint-and-test / lint-helm (pull_request) Failing after 1m8s
lint-and-test / chart-testing (pull_request) Successful in 1m34s
2025-12-15 00:05:14 +00:00
0fda9c9db4 fix import
All checks were successful
release-charts-postgres-cluster / release (push) Successful in 17s
release-charts-generic-device-plugin / release (push) Successful in 26s
lint-and-test / lint-helm (push) Successful in 9s
lint-and-test / chart-testing (push) Successful in 48s
renovate / renovate (push) Successful in 1m51s
2025-12-12 16:43:45 -06:00
0765ad2336 disable set for default for ssl 2025-12-12 16:43:45 -06:00
fb667e69bd Merge pull request 'Update ghcr.io/squat/generic-device-plugin:latest Docker digest to d64b1c8' (#151) from renovate/ghcr.io-squat-generic-device-plugin-latest into main
All checks were successful
lint-and-test / lint-helm (push) Successful in 19s
renovate / renovate (push) Successful in 41s
release-charts-generic-device-plugin / release (push) Successful in 24s
lint-and-test / chart-testing (push) Successful in 2m53s
2025-12-12 00:01:34 +00:00
577d6d9288 Update ghcr.io/squat/generic-device-plugin:latest Docker digest to d64b1c8
Some checks failed
lint-and-test / lint-helm (pull_request) Failing after 37s
lint-and-test / chart-testing (pull_request) Successful in 1m6s
renovate/stability-days Updates have not met minimum release age requirement
2025-12-12 00:01:20 +00:00
83f23d6f4a handle conditions better
All checks were successful
renovate / renovate (push) Successful in 1m11s
2025-12-07 16:47:30 -06:00
ef6c469f6c fix paths
All checks were successful
renovate / renovate (push) Successful in 32s
2025-12-06 21:14:18 -06:00
28e6783d73 fix version
All checks were successful
renovate / renovate (push) Successful in 53s
2025-12-06 21:02:23 -06:00
f7b6037ffc Merge pull request 'Update ghcr.io/squat/generic-device-plugin:latest Docker digest to a848216' (#150) from renovate/ghcr.io-squat-generic-device-plugin-latest into main
Some checks failed
renovate / renovate (push) Successful in 29s
release-charts-generic-device-plugin / release (push) Successful in 8m34s
lint-and-test / chart-testing (push) Failing after 9s
lint-and-test / lint-helm (push) Successful in 11s
2025-12-07 01:57:24 +00:00
3941d174a8 Update ghcr.io/squat/generic-device-plugin:latest Docker digest to a848216
Some checks failed
renovate/stability-days Updates have not met minimum release age requirement
lint-and-test / lint-helm (pull_request) Failing after 2m36s
lint-and-test / chart-testing (pull_request) Failing after 9m59s
2025-12-07 01:57:13 +00:00
f693b7f16f use separate jobs
All checks were successful
renovate / renovate (push) Successful in 1m56s
2025-12-04 19:56:00 -06:00
1ac412eafe readd chart testing
All checks were successful
renovate / renovate (push) Successful in 36s
2025-12-04 19:52:28 -06:00
15458b55cb fix
All checks were successful
renovate / renovate (push) Successful in 31s
2025-12-04 19:23:22 -06:00
60288e9ab6 use helm lint instead
All checks were successful
renovate / renovate (push) Successful in 39s
2025-12-04 19:21:19 -06:00
b35dbccfd2 add cache
All checks were successful
renovate / renovate (push) Successful in 35s
2025-12-04 18:57:35 -06:00
c69733c6bb change install uv
All checks were successful
renovate / renovate (push) Successful in 30s
2025-12-04 18:52:41 -06:00
6a2dbcaf85 change node version
All checks were successful
renovate / renovate (push) Successful in 34s
2025-12-04 18:38:16 -06:00
47799c0d0d setup node
All checks were successful
renovate / renovate (push) Successful in 37s
2025-12-04 18:34:30 -06:00
4c0cb5fe18 update testing
All checks were successful
renovate / renovate (push) Successful in 32s
2025-12-04 18:31:25 -06:00
12 changed files with 353 additions and 73 deletions

View File

@@ -2,9 +2,22 @@ name: lint-and-test
on:
pull_request:
branches:
- main
paths:
- 'charts/**'
push:
branches:
- main
paths:
- 'charts/**'
env:
BASE_BRANCH: "origin/${{ gitea.base_ref }}"
jobs:
lint-test:
chart-testing:
runs-on: ubuntu-js
steps:
- name: Checkout
@@ -15,7 +28,13 @@ jobs:
- name: Set up Helm
uses: azure/setup-helm@v4
with:
version: latest
token: ${{ secrets.GITEA_TOKEN }}
version: v3.19.2
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: '24'
- name: Set up Python
uses: actions/setup-python@v6
@@ -53,3 +72,155 @@ jobs:
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/helm-charts/actions?workflow=lint-test.yaml", "clear": true}]'
image: true
lint-helm:
runs-on: ubuntu-js
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check Branch Exists
id: check-branch-exists
if: github.event_name == 'pull_request'
uses: GuillaumeFalourd/branch-exists@v1.1
with:
branch: ${{ gitea.base_ref }}
- name: Report Branch Exists
id: branch-exists
if: github.event_name == 'push' || steps.check-branch-exists.outputs.exists == 'true' && github.event_name == 'pull_request'
run: |
if [ ${{ github.event_name == 'push' }} ]; then
echo ">> Action is from a push event, will continue with linting"
else
echo ">> Branch ${{ gitea.base_ref }} exists, will continue with linting"
fi
echo "----"
echo "exists=true" >> $GITEA_OUTPUT
- name: Set up Helm
uses: azure/setup-helm@v4
if: steps.branch-exists.outputs.exists == 'true'
with:
token: ${{ secrets.GITEA_TOKEN }}
version: v3
- name: Check Directories for Changes
id: check-dir-changes
if: steps.branch-exists.outputs.exists == 'true'
run: |
CHANGED_CHARTS=()
echo ">> Target branch for diff is: ${BASE_BRANCH}"
if [ "${{ github.event_name }}" == "pull_request" ]; then
echo ""
echo ">> Checking for changes in a pull request ..."
GIT_DIFF=$(git diff --name-only "${BASE_BRANCH}" | xargs -I {} dirname {} | sort -u | grep -E "charts/")
else
echo ""
echo ">> Checking for changes from a push ..."
GIT_DIFF=$(git diff --name-only ${{ gitea.event.before }}..HEAD | xargs -I {} dirname {} | sort -u | grep -E "charts/")
fi
if [ -n "${GIT_DIFF}" ]; then
echo ""
echo ">> Changes detected:"
echo "$GIT_DIFF"
for path in $GIT_DIFF; do
CHANGED_CHARTS+=$(echo "$path" | awk -F '/' '{print $2}')
CHANGED_CHARTS+=$(echo " ")
done
else
echo ""
echo ">> No changes detected"
fi
if [ -n "${CHANGED_CHARTS}" ]; then
echo ""
echo ">> Chart to Lint:"
echo "$(echo "${CHANGED_CHARTS}" | sort -u)"
echo "----"
echo "changes-detected=true" >> $GITEA_OUTPUT
echo "chart-dir<<EOF" >> $GITEA_OUTPUT
echo "$(echo "${CHANGED_CHARTS}" | sort -u)" >> $GITEA_OUTPUT
echo "EOF" >> $GITEA_OUTPUT
else
echo "changes-detected=false" >> $GITEA_OUTPUT
fi
- name: Add Repositories
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }}
run: |
echo ">> Adding repositories for chart dependencies ..."
for dir in ${CHANGED_CHARTS}; do
helm dependency list --max-col-width 120 charts/$dir 2> /dev/null \
| tail +2 | head -n -1 \
| awk '{ print "helm repo add " $1 " " $3 }' \
| while read cmd; do echo "$cmd" | sh; done || true
done
if helm repo list | tail +2 | read -r; then
echo ""
echo ">> Update repository cache ..."
helm repo update
fi
echo "----"
- name: Lint Helm Chart
if: steps.check-dir-changes.outputs.changes-detected == 'true'
env:
CHANGED_CHARTS: ${{ steps.check-dir-changes.outputs.chart-dir }}
run: |
echo ">> Running linting on changed charts ..."
for dir in ${CHANGED_CHARTS}; do
chart_path=charts/$dir
chart_name=$(basename "$chart_path")
if [ -f "$chart_path/Chart.yaml" ]; then
cd $chart_path
echo ""
echo ">> Building helm dependency ..."
helm dependency build --skip-refresh
echo ""
echo ">> Linting helm ..."
helm lint --namespace "$chart_name"
else
echo ""
echo ">> Directory $chart_path does not contain a Chart.yaml. Skipping ..."
echo ""
fi
done
- name: ntfy Failed
uses: niniyas/ntfy-action@master
if: failure()
with:
url: '${{ secrets.NTFY_URL }}'
topic: '${{ secrets.NTFY_TOPIC }}'
title: 'Test Failure - Helm Charts'
priority: 3
headers: '{"Authorization": "Bearer ${{ secrets.NTFY_CRED }}"}'
tags: action,failed
details: 'Tests have failed for Helm Charts'
icon: 'https://cdn.jsdelivr.net/gh/selfhst/icons/png/gitea.png'
actions: '[{"action": "view", "label": "Open Gitea", "url": "https://gitea.alexlebens.dev/alexlebens/helm-charts/actions?workflow=lint-test.yaml", "clear": true}]'
image: true

View File

@@ -1,6 +1,6 @@
apiVersion: v2
name: generic-device-plugin
version: 0.20.4
version: 0.20.7
description: Generic Device Plugin
keywords:
- generic-device-plugin

View File

@@ -1,6 +1,6 @@
# generic-device-plugin
![Version: 0.20.4](https://img.shields.io/badge/Version-0.20.4-informational?style=flat-square) ![AppVersion: 0.20.4](https://img.shields.io/badge/AppVersion-0.20.4-informational?style=flat-square)
![Version: 0.20.6](https://img.shields.io/badge/Version-0.20.6-informational?style=flat-square) ![AppVersion: 0.20.4](https://img.shields.io/badge/AppVersion-0.20.4-informational?style=flat-square)
Generic Device Plugin
@@ -28,7 +28,7 @@ Generic Device Plugin
| config | object | `{"data":"devices:\n - name: serial\n groups:\n - paths:\n - path: /dev/ttyUSB*\n - paths:\n - path: /dev/ttyACM*\n - paths:\n - path: /dev/tty.usb*\n - paths:\n - path: /dev/cu.*\n - paths:\n - path: /dev/cuaU*\n - paths:\n - path: /dev/rfcomm*\n - name: video\n groups:\n - paths:\n - path: /dev/video0\n - name: fuse\n groups:\n - count: 10\n paths:\n - path: /dev/fuse\n - name: audio\n groups:\n - count: 10\n paths:\n - path: /dev/snd\n - name: capture\n groups:\n - paths:\n - path: /dev/snd/controlC0\n - path: /dev/snd/pcmC0D0c\n - paths:\n - path: /dev/snd/controlC1\n mountPath: /dev/snd/controlC0\n - path: /dev/snd/pcmC1D0c\n mountPath: /dev/snd/pcmC0D0c\n - paths:\n - path: /dev/snd/controlC2\n mountPath: /dev/snd/controlC0\n - path: /dev/snd/pcmC2D0c\n mountPath: /dev/snd/pcmC0D0c\n - paths:\n - path: /dev/snd/controlC3\n mountPath: /dev/snd/controlC0\n - path: /dev/snd/pcmC3D0c\n mountPath: /dev/snd/pcmC0D0c\n","enabled":true}` | Config map |
| config.data | string | See [values.yaml](./values.yaml) | generic-device-plugin config file [[ref]](https://github.com/squat/generic-device-plugin#usage) |
| deviceDomain | string | `"devic.es"` | Domain used by devices for identifcation |
| image | object | `{"pullPolicy":"Always","repository":"ghcr.io/squat/generic-device-plugin","tag":"latest@sha256:4896ffd516624d6eb7572e102bc4397e91f8bc3b2fb38b5bfefd758baae3dcf2"}` | Default image |
| image | object | `{"pullPolicy":"Always","repository":"ghcr.io/squat/generic-device-plugin","tag":"latest@sha256:d64b1c851b534de348bcd3189555a22d3966e6592fc79d2a78abfff4f6c1a2e1"}` | Default image |
| name | string | `"generic-device-plugin"` | Name override of release |
| resources | object | `{"requests":{"cpu":"50m","memory":"10Mi"}}` | Default resources |
| service | object | `{"listenPort":8080}` | Service port |

View File

@@ -4,7 +4,7 @@ name: generic-device-plugin
# -- Default image
image:
repository: ghcr.io/squat/generic-device-plugin
tag: latest@sha256:4896ffd516624d6eb7572e102bc4397e91f8bc3b2fb38b5bfefd758baae3dcf2
tag: latest@sha256:aa0571c7f461fb99747ada00f2de69eb856dcbbc0e87965fffe37a15f7bc006f
pullPolicy: Always
# -- Domain used by devices for identifcation

View File

@@ -1,6 +1,6 @@
apiVersion: v2
name: postgres-cluster
version: 6.16.1
version: 7.1.0
description: Cloudnative-pg Cluster
keywords:
- database
@@ -11,4 +11,4 @@ sources:
maintainers:
- name: alexlebens
icon: https://avatars.githubusercontent.com/u/100373852?s=48&v=4
appVersion: v1.27.0
appVersion: v1.28.0

View File

@@ -1,6 +1,6 @@
# postgres-cluster
![Version: 6.16.1](https://img.shields.io/badge/Version-6.16.1-informational?style=flat-square) ![AppVersion: v1.27.0](https://img.shields.io/badge/AppVersion-v1.27.0-informational?style=flat-square)
![Version: 7.1.0](https://img.shields.io/badge/Version-7.1.0-informational?style=flat-square) ![AppVersion: v1.28.0](https://img.shields.io/badge/AppVersion-v1.28.0-informational?style=flat-square)
Cloudnative-pg Cluster
@@ -23,25 +23,25 @@ Cloudnative-pg Cluster
| backup.method | string | `"objectStore"` | Method to create backups, options currently are only objectStore |
| backup.objectStore | list | `[]` | Options for object store backups |
| backup.scheduledBackups | list | `[]` | List of scheduled backups |
| cluster | object | `{"additionalLabels":{},"affinity":{"enablePodAntiAffinity":true,"topologyKey":"kubernetes.io/hostname"},"annotations":{},"certificates":{},"enablePDB":true,"enableSuperuserAccess":false,"image":{"repository":"ghcr.io/cloudnative-pg/postgresql","tag":"17.7-standard-trixie"},"imagePullPolicy":"IfNotPresent","imagePullSecrets":[],"initdb":{},"instances":3,"logLevel":"info","monitoring":{"customQueries":[],"customQueriesSecret":[],"disableDefaultQueries":false,"enabled":false,"podMonitor":{"enabled":true,"metricRelabelings":[],"relabelings":[]},"prometheusRule":{"enabled":false,"excludeRules":["CNPGClusterLastFailedArchiveTimeWarning"]}},"postgresGID":-1,"postgresUID":-1,"postgresql":{"ldap":{},"parameters":{"hot_standby_feedback":"on","max_slot_wal_keep_size":"2000MB","shared_buffers":"128MB"},"pg_hba":[],"pg_ident":[],"shared_preload_libraries":[],"synchronous":{}},"primaryUpdateMethod":"switchover","primaryUpdateStrategy":"unsupervised","priorityClassName":"","resources":{"limits":{"hugepages-2Mi":"256Mi"},"requests":{"cpu":"100m","memory":"256Mi"}},"roles":[],"serviceAccountTemplate":{},"services":{},"storage":{"size":"10Gi","storageClass":""},"superuserSecret":"","walStorage":{"enabled":true,"size":"2Gi","storageClass":""}}` | Cluster settings |
| cluster | object | `{"additionalLabels":{},"affinity":{"enablePodAntiAffinity":true,"topologyKey":"kubernetes.io/hostname"},"annotations":{},"certificates":{},"enablePDB":true,"enableSuperuserAccess":false,"image":{"repository":"ghcr.io/cloudnative-pg/postgresql","tag":"18.1-standard-trixie"},"imagePullPolicy":"IfNotPresent","imagePullSecrets":[],"initdb":{"database":"app","owner":"app"},"instances":3,"logLevel":"info","monitoring":{"customQueries":[],"customQueriesSecret":[],"disableDefaultQueries":false,"enabled":true,"podMonitor":{"enabled":true,"metricRelabelings":[],"relabelings":[]},"prometheusRule":{"enabled":true,"excludeRules":["CNPGClusterLastFailedArchiveTimeWarning"]}},"postgresGID":-1,"postgresUID":-1,"postgresql":{"ldap":{},"parameters":{"hot_standby_feedback":"on","max_slot_wal_keep_size":"2000MB","shared_buffers":"128MB"},"pg_hba":[],"pg_ident":[],"shared_preload_libraries":[],"synchronous":{}},"primaryUpdateMethod":"switchover","primaryUpdateStrategy":"unsupervised","priorityClassName":"","resources":{"limits":{"hugepages-2Mi":"256Mi"},"requests":{"cpu":"100m","memory":"256Mi"}},"roles":[],"serviceAccountTemplate":{},"services":{},"storage":{"size":"10Gi","storageClass":""},"superuserSecret":"","walStorage":{"enabled":true,"size":"2Gi","storageClass":""}}` | Cluster settings |
| cluster.affinity | object | `{"enablePodAntiAffinity":true,"topologyKey":"kubernetes.io/hostname"}` | Affinity/Anti-affinity rules for Pods. See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-AffinityConfiguration |
| cluster.certificates | object | `{}` | The configuration for the CA and related certificates. See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-CertificatesConfiguration |
| cluster.enablePDB | bool | `true` | Allow to disable PDB, mainly useful for upgrade of single-instance clusters or development purposes See: https://cloudnative-pg.io/documentation/current/kubernetes_upgrade/#pod-disruption-budgets |
| cluster.enableSuperuserAccess | bool | `false` | When this option is enabled, the operator will use the SuperuserSecret to update the postgres user password. If the secret is not present, the operator will automatically create one. When this option is disabled, the operator will ignore the SuperuserSecret content, delete it when automatically created, and then blank the password of the postgres user by setting it to NULL. |
| cluster.image | object | `{"repository":"ghcr.io/cloudnative-pg/postgresql","tag":"17.7-standard-trixie"}` | Default image |
| cluster.image | object | `{"repository":"ghcr.io/cloudnative-pg/postgresql","tag":"18.1-standard-trixie"}` | Default image |
| cluster.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy. One of Always, Never or IfNotPresent. If not defined, it defaults to IfNotPresent. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images |
| cluster.imagePullSecrets | list | `[]` | The list of pull secrets to be used to pull the images. See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-LocalObjectReference |
| cluster.initdb | object | `{}` | Bootstrap is the configuration of the bootstrap process when initdb is used. See: https://cloudnative-pg.io/documentation/current/bootstrap/ See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-bootstrapinitdb |
| cluster.initdb | object | `{"database":"app","owner":"app"}` | Bootstrap is the configuration of the bootstrap process when initdb is used. See: https://cloudnative-pg.io/documentation/current/bootstrap/ See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-bootstrapinitdb |
| cluster.logLevel | string | `"info"` | The instances' log level, one of the following values: error, warning, info (default), debug, trace |
| cluster.monitoring | object | `{"customQueries":[],"customQueriesSecret":[],"disableDefaultQueries":false,"enabled":false,"podMonitor":{"enabled":true,"metricRelabelings":[],"relabelings":[]},"prometheusRule":{"enabled":false,"excludeRules":["CNPGClusterLastFailedArchiveTimeWarning"]}}` | Enable default monitoring and alert rules |
| cluster.monitoring | object | `{"customQueries":[],"customQueriesSecret":[],"disableDefaultQueries":false,"enabled":true,"podMonitor":{"enabled":true,"metricRelabelings":[],"relabelings":[]},"prometheusRule":{"enabled":true,"excludeRules":["CNPGClusterLastFailedArchiveTimeWarning"]}}` | Enable default monitoring and alert rules |
| cluster.monitoring.customQueries | list | `[]` | Custom Prometheus metrics Will be stored in the ConfigMap |
| cluster.monitoring.customQueriesSecret | list | `[]` | The list of secrets containing the custom queries |
| cluster.monitoring.disableDefaultQueries | bool | `false` | Whether the default queries should be injected. Set it to true if you don't want to inject default queries into the cluster. |
| cluster.monitoring.enabled | bool | `false` | Whether to enable monitoring |
| cluster.monitoring.enabled | bool | `true` | Whether to enable monitoring |
| cluster.monitoring.podMonitor.enabled | bool | `true` | Whether to enable the PodMonitor |
| cluster.monitoring.podMonitor.metricRelabelings | list | `[]` | The list of metric relabelings for the PodMonitor. Applied to samples before ingestion. |
| cluster.monitoring.podMonitor.relabelings | list | `[]` | The list of relabelings for the PodMonitor. Applied to samples before scraping. |
| cluster.monitoring.prometheusRule.enabled | bool | `false` | Whether to enable the PrometheusRule automated alerts |
| cluster.monitoring.prometheusRule.enabled | bool | `true` | Whether to enable the PrometheusRule automated alerts |
| cluster.monitoring.prometheusRule.excludeRules | list | `["CNPGClusterLastFailedArchiveTimeWarning"]` | Exclude specified rules |
| cluster.postgresUID | int | `-1` | The UID and GID of the postgres user inside the image, defaults to 26 |
| cluster.postgresql | object | `{"ldap":{},"parameters":{"hot_standby_feedback":"on","max_slot_wal_keep_size":"2000MB","shared_buffers":"128MB"},"pg_hba":[],"pg_ident":[],"shared_preload_libraries":[],"synchronous":{}}` | Parameters to be set for the database itself See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-PostgresConfiguration |
@@ -58,11 +58,12 @@ Cloudnative-pg Cluster
| cluster.serviceAccountTemplate | object | `{}` | Configure the metadata of the generated service account |
| cluster.services | object | `{}` | Customization of service definitions. Please refer to https://cloudnative-pg.io/documentation/current/service_management/ |
| cluster.storage | object | `{"size":"10Gi","storageClass":""}` | Default storage size |
| databases | list | `[]` | Database management configuration |
| mode | string | `"standalone"` | Cluster mode of operation. Available modes: * `standalone` - Default mode. Creates new or updates an existing CNPG cluster. * `recovery` - Same as standalone but creates a cluster from a backup, object store or via pg_basebackup |
| nameOverride | string | `""` | Override the name of the cluster |
| namespaceOverride | string | `""` | Override the namespace of the chart |
| poolers | list | `[]` | List of PgBouncer poolers |
| recovery | object | `{"backup":{"backupName":"","database":"app","owner":"","pitrTarget":{"time":""}},"import":{"databases":[],"pgDumpExtraOptions":[],"pgRestoreExtraOptions":[],"postImportApplicationSQL":[],"roles":[],"schemaOnly":false,"source":{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"verify-full","sslRootCertSecret":{"key":"","name":""},"username":"app"},"type":"microservice"},"method":"backup","objectStore":{"clusterName":"","data":{"compression":"snappy","encryption":"","jobs":1},"database":"app","destinationPath":"","endpointCA":{"create":false,"key":"","name":""},"endpointCredentials":"","endpointURL":"https://nyc3.digitaloceanspaces.com","index":1,"name":"recovery","owner":"","pitrTarget":{"time":""},"wal":{"compression":"snappy","encryption":"","maxParallel":1}},"pgBaseBackup":{"database":"app","owner":"","secret":"","source":{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"verify-full","sslRootCertSecret":{"key":"","name":""},"username":""}}}` | Recovery settings when booting cluster from external cluster |
| recovery | object | `{"backup":{"backupName":"","database":"app","owner":"","pitrTarget":{"time":""}},"import":{"databases":[],"pgDumpExtraOptions":[],"pgRestoreExtraOptions":[],"postImportApplicationSQL":[],"roles":[],"schemaOnly":false,"source":{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"verify-full","sslRootCertSecret":{"key":"","name":""},"username":"app"},"type":"microservice"},"method":"backup","objectStore":{"clusterName":"","data":{"compression":"snappy","encryption":"","jobs":1},"database":"app","destinationPath":"","endpointCA":{"create":false,"key":"","name":""},"endpointCredentials":"","endpointURL":"https://nyc3.digitaloceanspaces.com","index":1,"name":"recovery","owner":"","pitrTarget":{"time":""},"wal":{"compression":"snappy","encryption":"","maxParallel":1}},"pgBaseBackup":{"database":"app","owner":"","secret":"","source":{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"disable","sslRootCertSecret":{"key":"","name":""},"username":""}}}` | Recovery settings when booting cluster from external cluster |
| recovery.backup.backupName | string | `""` | Name of the backup to recover from. |
| recovery.backup.database | string | `"app"` | Name of the database used by the application. Default: `app`. |
| recovery.backup.owner | string | `""` | Name of the owner of the database in the instance to be used by applications. Defaults to the value of the `database` key. |
@@ -103,7 +104,7 @@ Cloudnative-pg Cluster
| recovery.pgBaseBackup.database | string | `"app"` | Name of the database used by the application. Default: `app`. |
| recovery.pgBaseBackup.owner | string | `""` | Name of the owner of the database in the instance to be used by applications. Defaults to the value of the `database` key. |
| recovery.pgBaseBackup.secret | string | `""` | Name of the secret containing the initial credentials for the owner of the user database. If empty a new secret will be created from scratch |
| recovery.pgBaseBackup.source | object | `{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"verify-full","sslRootCertSecret":{"key":"","name":""},"username":""}` | Configuration for the source database |
| recovery.pgBaseBackup.source | object | `{"database":"app","host":"","passwordSecret":{"create":false,"key":"password","name":"","value":""},"port":5432,"sslCertSecret":{"key":"","name":""},"sslKeySecret":{"key":"","name":""},"sslMode":"disable","sslRootCertSecret":{"key":"","name":""},"username":""}` | Configuration for the source database |
| recovery.pgBaseBackup.source.passwordSecret.create | bool | `false` | Whether to create a secret for the password |
| recovery.pgBaseBackup.source.passwordSecret.key | string | `"password"` | The key in the secret containing the password |
| recovery.pgBaseBackup.source.passwordSecret.name | string | `""` | Name of the secret containing the password |

View File

@@ -36,8 +36,6 @@ bootstrap:
secret:
{{- toYaml . | nindent 6 }}
{{- end }}
externalClusters:
{{- include "cluster.externalSourceCluster" (list "pgBaseBackupSource" .Values.recovery.pgBaseBackup.source) | nindent 2 }}
{{- else if eq .Values.recovery.method "import" }}
initdb:
@@ -63,7 +61,7 @@ externalClusters:
{{- end }}
{{- if eq .Values.recovery.import.type "monolith" }}
roles:
{{- with .Values.replica.importRoles }}
{{- with .Values.recovery.import.roles }}
{{- . | toYaml | nindent 8 }}
{{- end }}
{{- end }}
@@ -82,8 +80,6 @@ externalClusters:
pgRestoreExtraOptions:
{{- . | toYaml | nindent 8 }}
{{- end }}
externalClusters:
{{- include "cluster.externalSourceCluster" (list "importSource" .Values.recovery.import.source) | nindent 2 }}
{{- else if eq .Values.recovery.method "backup" }}
recovery:
@@ -114,16 +110,6 @@ externalClusters:
{{- end }}
source: {{ include "cluster.recoveryServerName" . }}
externalClusters:
- name: {{ include "cluster.recoveryServerName" . }}
plugin:
name: barman-cloud.cloudnative-pg.io
enabled: true
isWALArchiver: false
parameters:
barmanObjectName: "{{ include "cluster.name" . }}-{{ .Values.recovery.objectStore.name }}"
serverName: {{ include "cluster.recoveryServerName" . }}
{{- else }}
{{ fail "Invalid recovery mode!" }}
{{- end }}

View File

@@ -0,0 +1,24 @@
{{- define "cluster.externalClusters" -}}
externalClusters:
{{- if eq .Values.mode "standalone" }}
{{- else if eq .Values.mode "recovery" }}
{{- if eq .Values.recovery.method "pgBaseBackup" }}
- name: pgBaseBackupSource
{{- include "cluster.externalSourceCluster" .Values.recovery.pgBaseBackup.source | nindent 4 }}
{{- else if eq .Values.recovery.method "import" }}
- name: importSource
{{- include "cluster.externalSourceCluster" .Values.recovery.import.source | nindent 4 }}
{{- else if eq .Values.recovery.method "objectStore" }}
- name: {{ include "cluster.recoveryServerName" . }}
plugin:
name: barman-cloud.cloudnative-pg.io
enabled: true
isWALArchiver: false
barmanObjectStore:
barmanObjectName: "{{ include "cluster.name" . }}-{{ .Values.recovery.objectStore.name }}"
serverName: {{ include "cluster.recoveryServerName" . }}
{{- end }}
{{- else }}
{{ fail "Invalid cluster mode!" }}
{{- end }}
{{ end }}

View File

@@ -19,32 +19,6 @@ spec:
{{- end }}
postgresUID: {{ include "cluster.postgresUID" . }}
postgresGID: {{ include "cluster.postgresGID" . }}
plugins:
{{- range $objectStore := .Values.backup.objectStore }}
- name: barman-cloud.cloudnative-pg.io
enabled: true
{{- if $objectStore.isWALArchiver }}
isWALArchiver: true
{{- else }}
isWALArchiver: false
{{- end }}
parameters:
barmanObjectName: "{{ include "cluster.name" $ }}-{{ $objectStore.name }}-backup"
{{- if $objectStore.clusterName }}
serverName: "{{ $objectStore.clusterName }}-backup-{{ $objectStore.index }}"
{{- else }}
serverName: "{{ include "cluster.name" $ }}-backup-{{ $objectStore.index }}"
{{- end }}
{{- end }}
{{ if (eq .Values.recovery.method "objectStore") }}
externalClusters:
- name: recovery
plugin:
name: barman-cloud.cloudnative-pg.io
parameters:
barmanObjectName: "{{ include "cluster.name" . }}-{{ .Values.recovery.objectStore.name }}"
serverName: {{ include "cluster.recoveryServerName" . }}
{{ end }}
storage:
size: {{ .Values.cluster.storage.size }}
{{- if not (empty .Values.cluster.storage.storageClass) }}
@@ -155,4 +129,23 @@ spec:
{{ end }}
{{- end }}
plugins:
{{- range $objectStore := .Values.backup.objectStore }}
- name: barman-cloud.cloudnative-pg.io
enabled: true
{{- if $objectStore.isWALArchiver }}
isWALArchiver: true
{{- else }}
isWALArchiver: false
{{- end }}
parameters:
barmanObjectName: "{{ include "cluster.name" $ }}-{{ $objectStore.name }}-backup"
{{- if $objectStore.clusterName }}
serverName: "{{ $objectStore.clusterName }}-backup-{{ $objectStore.index }}"
{{- else }}
serverName: "{{ include "cluster.name" $ }}-backup-{{ $objectStore.index }}"
{{- end }}
{{- end }}
{{ include "cluster.bootstrap" . | nindent 2 }}
{{ include "cluster.externalClusters" . | nindent 2 }}

View File

@@ -0,0 +1,76 @@
{{- range .Values.databases }}
---
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: {{ include "cluster.name" $ }}-database-{{ .name | replace "_" "-" }}
namespace: {{ include "cluster.namespace" $ }}
labels:
{{- include "cluster.labels" $ | nindent 4 }}
spec:
name: {{ .name }}
cluster:
name: {{ include "cluster.name" $ }}
ensure: {{ .ensure | default "present" }}
owner: {{ .owner }}
template: {{ .template | default "template1" }}
encoding: {{ .encoding | default "UTF8" }}
databaseReclaimPolicy: {{ .databaseReclaimPolicy | default "retain" }}
{{- with .isTemplate }}
isTemplate: {{ . }}
{{- end }}
{{- with .allowConnections }}
allowConnections: {{ . }}
{{- end }}
{{- with .connectionLimit }}
connectionLimit: {{ . }}
{{- end }}
{{- with .tablespace }}
tablespace: {{ . }}
{{- end }}
{{- with .locale }}
locale: {{ . }}
{{- end }}
{{- with .localeProvider }}
localeProvider: {{ . }}
{{- end }}
{{- with .localeCollate }}
localeCollate: {{ . }}
{{- end }}
{{- with .localeCType }}
localeCType: {{ . }}
{{- end }}
{{- with .icuLocale }}
icuLocale: {{ . }}
{{- end }}
{{- with .icuRules }}
icuRules: {{ . }}
{{- end }}
{{- with .builtinLocale }}
builtinLocale: {{ . }}
{{- end }}
{{- with .collationVersion }}
collationVersion: {{ . | quote }}
{{- end }}
{{- with .schemas }}
schemas:
{{- range . }}
- name: {{ .name }}
owner: {{ .owner }}
ensure: {{ .ensure | default "present" }}
{{- end }}
{{- end }}
{{- with .extensions }}
extensions:
{{- range . }}
- name: {{ .name }}
{{- with .version }}
version: {{ . }}
{{- end }}
{{- with .schema }}
schema: {{ . }}
{{- end }}
ensure: {{ .ensure | default "present" }}
{{- end }}
{{- end }}
{{- end }}

View File

@@ -20,7 +20,7 @@ cluster:
# -- Default image
image:
repository: ghcr.io/cloudnative-pg/postgresql
tag: 17.7-standard-trixie
tag: 18.1-standard-trixie
# -- Image pull policy. One of Always, Never or IfNotPresent. If not defined, it defaults to IfNotPresent. Cannot be updated.
# More info: https://kubernetes.io/docs/concepts/containers/images#updating-images
@@ -109,7 +109,7 @@ cluster:
monitoring:
# -- Whether to enable monitoring
enabled: false
enabled: true
podMonitor:
@@ -127,7 +127,7 @@ cluster:
prometheusRule:
# -- Whether to enable the PrometheusRule automated alerts
enabled: false
enabled: true
# -- Exclude specified rules
excludeRules:
@@ -197,9 +197,9 @@ cluster:
# -- Bootstrap is the configuration of the bootstrap process when initdb is used.
# See: https://cloudnative-pg.io/documentation/current/bootstrap/
# See: https://cloudnative-pg.io/documentation/current/cloudnative-pg.v1/#postgresql-cnpg-io-v1-bootstrapinitdb
initdb: {}
# database: app
# owner: "" # Defaults to the database name
initdb:
database: app
owner: app
# secret:
# name: "" # Name of the secret containing the initial credentials for the owner of the user database. If empty a new secret will be created from scratch
# options: []
@@ -330,7 +330,7 @@ recovery:
port: 5432
username: ""
database: "app"
sslMode: "verify-full"
sslMode: "disable"
passwordSecret:
# -- Whether to create a secret for the password
@@ -507,6 +507,35 @@ backup:
# # -- Name of backup target
# backupName: external
# -- Database management configuration
databases: []
# - name: app # -- Name of the database to be created.
# ensure: present # -- Ensure the PostgreSQL database is present or absent - defaults to "present".
# owner: app # -- Owner of the database, defaults to the value of the `name` key.
# template: template1 # -- Maps to the TEMPLATE parameter.
# encoding: UTF8 # -- Maps to the ENCODING parameter.
# connectionLimit: -1 # -- Maps to the CONNECTION LIMIT parameter. -1 (the default) means no limit.
# tablespace: "" # -- Maps to the TABLESPACE parameter and ALTER DATABASE.
# databaseReclaimPolicy: retain # -- One of: retain / delete (retain by default).
# schemas: [] # -- List of schemas to be created in the database.
# # - name: myschema
# # owner: app # -- Owner of the schema, defaults to the database owner.
# # ensure: present # -- Ensure the PostgreSQL schema is present or absent - defaults to "present".
# extensions: [] # -- List of extensions to be created in the database.
# # - name: pg_search
# # ensure: present # -- Ensure the PostgreSQL extension is present or absent - defaults to "present".
# # version: "0.15.21" # -- Version of the extension to be installed, if not specified the latest version will be used.
# # schema: "" # -- Schema where the extension will be installed, if not specified the extensions or current default object creation schema will be used.
# isTemplate: false # -- Maps to the IS_TEMPLATE parameter. If true, the database is considered a template for new databases.
# locale: "" # -- Maps to the LC_COLLATE and LC_CTYPE parameters
# localeProvider: "" # -- Maps to the LOCALE_PROVIDER parameter. Available from PostgreSQL 16.
# localeCollate: "" # -- Maps to the LC_COLLATE parameter
# localeCType: "" # -- Maps to the LC_CTYPE parameter
# icuLocale: "" # -- Maps to the ICU_LOCALE parameter. Available from PostgreSQL 15.
# icuRules: "" # -- Maps to the ICU_RULES parameter. Available from PostgreSQL 16.
# builtinLocale: "" # -- Maps to the BUILTIN_LOCALE parameter. Available from PostgreSQL 17.
# collationVersion: "" # -- Maps to the COLLATION_VERSION parameter.
# -- List of PgBouncer poolers
poolers: []
# -