Umstellung auf das kanban-Modell (PR-Preview-dev + prod), Zitadel-SSO vor beiden. - CI: Job deploy-dev -> deploy; Write-back bei main-Merge jetzt nach app.yaml (prod) statt dev.yaml. dev braucht keinen Write-back (ApplicationSet liest den PR-Tag direkt). - Chart: ingress.novncStripPrefixRef (Preview referenziert die geteilte externe strip-novnc-Middleware statt eine eigene anzulegen -> vom previews-AppProject erlaubt); priorityClassName (Preview-Pods sterben bei Memory-Pressure zuerst). - RUNBOOK-ibo.md: auf PR-Preview-dev + prod-Auto-Deploy umgeschrieben. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.5 KiB
Runbook — ibo (Immo-Bot): CI/CD, PR-Preview-dev + prod, Zitadel-SSO
Immo-Bot = Flask-Web-App + Selenium-Chrome-Sidecar (noVNC-Live-Ansicht). Umgebungs-Modell wie momentrum-kanban: ephemere PR-Previews als „dev" + eine stehende prod. Beide hinter Zitadel-SSO (die App selbst hat KEINE eigene Auth).
| Umgebung | Host | SSO-Proxy | Deploy |
|---|---|---|---|
| dev | ibo-pr-<nr>.dev.momentrum.de |
generisches dev-sso |
ephemer pro PR mit Label preview (ApplicationSet) |
| prod | ibo.momentrum.de |
per-App ibo-sso |
automatisch bei jedem main-Merge (CI → CD-Repo) |
Die Muster spiegeln kanban/luxly (CI/Chart/CD/ApplicationSet) und dev-sso/ibo-sso (oauth2-proxy). Cluster-, Zitadel- und DNS-Schritte sind manuell — dieses Runbook ist die Anleitung. Reihenfolge unten einhalten.
0. Repo nach Gitea bringen
cd projekte/ibo
git add -A && git commit -m "ibo: PR-Preview-dev + prod, Zitadel-SSO"
git remote add origin momentrum-gitea:momentrum/ibo.git # SSH-Alias wie andere Repos
git push -u origin main
Gitea-Actions-Secrets am Repo momentrum/ibo (Settings → Actions → Secrets):
REGISTRY_USER,REGISTRY_TOKEN— Push in die Gitea-Registry.DEPLOY_TOKEN— Gitea-Token mit Write aufmomentrum/momentrum-deploy(Write-back des prod-Image-Tags bei main-Merge).
1. Zitadel: Redirect-URIs (KEIN neuer Client)
ibo-sso und dev-sso nutzen — wie luxly-sso — den bestehenden geteilten
Zitadel-Client (K8s-Secret oauth2-proxy-dev in ns iam). Kein neuer Client,
kein neues Secret. Nur am vorhandenen Client (https://auth.momentrum.de) die
Redirect-URI ergaenzen:
- prod:
https://sso.ibo.momentrum.de/oauth2/callback← nur diese ist ibo-spezifisch - dev (Previews):
https://sso.dev.momentrum.de/oauth2/callback← existiert i. d. R. schon (kanban/luxly-Previews nutzen dasselbe dev-sso). Nichts zu tun, falls vorhanden.
2. Cluster-Voraussetzungen (contabo-infra) — muessen laufen
Fuer prod (platform/manifests/ibo-sso/, ArgoCD-App platform/apps/ibo-sso.yaml):
- oauth2-proxy
ibo-sso(Deployment/Service, nsiam). - Middlewares
iam-oauth2-ibo-auth@kubernetescrd/iam-oauth2-ibo-errors@kubernetescrd. - Ingress
sso.ibo.momentrum.de(Login-Host, ohne Auth davor). - Geteilte stripPrefix-Middleware
iam-strip-novnc@kubernetescrd(strip-novnc.yaml) — die Previews referenzieren sie cross-namespace (s. §4).
Fuer dev/Previews (bereits vorhanden, von kanban/luxly geteilt):
dev-sso(generischer oauth2-proxy*.dev.momentrum.de, Middlewaresiam-oauth2-auth/iam-oauth2-errors, Loginsso.dev.momentrum.de).- SealedSecret
gitea-appset-token(nsargocd) — Gitea-Read fuer den PR-Generator. - AppProject
previews— erlaubt Sourcemomentrum/*(deckt ibo ab) und begrenzt Previews aufpreview-*-Namespaces. Blockt bewusst traefik.io/Middleware im Preview-ns → deshalb die geteiltestrip-novncin §2.
App-of-Apps nimmt ibo-sso.yaml automatisch auf — committen & pushen genuegt;
alternativ einmalig kubectl apply -f platform/manifests/ibo-sso/. Das ibo-Repo
ist in platform/manifests/argocd-projects/internal.yaml (sourceRepos) bereits
erlaubt (sonst lehnt ArgoCD die prod-App-Source ab).
3. DNS
A/AAAA-Records auf die Cluster-Ingress-IP:
ibo.momentrum.de(prod)sso.ibo.momentrum.de(prod-Login)
Previews brauchen keinen eigenen Record — sie laufen unter dem bestehenden
Wildcard *.dev.momentrum.de (wie kanban/luxly). cert-manager
(letsencrypt-prod, HTTP-01) stellt ibo-tls, ibo-sso-tls und die per-Preview-
Certs (ibo-pr-<nr>-tls) automatisch aus, sobald DNS/Ingress stehen.
4. CD-Apps im momentrum-deploy (bereits angelegt)
apps/internal/ibo/app.yaml— prod-Application (ibo.momentrum.de, nsapps-internal, SSOiam-oauth2-ibo-*). Auto-Sync;image.tagbumpt die CI.apps/internal/ibo/preview.yaml— PR-Preview-ApplicationSet (Gitea-PR-Generator, Label-Gatepreview). Rendert ibos Chart aus dem PR-Branch und setzt pro PR: Hostibo-pr-<nr>.dev.momentrum.de,priorityClassName: preview, gedeckelte Resources (preview-ns-Quota: ≤2 CPU / 1536Mi Limits gesamt),ssoMiddlewares: iam-oauth2-errors,iam-oauth2-auth(dev-sso) undnovncStripPrefixRef: iam-strip-novnc@kubernetescrd(statt eigener Middleware).
committen & pushen → ArgoCD legt die prod-App + das ApplicationSet an.
5. Deploy-Flows
dev / Preview (pro PR):
- PR gegen
mainoeffnen → CI bautpr-<nr>-<sha7>(Job build-push). - Am PR das Gitea-Label
previewsetzen (Opt-in-Gate = Concurrency-Deckel). - ArgoCD-ApplicationSet (Polling 120 s) legt
ibo-pr-<nr>+ nspreview-ibo-pr-<nr>an →https://ibo-pr-<nr>.dev.momentrum.de. - PR schliessen/mergen oder Label entfernen → Application + Namespace kaskadieren weg (finalizer + gemanagter Namespace, KEIN CreateNamespace).
prod (bei main-Merge):
- CI-Job
deployschreibt den neuenimage.taginapps/internal/ibo/app.yamlzurueck → ArgoCD synct prod automatisch. Kein manueller Schritt. - Rollback:
git revertdes CI-Commits immomentrum-deploy(ArgoCD synct zurueck). Alternativimage.taginapp.yamlauf einen aelteren Tag setzen.
Wer prod bewusst manuell freigeben will statt Auto-Deploy: den
deploy-Job in.gitea/workflows/momentrum-ci.ymlentfernen und den Tag per Hand nachapp.yamlcommitten. Aktuell ist Auto-Deploy aktiv (wie kanban).
6. Browser-Live-Ansicht (noVNC)
Der Automations-Chrome laeuft im selenium-Sidecar; sein Bild wird per noVNC
gestreamt und in der Web-App eingebettet (Button „👁️ Browser live ansehen").
Routing:
- App-Container → Chrome via
SELENIUM_REMOTE_URL=http://localhost:4444. - Client-Browser →
https://<host>/novnc/…→ Ingress-Pfad/novnc→ stripPrefix-Middleware → Sidecar-Port 7900 (noVNC/websockify).- prod: chart-eigene Middleware
<ns>-ibo-novnc(App-ns). - Preview: geteilte
iam-strip-novnc(weil daspreviews-Project eigene Middlewares im Preview-ns blockt).
- prod: chart-eigene Middleware
- Zugriff durch die SSO-Cookie (gleicher Host, gleiche Middleware-Kette).
Der Browser laeuft serverseitig im Container — es wird NICHT der lokale Browser des Nutzers ferngesteuert.
7. Break-glass (Notzugang)
Faellt Zitadel aus: die SSO-Middlewares temporaer aus ingress.ssoMiddlewares
in apps/internal/ibo/app.yaml (prod) entfernen (die App selbst hat keine eigene
Auth → sie ist dann OFFEN). Nur kurz, danach sofort zuruecksetzen. Nie
ungeschuetzt lassen.
8. Verifikationscheckliste
docker compose up -dlokal →http://localhost:5000UI, „Browser live ansehen" zeigt den Chrome im iframe (localhost:7900).curl -s localhost:5000/healthz→{"ok":true}.- PR + Label
preview→ CI gruen (version→test→build-push→helm-validate), ArgoCD legtibo-pr-<nr>an,https://ibo-pr-<nr>.dev.momentrum.deredirected zuauth.momentrum.de, nach Login landet man in der App. - Im Preview eingebettetes
/novnc/zeigt den Live-Browser. - PR schliessen → Preview + Namespace verschwinden (ArgoCD prune).
- main-Merge → CI-Job
deploybumptapp.yaml, ArgoCD rollt prod,https://ibo.momentrum.dehinter Zitadel erreichbar. - Ohne SSO-Session → Login-Redirect (kein rohes 401).