# πŸ”„ GitOps ConfigMap Auto-Sync via Checksums Dieses Dokument erklΓ€rt ein Kernproblem mit **Flux CD** und **externe Konfigurationen** – und wie wir es gelΓΆst haben. --- ## πŸ“‹ Das Problem: Flux erkennt ConfigMap-Γ„nderungen nicht ### Die Situation Unsere HelmRelease (`element-server-suite.yaml`) nutzt `valuesFrom`, um Konfigurationen aus externen **ConfigMaps** zu laden: ```yaml spec: valuesFrom: - kind: ConfigMap name: ess-element-custom # ← Diese ConfigMap valuesKey: values.yaml - kind: ConfigMap name: ess-synapse-custom # ← Diese ConfigMap valuesKey: values.yaml ``` Diese ConfigMaps entstehen aus Dateien im Git-Repo (`apps/production/custom-configs/*.yaml`) und werden von Kustomize in den Cluster deployed. ### Das Kernproblem **Flux CD reagiert NICHT automatisch, wenn sich eine ConfigMap Γ€ndert.** Warum? Flux ΓΌberwacht nur das Git-Repository auf Γ„nderungen. Wenn du `element-values.yaml` Γ€nderst: 1. βœ… Flux sieht die Γ„nderung im Git-Repo 2. βœ… Kustomize erzeugt eine neue ConfigMap mit den neuen Werten 3. ❌ Aber Helm (der Helm-Controller in Flux) erkennt **nicht**, dass sich die externe ConfigMap geΓ€ndert hat 4. ❌ Helm deployt das Chart nicht neu β†’ Die alten Themes/Configs bleiben aktiv Das ist kein Bug, sondern by-design: Helm achtet nur auf: - Chart-Version (z.B. `26.4.0`) - Γ„nderungen in den direkten `values:` BlΓΆcken - Nicht auf externe Quellen wie ConfigMaps --- ## πŸ”‘ Die LΓΆsung: Checksums als Trigger Wir nutzen **Annotations mit Checksums** als Workaround: ```yaml apiVersion: helm.toolkit.fluxcd.io/v2 kind: HelmRelease metadata: annotations: element-config-checksum: "401f8a87d0ef5d91d2e5032d4aede42c" # ← Hash der element-values.yaml synapse-config-checksum: "e98fe81141f52e7ea833596ca39853b9" # ← Hash der synapse-values.yaml ``` Wenn sich der Annotation-Wert Γ€ndert, sieht Flux, dass die **HelmRelease selbst** sich geΓ€ndert hat – und deployt neu. ### Automatisierung via Git Pre-Commit Hook Das Problem: Wer aktualisiert die Checksums, wenn man `element-values.yaml` editiert? **LΓΆsung:** Ein Git **pre-commit Hook** tut das automatisch: ```bash $ vi apps/production/custom-configs/element-values.yaml # (Farbe Γ€ndern, Theme hinzufΓΌgen, …) $ git add apps/production/custom-configs/element-values.yaml $ git commit -m "feat: new theme" # ← Der Hook lΓ€uft jetzt: # 1. Berechnet MD5-Hash der neuen element-values.yaml # 2. Aktualisiert die Annotation in kustomization.yaml # 3. Added kustomization.yaml zum Commit automatisch ``` Der User muss **nichts ZusΓ€tzliches tun** – alles lΓ€uft automatisch. --- ## πŸš€ Installation Nach dem Repository **klonen**, fΓΌhre dieses Skript aus: ```bash cd prod/gitops ./scripts/install-hooks.sh ``` Das Skript: - βœ… Erstellt einen Symlink `.git/hooks/pre-commit` β†’ `scripts/hooks/pre-commit` - βœ… Macht die Hook-Datei ausfΓΌhrbar - βœ… Gibt dir eine BestΓ€tigungsmeldung **Einmalig pro lokales Repository.** Neue Klone mΓΌssen den Hook auch installieren. --- ## πŸ“ Workflow: ConfigMaps Γ€ndern So sieht die Praxis aus: ### 1️⃣ Γ„nderung machen ```bash vi apps/production/custom-configs/element-values.yaml # Edit: Themes, Farben, Logging-Level, etc. ``` ### 2️⃣ Committen (Hook lΓ€uft automatisch) ```bash git add apps/production/custom-configs/element-values.yaml git commit -m "feat: add Dark Purple theme variant" # Pre-Commit Hook lΓ€uft automatisch: # β†’ Berechnet neuen Hash # β†’ Updated kustomization.yaml # β†’ Added kustomization.yaml zum Commit ``` ### 3️⃣ ÜberprΓΌfung (optional) ```bash # Schaue, was committet wird: git show --stat # Output sollte zeigen: # element-values.yaml (modified) # kustomization.yaml (modified) ← vom Hook hinzugefΓΌgt ``` ### 4️⃣ Pushen & Deployen ```bash git push # ← Flux sieht die Γ„nderung an kustomization.yaml # ← HelmRelease wird neu-synced mit den neuen Checksums # ← Die neue Config ist in ~5 Minuten aktiv ``` --- ## πŸ”§ Technische Details ### Welche Dateien sind "ΓΌberwacht"? Der Hook beobachtet: | Datei | Annotation | Ziel | |-------|-----------|------| | `apps/production/custom-configs/element-values.yaml` | `element-config-checksum` | Element Web Themes, Branding | | `apps/production/custom-configs/synapse-values.yaml` | `synapse-config-checksum` | Synapse Logging, Federation | ### Hook-Implementation Der Hook (`scripts/hooks/pre-commit`) macht folgendes: 1. PrΓΌft, ob eine der ΓΌberwachten Dateien geΓ€ndert wurde (`git diff --cached`) 2. Berechnet den MD5-Hash der Datei (kompatibel mit macOS/Linux) 3. Ersetzt den Hash-Wert in `apps/production/kustomization.yaml` via `sed` 4. Added `kustomization.yaml` automatisch zum Commit mit `git add` ```bash # Beispiel: element-values.yaml Γ€ndert sich von value: "401f8a87d0ef5d91d2e5032d4aede42c" # element-config # zu value: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" # element-config ``` --- ## ⚠️ HΓ€ufige Fragen ### F: Was passiert, wenn der Hook fehlschlΓ€gt? A: Der Commit wird **abgebrochen**. Du siehst eine Fehlermeldung. Typische GrΓΌnde: - `md5` oder `md5sum` nicht installiert (sehr unwahrscheinlich) - `sed` Syntax-Fehler (sehr selten) Lass dich nicht entmutigen – rufe denen auf, die das Setup machen πŸš€ ### F: Kann ich den Hook deaktivieren? A: Ja, aber bitte nicht! Wenn du temporΓ€r ohne Hook arbeiten mΓΆchtest: ```bash git commit --no-verify ``` Das umgeht den Hook einmalig. Danach musst du die Checksums manuell aktualisieren. ### F: Der Hook touched `kustomization.yaml`, obwohl ich sie nicht editiert habe? A: Das ist **Absicht**. Der Hook updated **nur** die Checksums, nicht den Rest der Datei. Das ist sauber und Git-freundlich. ### F: Was wenn ich mehrere ConfigMaps gleichzeitig Γ€ndere? A: Der Hook aktualisiert **alle** deren Checksums in einem Pass. Keine Probleme. --- ## πŸ§ͺ Verifikation: Hook funktioniert? Teste es selbst: ```bash # 1. Hook installieren ./scripts/install-hooks.sh # 2. Eine TestΓ€nderung machen echo "# Test" >> apps/production/custom-configs/element-values.yaml # 3. Committen git add apps/production/custom-configs/element-values.yaml git commit -m "test: verify hook" # 4. ÜberprΓΌfung: Wurde kustomization.yaml auto-updated? git diff HEAD~1 apps/production/kustomization.yaml | grep -i checksum # Output sollte zeigen, dass ein Checksum sich geΓ€ndert hat ``` Wenn ja β†’ Hook funktioniert! βœ… Wenn nein β†’ Rufe uns an πŸ“ž --- ## πŸ“š Zusammenhang mit Flux CD ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ Git Repository (axion1337.chat-gitops) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ apps/production/custom-configs/ β”‚ β”‚ β”œβ”€β”€ element-values.yaml (du Γ€nderst das) β”‚ β”‚ β”œβ”€β”€ synapse-values.yaml β”‚ β”‚ └── mas-secret.yaml β”‚ β”‚ β”‚ β”‚ apps/production/ β”‚ β”‚ └── kustomization.yaml (Hook updated die Checksums hier) β”‚ β”‚ β”‚ β”‚ apps/production/ β”‚ β”‚ └── element-server-suite.yaml (HelmRelease mit Annotations)β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ git push β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ FluxCD im Kubernetes-Cluster β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ 1. GitRepository Source β”‚ β”‚ └─ Fetcht dein Repo alle 10 Minuten β”‚ β”‚ β”‚ β”‚ 2. Kustomization production-apps β”‚ β”‚ └─ Applyt die Kustomize-Overlays β”‚ β”‚ └─ Erzeugt ConfigMaps mit neuen Werten β”‚ β”‚ β”‚ β”‚ 3. HelmRelease matrix-stack β”‚ β”‚ └─ Sieht neue Annotations (Checksums) β”‚ β”‚ └─ Deployt Helm-Chart mit neuen Werten β”‚ β”‚ β”‚ β”‚ 4. Element Web Pods β”‚ β”‚ └─ Restarten automatisch β”‚ β”‚ └─ Laden neue Config aus der ConfigMap β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## 🚨 Notfall: Manuelle Checksum-Aktualisierung Falls der Hook ausfΓ€llt (z.B. weil Git Hooks in CI deaktiviert sind), kannst du Checksums manuell aktualisieren: ```bash # 1. Neuen Hash berechnen md5sum apps/production/custom-configs/element-values.yaml # Output: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6 apps/production/custom-configs/element-values.yaml # 2. Annotation in kustomization.yaml updaten vi apps/production/kustomization.yaml # Γ„ndere: value: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6" # element-config # 3. Committen git add apps/production/kustomization.yaml git commit -m "fix: manual checksum update" git push ``` --- **Version:** 1.0 **Letztes Update:** 2026-05-14 **KompatibilitΓ€t:** FluxCD 2.x, Kustomize 5.x+