Ziel: Open WebUI fuer Vibe Factory in AWS Fargate (av-production) aufsetzen, mit Bedrock EU + mcp-vf-hosted-Anbindung

Kontext (lies dies zuerst, ueberspring nichts)

  • Projekt-Index: _index — alle Decisions, Cost-Modell, Phasen-Plan
  • Pattern-File: open-webui-fargate-bedrock — gepinnte Versionen, Stolperer, Bedrock-Config, Forward-User-Info-Headers, Image-Gen-Limitation
  • Hosting-Pattern: mcp-hosting-fargate-tunnel — Fargate + cloudflared-Sidecar (haben wir bei mcp-vf-hosted bewiesen)
  • Bedrock-EU-Limitation: bedrock-eu-image-gen-limitation — warum Image-Gen ueber MCP statt Bedrock
  • AWS-Account: av-production (425924867359), eu-central-1
  • Vorhandener MCP-Endpoint: https://mcp-vf.agenticventures.de/mcp (Scalekit-OAuth, streamable-http) — live + healthy
  • Production-Risiko: mittel — Andre (und bald Christoph) nutzen den MCP-Connector heute. Open WebUI laeuft parallel, blockiert nicht den bestehenden Pfad.

Was bleibt unveraendert

  • mcp-vf-hosted-Stack — bleibt komplett wie er ist. Open WebUI verbindet sich extern via Tunnel-Endpoint
  • Scalekit-Resource fuer mcp-vf-hosted — bleibt unveraendert, kein Refactor
  • claude.ai Pro Connector — Andre kann den parallel weiternutzen, Open WebUI ersetzt den nicht zwingend, ergaenzt ihn
  • Bestehende Sub-MCPs (Papierkram + TicketPAY + M365) — keine Aenderungen am Code, alles laeuft weiter

Was neu gebaut wird

  • Neues Repo: ~/source/mcps/open-webui-vf-hosted/ — oder besser ~/source/apps/open-webui-vf/ (kein MCP, ist eine App)
  • Neuer AWS CDK-Stack: OpenWebUiVf in av-production / eu-central-1, mit:
    • FargateTaskDefinition: 3 Container (open-webui + mongo + cloudflared)
    • EFS-FileSystem fuer Mongo-Volume
    • S3-Bucket fuer File-Uploads (KMS-encrypted)
    • IAM-Role mit Bedrock-Invoke-Permissions (eu.anthropic.claude-* CRIS-Profile)
    • Secrets Manager: Open WebUI Admin-Bootstrap-Password, Mongo-Root-Password, Cloudflared-Tunnel-Token, ggf. Microsoft Entra Client-Secret (Phase 4 falls Entra)
    • CloudWatch Dashboard analog mcp-vf-hosted
    • Egress-only Security Group
  • Neuer Cloudflare-Tunnel: dedizierte Tunnel-Resource fuer vf-chat.agenticventures.decloudflared-Sidecar → localhost:8080
  • Neuer DNS-Record: vf-chat.agenticventures.de CNAME auf Tunnel-Hostname, proxied=true

Vorbedingungen (zuerst pruefen, bei Fehler stoppen)

  1. aws sts get-caller-identity --profile av-production → Account 425924867359
  2. echo $CF_API_TOKEN, echo $CF_ACCOUNT_ID, echo $CF_ZONE_ID — alle drei gesetzt (mit Permissions Account:Cloudflare-Tunnel:Edit + Zone:DNS:Edit)
  3. Open Decisions geklaert (_index „Offene Decisions”-Tabelle):
    • User-Count Initial (Default 3)
    • Auth-Provider (Default Email-Reg fuer Pilot)
    • Mongo-Hosting (Default self-hosted + EFS)
    • Domain (Default vf-chat.agenticventures.de)
    • File-Uploads-Storage (Default S3 EU)
    • Pricing-Modell (siehe Projekt-File) — wenn Marvin nicht entschieden hat: stoppen + fragen
  4. mcp-vf-hosted Live-Health pruefen: curl https://mcp-vf.agenticventures.de/health → HTTP 200
  5. Bedrock Live-Check: aws bedrock-runtime converse --profile av-production --region eu-central-1 --model-id "eu.anthropic.claude-sonnet-4-6" --messages '[{"role":"user","content":[{"text":"ping"}]}]' --query 'output.message.content[0].text' --output text → eine Antwort
  6. Naechste Open WebUI-Image-Version pruefen (eventuell ist neuer Tag erschienen): gh api repos/open-webui/open-webui/releases/latest -q '.tag_name'. Falls > v0.8.12, im Pattern-File open-webui-fargate-bedrock Pin-Liste updaten + Release-Notes ueberfliegen ob es Breaking-Changes gibt
  7. Cloudflared Image-Digest pinnen: docker pull cloudflare/cloudflared:latest && docker image inspect --format='{{index .RepoDigests 0}}' cloudflare/cloudflared:latest

Bei einer Failed-Bedingung: stoppen, Diagnose ausgeben, nicht raten.

Phase 1 — Repo + Stack-Skelett (2-3 Tage)

  1. Repo anlegen: ~/source/apps/open-webui-vf/ mit
    • infra/ (CDK TypeScript)
    • README.md (Architektur, Deploy-Snippet, Operations-Cheatsheet)
    • docs/architecture.md (Mermaid-Diagramme analog mcp-vf-hosted)
    • .gitignore, .env.example, .dockerignore
    • Kein Dockerfile — wir nutzen das offizielle Image ghcr.io/open-webui/open-webui direkt
  2. CDK-Stack OpenWebUiVf analog ~/source/mcps/mcp-vf-hosted/infra/lib/mcp-vf-hosted-stack.ts:
    • FargateTaskDefinition 1.5 vCPU / 3 GB Graviton (ARM)
    • Container 1: open-webui — Image per Digest (ghcr.io/open-webui/open-webui@sha256:...), Port 8080, Env-Vars (siehe Phase 2), EFS-Mount /data (open-webui persistiert dort)
    • Container 2: mongomongo:7.0, Port 27017 nur intern, EFS-Mount /data/db, gestartet mit --auth, Root-Password aus Secrets Manager
    • Container 3: cloudflared — Sidecar, Digest-pinned, Health-Check via cloudflared tunnel ready (siehe mcp-vf-hosted-Stack), Tunnel-Token aus Secrets Manager
    • IAM ExecRole: ECR-Pull + CloudWatch-Logs + Secrets-Read
    • IAM TaskRole: Bedrock-Invoke auf eu.anthropic.claude-*-ARNs + S3-RW auf den File-Uploads-Bucket + EFS-Mount
    • EFS-FileSystem mit Mount-Targets in default-VPC-Subnets, encrypted, Lifecycle-Policy auf IA nach 30 Tagen
    • S3-Bucket openwebui-vf-uploads-425924867359-eucentral1, KMS-encrypted, Block-Public, Lifecycle-Policy
    • Security Group: egress-only (analog mcp-vf-hosted)
    • Service: desiredCount 1, assignPublicIp: true, CircuitBreaker on
    • CloudWatch Dashboard mit Widgets: Service-Health, Container-CPU/Mem, App-Logs, Mongo-Logs, Cloudflared-Logs, Errors-Last-Hour
  3. Cloudflare-Tunnel anlegen via CF-API (ich kann das fuer dich machen wenn die ENV-Vars stehen):
    • Neue Tunnel-Resource „open-webui-vf-hosted”
    • Ingress-Config: vf-chat.agenticventures.de → http://localhost:8080, fallback http_status:404
    • Tunnel-Token in AWS Secrets Manager schreiben: openwebui-vf/cloudflared-token
  4. Initial Deploy: cd infra && npx cdk deploy --profile av-production --require-approval never
    • Stack-Status auf CREATE_COMPLETE warten
    • Beide Container HEALTHY
  5. DNS-Cutover: CF-API setzt CNAME vf-chat.agenticventures.de<tunnel-id>.cfargotunnel.com, proxied=true

Phase 2 — Bedrock-Anbindung (0.5 Tag)

  1. Env-Vars im open-webui-Container (im CDK-Stack):
    • AWS_REGION=eu-central-1
    • WEBUI_AUTH=true
    • ENABLE_SIGNUP=false (Initial-Admin manuell anlegen)
    • WEBUI_NAME=VF Chat
    • WEBUI_URL=https://vf-chat.agenticventures.de
    • ENABLE_FORWARD_USER_INFO_HEADERS=true — kritisch fuer Per-User-MCP-Audit
    • DATABASE_URL=mongodb://root:<secret>@localhost:27017/openwebui?authSource=admin
    • STORAGE_PROVIDER=s3
    • S3_BUCKET_NAME=openwebui-vf-uploads-425924867359-eucentral1
    • S3_REGION_NAME=eu-central-1
    • NICHT AWS_ACCESS_KEY_ID — TaskRole macht das per IAM
  2. Initial-Admin anlegen — beim ersten WEBUI_AUTH=true-Start mit ENABLE_SIGNUP=false braucht es einen Initial-Admin. Eine Option: kurzzeitig ENABLE_SIGNUP=true → ersten User registrieren → der wird automatisch Super-Admin → ENABLE_SIGNUP=false zurueck + Force-Deploy. Alternative: Admin via API-Call anlegen mit dem Bootstrap-Token. Marvin als ersten User mit marvin@agenticventures.de.
  3. Bedrock im Admin-UI:
    • Login als Admin → Admin Panel → Settings → Connections → Add Connection
    • Type: AWS Bedrock
    • Region: eu-central-1
    • Modelle hinzufuegen: eu.anthropic.claude-sonnet-4-6, eu.anthropic.claude-opus-4-7, eu.anthropic.claude-haiku-4-5
    • Test: ein Chat starten, Modell-Switch auf Sonnet 4.6, „sag hi” → Antwort
    • Wichtig: falls Connection-Test fail-t: TaskRole-IAM-Permissions pruefen, dann bedrock:InvokeModel + bedrock:Converse ARN-spezifisch granten

Phase 3 — MCP-Anbindung (0.5 Tag)

  1. Im Admin-UI: Settings → Tools → Add MCP Server
    • Type: MCP (Streamable HTTP)
    • Server URL: https://mcp-vf.agenticventures.de/mcp
    • Auth: OAuth 2.1 (Open WebUI macht Discovery via /.well-known/oauth-protected-resource/mcp automatisch)
    • Name: „VF Mono-MCP (Papierkram + TicketPAY + M365)”
  2. OAuth-Flow durchspielen: Open WebUI redirected zu Scalekit-Login, du loggst dich mit deinem Scalekit-Owner-Account ein, Authorize → Token persistent gespeichert
  3. Tool-Sichtbarkeit verifizieren: im Chat einen Modell auswaehlen mit Tools, im Sidebar muessten alle Sub-MCP-Tools sichtbar sein (papierkram_list_invoices, ticketpay_list_events, m365_search_messages, etc.)
  4. Smoke-Tool-Call: im Chat „liste meine letzten 5 Papierkram-Rechnungen” — Open WebUI ruft papierkram_list_invoices, vf-mono ruft die Subprozess-Sub-MCP, Papierkram-API antwortet, Antwort kommt im Chat an
  5. Audit-Trail-Check: in CloudWatch Logs des mcp-vf-hosted-Containers nachsehen: pro Tool-Call sollte jetzt nicht nur subject_hash, sondern auch die Forward-Headers (X-OpenWebUI-User-Email, etc.) sichtbar sein

Phase 4 — User-Onboarding (1 Tag bei 3 Usern)

  1. Andre + Christoph einladen: Admin Panel → Users → Add User
    • Email + Display-Name + Role (User, nicht Admin)
    • MFA verpflichtend
  2. Initial-Passwort schickst du den beiden ueber sicheren Kanal (Signal o.ae.), die loggen sich ein und setzen MFA
  3. Smoke jeder User: jeder loggt sich ein, macht einen Tool-Call, verifiziert dass Audit-Headers ihren Account zeigen (nicht nur subject_hash)
  4. Knowledge-Bases setup (optional): pro User oder fuer alle gemeinsam ein paar VF-spezifische Dokumente hochladen damit RAG sinnvoll wird (Knowledge → Add Knowledge → PDFs hochladen)
  5. Skills setup (optional): die existierenden Workflow-Prompts von mcp-vf-hosted (/offene_posten, /event_bilanz, /monatsabschluss) sind ueber MCP-Prompts automatisch verfuegbar — als Skills neu zu schreiben ist nicht noetig

Phase 5 — DSGVO + AVV-Update (0.5 Tag)

  1. Subprozessoren-Liste erweitern im VF-AVV — neue Eintraege:
    • Open WebUI (Software MIT-Lizenz, kein Vendor): nicht als Subprozessor — die Software laeuft im av-production-AWS-Account
    • MongoDB self-hosted in unserem Fargate-Task: kein externer Vendor
    • AWS Bedrock ist bereits via AWS Global DPA abgedeckt (eu-central-1)
    • Wenn Sprint 2 (Replicate) realisiert: Replicate Inc. als Subprozessor mit eigenem DPA
  2. AVV-Addendum entwerfen: kurze Zusatz-Klausel die das neue Tool (Open WebUI-Chat-Layer) abdeckt und Bedrock-Token-Pass-Through als „Pass-Through-Kosten” markiert
  3. DSGVO-Briefing fuer Christoph aktualisieren: dsgvo-mcp-vf-hosted.md bekommt einen zweiten Abschnitt zu Open WebUI mit Datenflusswegen + Conversation-Persistierung-Stelle (Mongo in eu-central-1 EFS)

Phase 6 — Doku + Wiki-Updates (0.5 Tag)

Wenn alle Phasen gruen sind:

  1. Pattern-File ergaenzen open-webui-fargate-bedrock mit allen Quirks die wir live entdeckt haben (Initial-Admin-Setup, IAM-Permissions die nicht im Default-CDK-Template stehen, etc.)
  2. Projekt-Verlauf updaten _index mit Sprint-1-Done + Sprint-2-Outlook
  3. VF-Kunden-File updaten vibe-factory mit zweitem Service-Eintrag (Open WebUI Chat)
  4. Capability-Eintrag anlegen intern/capabilities/apps/open-webui-vf.md analog mcp-vf-hosted-Eintrag — Status, Endpoint, Auth, Cost, Operations-Cheatsheet
  5. CloudWatch-Dashboard-URL in den VF-Kunden-File aufnehmen damit du es schnell findest
  6. docs/architecture.md im Open-WebUI-VF-Repo mit Mermaid-Diagramm fuellen

Rollback (falls Phasen 1 oder 4 brechen)

  • Phase 1 bricht: Stack-Delete, ausstehende Resources (EFS, Secrets) bleiben dank Retain-Policy, bei naechstem Deploy importiert. Production-Risiko = 0 weil parallel zu mcp-vf-hosted.
  • Phase 2/3 bricht: Open WebUI laeuft, Bedrock/MCP nicht erreichbar — User koennen sich nicht produktiv nutzen. Aber Andre’s claude.ai-Pro-Connector ist unbeeinflusst. Reparieren ohne Druck.
  • Phase 4 bricht: User-Login geht nicht — neuer Initial-Admin via API setup oder Schritt 2 wiederholen.

Wichtige Constraints

  • Bedrock-Region MUSS eu-central-1 sein. Niemals us-* fuer DSGVO-Versprechen
  • Bedrock-Modell-IDs IMMER mit eu. Prefix (eu.anthropic.claude-sonnet-4-6) — nackte anthropic.* brechen die Inference
  • mcp-vf-hosted-Stack NICHT veraendern. Open WebUI bindet sich nur als Consumer ein, der MCP-Stack ist unabhaengig
  • Andre’s claude.ai-Pro-Connector NICHT loeschen. Bleibt als Fallback + Vergleichs-Pfad
  • ENABLE_FORWARD_USER_INFO_HEADERS=true ist Pflicht. Sonst kein Per-User-Audit im MCP
  • EFS-Mount auf default-VPC-Subnets in derselben AZ wie das Fargate-Task — sonst Latenz-Pain

Was nach erfolgreichem Sprint 1 ansteht (NICHT in dieser Session)

  • Sprint 2: sprint-2-replicate-hosted.mdmcp-replicate-hosted als zweiter hosted MCP fuer Image-Gen
  • m365-delegated-OAuth-Refactor wenn 5+ User produktiv arbeiten und Per-User-SharePoint-Audit kritisch wird
  • Microsoft Entra OpenID Auth-Provider wenn das VF-Team auf 5+ User waechst
  • WAF Pro wenn DDoS-Risk steigt (kostenpflichtig, ~25 €/Mo)
  • DocumentDB-Migration wenn Mongo > 1 GB Memory oder > 10 User produktiv (Self-hosted in Fargate skaliert nicht beliebig)

Vor Start dieser Session

  • Vorbedingungen-Liste durchgegangen, alle gruen
  • Open Decisions in _index geklaert (vor allem Pricing-Modell)
  • Marvin verfuegbar fuer Browser-Klicks (Cloudflare-Dashboard, Open WebUI Admin-UI Erstkonfiguration, User-Onboarding)
  • ~6 Tage Zeitfenster oder zumindest Phase 1-3 (Stack + Bedrock + MCP) in einem Stretch von 2-3 Tagen