ibo/infra/RUNBOOK-ibo.md
timu 650d7f3394 ibo: containerize + Gitea-CI + dev/prod-Deploy + Zitadel-SSO + noVNC-Live-View
- Dockerfile/compose: Flask-App + selenium/standalone-chrome (noVNC), Healthcheck
- app.py: /healthz + eingebettete noVNC-Live-Ansicht (NOVNC_URL, lokal:7900 / Cluster:/novnc/)
- Helm-Chart infra/k8s/base/ibo: App + Selenium-Sidecar, 2 Ports, Ingress
  (/ + /novnc via stripPrefix), SSO-Middlewares aus dem CD-Repo
- Gitea-CI: version -> test -> build-push -> helm-validate -> deploy-dev (Write-back)
- .gitignore/.dockerignore (Dev-Samples raus)
- infra/RUNBOOK-ibo.md: Zitadel/DNS/Deploy/Prod-Promote

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 01:03:32 +02:00

6.0 KiB

Runbook — ibo (Immo-Bot) containerisieren, deployen, Zitadel-SSO davorschalten

Immo-Bot = Flask-Web-App + Selenium-Chrome-Sidecar (noVNC-Live-Ansicht). Zwei feste Umgebungen (KEINE PR-Previews):

Umgebung Host TLS-Secret Deploy
dev dev.ibo.momentrum.de ibo-dev-tls automatisch bei jedem main-Push (CI)
prod ibo.momentrum.de ibo-tls manuell promotet (Tag-Copy, s. u.)

Beide hinter demselben Zitadel-oauth2-proxy ibo-sso (cookie-domain .ibo.momentrum.de deckt dev und prod ab).

Die Muster spiegeln kanban (CI/Chart/CD) und luxly-sso/dev-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 init && git add -A && git commit -m "ibo: containerize + CI + infra"
git remote add origin momentrum-gitea:momentrum/ibo.git   # SSH-Alias wie andere Repos
git push -u origin main    # push-create legt momentrum/ibo an, falls aktiviert

Gitea-Actions-Secrets am Repo momentrum/ibo setzen (Settings → Actions → Secrets):

  • REGISTRY_USER, REGISTRY_TOKEN — Push in die Gitea-Registry.
  • DEPLOY_TOKEN — Gitea-Token mit Write auf momentrum/momentrum-deploy (Write-back des dev-Image-Tags).

1. Zitadel: Redirect-URI ergaenzen (KEIN neuer Client)

ibo-sso nutzt — wie luxly-sso — den bestehenden geteilten Zitadel-Client (K8s-Secret oauth2-proxy-dev in ns iam). Es ist kein neuer Client und kein neues Secret noetig. Nur am vorhandenen Client im Zitadel-Console (https://auth.momentrum.de) die Redirect-URI ergaenzen:

  • Redirect-URI hinzufuegen: https://sso.ibo.momentrum.de/oauth2/callback

(EIN Login-Host sso.ibo.momentrum.de deckt per cookie-domain .ibo.momentrum.de dev und prod ab. Wer prod spaeter mit eigenem Blast-Radius trennen will: eigenen Client + eigenes SealedSecret anlegen und im ibo-sso-Deployment referenzieren — die oauth2-proxy-dev-Secret-Refs dort ersetzen.)


2. oauth2-proxy ibo-sso (contabo-infra) — deployen

Manifeste liegen in contabo-infra/platform/manifests/ibo-sso/ (Deployment/Service, Middlewares oauth2-ibo-auth/oauth2-ibo-errors, Ingress sso.ibo.momentrum.de, oauth2-Passthrough-Route). Sie referenzieren das bestehende Secret oauth2-proxy-dev + die ConfigMap oauth2-proxy-dev-templates — nichts einzusealen.

Die ArgoCD-App platform/apps/ibo-sso.yaml wird vom platform-App-of-Apps automatisch aufgenommen (gleiche Ablage wie luxly-sso.yaml) — committen & pushen genuegt; alternativ einmalig kubectl apply -f platform/manifests/ibo-sso/. Ausserdem ist das ibo-Repo in platform/manifests/argocd-projects/internal.yaml (sourceRepos) bereits ergaenzt — sonst lehnt ArgoCD die App-Source ab.

Ergebnis:

  • Middlewares iam-oauth2-ibo-auth@kubernetescrd / iam-oauth2-ibo-errors@kubernetescrd stehen bereit (die App-Ingresses referenzieren sie).
  • https://sso.ibo.momentrum.de liefert die Login-Seite (kein Auth davor).

3. DNS

A/AAAA-Records auf die Cluster-Ingress-IP zeigen lassen:

  • ibo.momentrum.de
  • dev.ibo.momentrum.de
  • sso.ibo.momentrum.de

cert-manager (letsencrypt-prod, HTTP-01) stellt die Zertifikate ibo-tls, ibo-dev-tls, ibo-sso-tls automatisch aus, sobald DNS steht.


4. Deploy-Reihenfolge

  1. Repo gepusht (Schritt 0) → CI baut das erste Image und bumpt apps/internal/ibo/dev.yaml (image.tag).
  2. ibo-sso laeuft (Schritt 2), DNS steht (Schritt 3).
  3. CD-Apps im momentrum-deploy committen: apps/internal/ibo/dev.yaml + apps/internal/ibo/app.yaml. ArgoCD legt Namespace apps-ibo an und synct.
  4. Erstes Prod-Promote: den von der CI in dev.yaml gesetzten image.tag nach app.yaml kopieren (siehe unten) — sonst hat prod noch tag: latest.

5. Prod promoten (Routine)

Prod bekommt bewusst NUR den Tag, den man freigibt:

cd momentrum-deploy
DEVTAG=$(grep -E '^          tag: ' apps/internal/ibo/dev.yaml | awk '{print $2}')
sed -i "s|^          tag: .*|          tag: ${DEVTAG}|" apps/internal/ibo/app.yaml
git commit -am "ibo: promote ${DEVTAG} -> prod" && git push

ArgoCD synct prod auf den neuen Tag. Rollback = git revert dieses Commits.


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", oeffnet auch automatisch beim Consent-Browser). 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).
  • Steuerbar durch die SSO-Cookie (gleicher Host, gleiche Middlewares).

Der Browser laeuft serverseitig im Container — es wird NICHT der lokale Browser des Nutzers ferngesteuert (das ginge von einer gehosteten App aus nicht).


7. Break-glass (Notzugang)

Faellt Zitadel aus: die SSO-Middlewares temporaer aus ingress.ssoMiddlewares im jeweiligen CD-App-YAML 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 -d lokal → http://localhost:5000 UI, „Browser live ansehen" zeigt den Chrome im iframe (localhost:7900).
  • curl -s localhost:5000/healthz → {"ok":true}.
  • main-Push → CI gruen (version→test→build-push→helm-validate→deploy-dev), dev.yaml-Tag gebumpt, ArgoCD rollt dev.
  • https://dev.ibo.momentrum.de → Redirect zu auth.momentrum.de, nach Login landet man in der App.
  • In der App eingebettetes /novnc/ zeigt den Live-Browser.
  • https://ibo.momentrum.de nach Promote ebenso hinter Zitadel.
  • Ohne SSO-Session → Login-Redirect (kein rohes 401).