From cd093e3c4bb098672b10a7a5558eb4656ae0bcc2 Mon Sep 17 00:00:00 2001 From: Daniel Cosme Date: Thu, 30 Apr 2026 13:18:59 -0400 Subject: [PATCH] Add CloudNativePG Helm Flux Repository --- apps/hydra/linkding/kuztomization.yaml | 2 +- cmd/apps/main.go | 8 ++- .../hydra/cloud-native-pg/helm-release.yaml | 20 ++++++ .../helm-repository-source.yaml | 9 +++ .../hydra/cloud-native-pg/namespace.yaml | 6 ++ .../hydra/truenas-csi/kuztomization.yaml | 16 ++--- pkg/postgres/postgres.go | 71 +++++++++++++++++++ pkg/root/root.go | 15 ++-- pkg/root/services.go | 5 +- 9 files changed, 132 insertions(+), 20 deletions(-) create mode 100644 infrastructure/hydra/cloud-native-pg/helm-release.yaml create mode 100644 infrastructure/hydra/cloud-native-pg/helm-repository-source.yaml create mode 100644 infrastructure/hydra/cloud-native-pg/namespace.yaml create mode 100644 pkg/postgres/postgres.go diff --git a/apps/hydra/linkding/kuztomization.yaml b/apps/hydra/linkding/kuztomization.yaml index c922b44..96e2f9e 100644 --- a/apps/hydra/linkding/kuztomization.yaml +++ b/apps/hydra/linkding/kuztomization.yaml @@ -4,7 +4,7 @@ metadata: name: linking namespace: linkding resources: -- namespace.yaml - srv.yaml - pvc.yaml - deployment.yaml +- namespace.yaml diff --git a/cmd/apps/main.go b/cmd/apps/main.go index e50248e..2f35ed4 100644 --- a/cmd/apps/main.go +++ b/cmd/apps/main.go @@ -9,6 +9,7 @@ import ( "danicos.dev/daniel/homelab/pkg/linkding" "danicos.dev/daniel/homelab/pkg/longhorn" "danicos.dev/daniel/homelab/pkg/monitoring" + "danicos.dev/daniel/homelab/pkg/postgres" "danicos.dev/daniel/homelab/pkg/root" "danicos.dev/daniel/homelab/pkg/truenas" /* @@ -23,9 +24,10 @@ func main() { assertNoErr(err) hydra_infrastructure := map[string]stack.Stack{ - "monitoring": monitoring.Stack(), - "longhorn": longhorn.Stack(), - "truenas-csi": truenas.Stack(), + "monitoring": monitoring.Stack(), + "longhorn": longhorn.Stack(), + "truenas-csi": truenas.Stack(), + "cloud-native-pg": postgres.Stack(), } for name, s := range hydra_infrastructure { fmt.Printf("STACK: %s\n", name) diff --git a/infrastructure/hydra/cloud-native-pg/helm-release.yaml b/infrastructure/hydra/cloud-native-pg/helm-release.yaml new file mode 100644 index 0000000..5d818b3 --- /dev/null +++ b/infrastructure/hydra/cloud-native-pg/helm-release.yaml @@ -0,0 +1,20 @@ +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: cnpg + namespace: cnpg-system +spec: + chart: + spec: + chart: cnpg/cloudnative-pg + interval: 12h0m0s + sourceRef: + kind: HelmRepository + name: cnpg + namespace: cnpg-system + install: + crds: Create + interval: 30m0s + upgrade: + crds: CreateReplace +status: {} diff --git a/infrastructure/hydra/cloud-native-pg/helm-repository-source.yaml b/infrastructure/hydra/cloud-native-pg/helm-repository-source.yaml new file mode 100644 index 0000000..a5288aa --- /dev/null +++ b/infrastructure/hydra/cloud-native-pg/helm-repository-source.yaml @@ -0,0 +1,9 @@ +apiVersion: source.toolkit.fluxcd.io/v1 +kind: HelmRepository +metadata: + name: cnpg + namespace: cnpg-system +spec: + interval: 24h0m0s + url: https://cloudnative-pg.github.io/charts +status: {} diff --git a/infrastructure/hydra/cloud-native-pg/namespace.yaml b/infrastructure/hydra/cloud-native-pg/namespace.yaml new file mode 100644 index 0000000..b84c321 --- /dev/null +++ b/infrastructure/hydra/cloud-native-pg/namespace.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: cnpg-system +spec: {} +status: {} diff --git a/infrastructure/hydra/truenas-csi/kuztomization.yaml b/infrastructure/hydra/truenas-csi/kuztomization.yaml index eb68d30..e95d186 100644 --- a/infrastructure/hydra/truenas-csi/kuztomization.yaml +++ b/infrastructure/hydra/truenas-csi/kuztomization.yaml @@ -4,16 +4,16 @@ metadata: name: truenas-csi namespace: truenas-csi resources: -- CSIDriver.yaml +- node-service-account.yaml +- node-cluster-role.yaml +- node-binding.yaml - nfs-storage-class.yaml +- iscsi-storage-class.yaml - namespace.yaml +- controller-deployment.yaml - controller-service-account.yaml - controller-cluster-role.yaml -- node-cluster-role.yaml -- node-deamonset.yaml -- config.yaml -- iscsi-storage-class.yaml -- controller-deployment.yaml - controller-binding.yaml -- node-service-account.yaml -- node-binding.yaml +- node-deamonset.yaml +- CSIDriver.yaml +- config.yaml diff --git a/pkg/postgres/postgres.go b/pkg/postgres/postgres.go new file mode 100644 index 0000000..dc7e8b5 --- /dev/null +++ b/pkg/postgres/postgres.go @@ -0,0 +1,71 @@ +package postgres + +import ( + "time" + + "danicos.dev/daniel/go-kube/pkg/flux" + "danicos.dev/daniel/go-kube/pkg/kube" + "danicos.dev/daniel/go-kube/pkg/stack" + "danicos.dev/daniel/homelab/pkg/root" + helm "github.com/fluxcd/helm-controller/api/v2" + source "github.com/fluxcd/source-controller/api/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var meta kube.Metadata +var Namespace = kube.Namespace(root.CloudNativePG + "-system") + +func init() { + meta = kube.NewMetadata(root.CloudNativePG, Namespace) +} + +func Stack() stack.Stack { + s := stack.NewStack("cloud-native-pg", map[string]any{ + "namespace": Namespace, + "helm-repository-source": HelmSource(), + "helm-release": HelmRelease(), + }) + return s +} + +func HelmSource() source.HelmRepository { + spec := source.HelmRepositorySpec{ + Interval: durHour(root.FLUX_HELM_MONITORING_INTERVAL), + URL: root.HELM_CLOUD_NATIVE_PG_URL, + } + return flux.NewFluxHelmRepositorySource(meta, spec) +} + +func HelmRelease() helm.HelmRelease { + interval := durHour(12) + spec := helm.HelmReleaseSpec{ + Interval: durMin(30), + Chart: &helm.HelmChartTemplate{ + Spec: helm.HelmChartTemplateSpec{ + Chart: root.HELM_CLOUD_NATIVE_PG_CHART, + // Version: root.HELM_CLOUD_NATIVE_PG_CHART_VERSION, + Interval: &interval, + SourceRef: helm.CrossNamespaceObjectReference{ + Kind: flux.MetaHelmRepository.Kind, + Name: meta.Meta().Name, + Namespace: Namespace.Name, + }, + }, + }, + Install: &helm.Install{ + CRDs: helm.Create, + }, + Upgrade: &helm.Upgrade{ + CRDs: helm.CreateReplace, + }, + } + return flux.NewFluxHelmRelease(meta, spec) +} + +func durHour(d int64) metav1.Duration { + return metav1.Duration{Duration: (time.Duration(d) * time.Hour)} +} + +func durMin(d int64) metav1.Duration { + return metav1.Duration{Duration: (time.Duration(d) * time.Minute)} +} diff --git a/pkg/root/root.go b/pkg/root/root.go index 53321a8..edd5dc6 100644 --- a/pkg/root/root.go +++ b/pkg/root/root.go @@ -25,12 +25,15 @@ const ( ) const ( - HELM_PROMETHEUS_URL = "https://prometheus-community.github.io/helm-charts" - HELM_PROMETHEUS_CHART = "kube-prometheus-stack" - HELM_PROMETHEUS_CHART_VERSION = "66.x" - HELM_LONGHORN_URL = "https://charts.longhorn.io" - HELM_LONGHORN_CHART = "longhorn" - HELM_LONGHORN_CHART_VERSION = "1.11.1" + HELM_PROMETHEUS_URL = "https://prometheus-community.github.io/helm-charts" + HELM_PROMETHEUS_CHART = "kube-prometheus-stack" + HELM_PROMETHEUS_CHART_VERSION = "66.x" + HELM_LONGHORN_URL = "https://charts.longhorn.io" + HELM_LONGHORN_CHART = "longhorn" + HELM_LONGHORN_CHART_VERSION = "1.11.1" + HELM_CLOUD_NATIVE_PG_URL = "https://cloudnative-pg.github.io/charts" + HELM_CLOUD_NATIVE_PG_CHART = "cnpg/cloudnative-pg" + HELM_CLOUD_NATIVE_PG_CHART_VERSION = "" ) var ( diff --git a/pkg/root/services.go b/pkg/root/services.go index 1fe3ef4..26022de 100644 --- a/pkg/root/services.go +++ b/pkg/root/services.go @@ -17,8 +17,9 @@ var Linkding = Service{ } var ( - Longhorn = "longhorn" - Monitoring = "monitoring" + Longhorn = "longhorn" + Monitoring = "monitoring" + CloudNativePG = "cnpg" ) var (