From 0098a264fd1c93194c7d06b6dbca307253430939 Mon Sep 17 00:00:00 2001 From: Administrator Date: Thu, 13 Aug 2026 18:04:54 +0000 Subject: [PATCH] docs: create betrieb/configmap-sync --- betrieb/configmap-sync.md | 304 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 betrieb/configmap-sync.md diff --git a/betrieb/configmap-sync.md b/betrieb/configmap-sync.md new file mode 100644 index 0000000..c96bf1f --- /dev/null +++ b/betrieb/configmap-sync.md @@ -0,0 +1,304 @@ +--- +title: GitOps ConfigMap Auto-Sync +description: Checksum-basierter ConfigMap-Sync mit Flux +published: true +date: 2026-08-13T18:04:48.944Z +tags: +editor: markdown +dateCreated: 2026-08-13T18:04:48.944Z +--- + +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+