diff --git a/apps/openproject-app.yaml b/apps/openproject-app.yaml new file mode 100644 index 0000000..d3d0162 --- /dev/null +++ b/apps/openproject-app.yaml @@ -0,0 +1,36 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: openproject # <--- Name der App in ArgoCD UI + namespace: argocd + annotations: + argocd.argoproj.io/sync-wave: "5" +spec: + project: default + source: + repoURL: https://git.cloud-infra.prod.openmailserver.de/stabify/gitops.git + targetRevision: HEAD + path: apps/openproject # <--- WICHTIG: Hier muss dein Wrapper-Chart liegen + destination: + server: https://kubernetes.default.svc + namespace: openproject # <--- WICHTIG: Der Namespace, in den installiert wird + syncPolicy: + automated: + prune: true + selfHeal: true + syncOptions: + - CreateNamespace=true # Erstellt den Namespace 'openproject' automatisch + ignoreDifferences: + # Das hast du gut drin! Behalte es bei. + # Da OpenProject PVCs (Speicher) nutzt, verhindert das, dass ArgoCD + # ständig "Out of Sync" schreit, wenn K3s/Longhorn kleine Metadaten am Speicher ändert. + - group: "" + kind: PersistentVolumeClaim + jqPathExpressions: + - .metadata.annotations."pv.kubernetes.io/bind-completed" + - .metadata.annotations."pv.kubernetes.io/bound-by-controller" + - .metadata.annotations."volume.beta.kubernetes.io/storage-provisioner" + - .metadata.annotations."volume.kubernetes.io/storage-provisioner" + - .metadata.uid + - .metadata.resourceVersion + - .status \ No newline at end of file diff --git a/apps/openproject/Chart.yaml b/apps/openproject/Chart.yaml new file mode 100644 index 0000000..8d3c10f --- /dev/null +++ b/apps/openproject/Chart.yaml @@ -0,0 +1,16 @@ +apiVersion: v2 +name: openproject-wrapper +description: Wrapper Chart für OpenProject mit Custom Secrets und Ingress +type: application + +version: 1.0.0 + +# Das ist rein informativ: Welche OpenProject Version wird installiert? +appVersion: "17.0.1" + +dependencies: + - name: openproject + # WICHTIG: Hier muss die Version des HELM CHARTS hin, nicht zwingend die App-Version. + # Prüfe unten, wie du die aktuelle Nummer findest. + version: "13.0.1" + repository: "https://charts.openproject.org" \ No newline at end of file diff --git a/apps/openproject/templates/external-secret.yaml b/apps/openproject/templates/external-secret.yaml new file mode 100644 index 0000000..0691c4d --- /dev/null +++ b/apps/openproject/templates/external-secret.yaml @@ -0,0 +1,23 @@ +apiVersion: external-secrets.io/v1beta1 +kind: ExternalSecret +metadata: + name: openproject-db-credentials + namespace: openproject +spec: + refreshInterval: 1m + secretStoreRef: + name: vault-backend + kind: ClusterSecretStore + target: + name: openproject-db-credentials + creationPolicy: Owner + data: + - secretKey: postgres-password + remoteRef: + key: secret/apps/openproject + property: postgres-password + + - secretKey: password + remoteRef: + key: secret/apps/openproject + property: password \ No newline at end of file diff --git a/apps/openproject/values.yaml b/apps/openproject/values.yaml new file mode 100644 index 0000000..ca452cb --- /dev/null +++ b/apps/openproject/values.yaml @@ -0,0 +1,52 @@ +# 1. Allgemeine Einstellungen +openproject: + host: "pm.apps.internal.k3s.stabify.de" + +# 2. Ingress Konfiguration (Für Traefik) +openproject: + # Deine Wunsch-Domain für OpenProject + host: "openproject.apps.internal.k3s.stabify.de" + +ingress: + enabled: true + ingressClassName: "traefik" + + # Hier kommen genau die Annotations aus deinem Authentik-Beispiel rein: + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + + # Konfiguration für das Zertifikat (wie in deinem Authentik-File) + tls: + - secretName: openproject-tls # Name des Secrets, wo das Zertifikat gespeichert wird + hosts: + - openproject.apps.k3s.stabify.de + +# 3. Datenbank (PostgreSQL) +# Standardmäßig installiert das Chart eine PostgreSQL Instanz. +# Für Produktion auf K3s ist das okay, solange der Storage stimmt. +postgresql: + enabled: true + auth: + existingSecret: "openproject-db-credentials" + secretKeys: + adminPasswordKey: "postgres-password" + userPasswordKey: "password" +primary: + persistence: + enabled: true + size: 10Gi + storageClass: "longhorn" + +# 3. Datei-Speicher (Anhänge) auf Longhorn +persistence: + enabled: true + size: 10Gi + accessMode: ReadWriteOnce + # WICHTIG: Auch hier Longhorn für die Assets + storageClass: "longhorn" + +# 5. Memcached (für Caching, verbessert Performance) +memcached: + enabled: true \ No newline at end of file