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:
OpenWebUiVfinav-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.de→cloudflared-Sidecar →localhost:8080 - Neuer DNS-Record:
vf-chat.agenticventures.deCNAME auf Tunnel-Hostname, proxied=true
Vorbedingungen (zuerst pruefen, bei Fehler stoppen)
aws sts get-caller-identity --profile av-production→ Account425924867359echo $CF_API_TOKEN,echo $CF_ACCOUNT_ID,echo $CF_ZONE_ID— alle drei gesetzt (mit Permissions Account:Cloudflare-Tunnel:Edit + Zone:DNS:Edit)- 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
- mcp-vf-hosted Live-Health pruefen:
curl https://mcp-vf.agenticventures.de/health→ HTTP 200 - 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 - 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 - 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)
- Repo anlegen:
~/source/apps/open-webui-vf/mitinfra/(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-webuidirekt
- CDK-Stack
OpenWebUiVfanalog~/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: mongo —
mongo: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
- 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, fallbackhttp_status:404 - Tunnel-Token in AWS Secrets Manager schreiben:
openwebui-vf/cloudflared-token
- Initial Deploy:
cd infra && npx cdk deploy --profile av-production --require-approval never- Stack-Status auf CREATE_COMPLETE warten
- Beide Container HEALTHY
- DNS-Cutover: CF-API setzt CNAME
vf-chat.agenticventures.de→<tunnel-id>.cfargotunnel.com, proxied=true
Phase 2 — Bedrock-Anbindung (0.5 Tag)
- Env-Vars im open-webui-Container (im CDK-Stack):
AWS_REGION=eu-central-1WEBUI_AUTH=trueENABLE_SIGNUP=false(Initial-Admin manuell anlegen)WEBUI_NAME=VF ChatWEBUI_URL=https://vf-chat.agenticventures.deENABLE_FORWARD_USER_INFO_HEADERS=true— kritisch fuer Per-User-MCP-AuditDATABASE_URL=mongodb://root:<secret>@localhost:27017/openwebui?authSource=adminSTORAGE_PROVIDER=s3S3_BUCKET_NAME=openwebui-vf-uploads-425924867359-eucentral1S3_REGION_NAME=eu-central-1- NICHT
AWS_ACCESS_KEY_ID— TaskRole macht das per IAM
- Initial-Admin anlegen — beim ersten
WEBUI_AUTH=true-Start mitENABLE_SIGNUP=falsebraucht es einen Initial-Admin. Eine Option: kurzzeitigENABLE_SIGNUP=true→ ersten User registrieren → der wird automatisch Super-Admin →ENABLE_SIGNUP=falsezurueck + Force-Deploy. Alternative: Admin via API-Call anlegen mit dem Bootstrap-Token. Marvin als ersten User mitmarvin@agenticventures.de. - 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:ConverseARN-spezifisch granten
Phase 3 — MCP-Anbindung (0.5 Tag)
- 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/mcpautomatisch) - Name: „VF Mono-MCP (Papierkram + TicketPAY + M365)”
- OAuth-Flow durchspielen: Open WebUI redirected zu Scalekit-Login, du loggst dich mit deinem Scalekit-Owner-Account ein, Authorize → Token persistent gespeichert
- 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.) - 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 - 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)
- Andre + Christoph einladen: Admin Panel → Users → Add User
- Email + Display-Name + Role (User, nicht Admin)
- MFA verpflichtend
- Initial-Passwort schickst du den beiden ueber sicheren Kanal (Signal o.ae.), die loggen sich ein und setzen MFA
- Smoke jeder User: jeder loggt sich ein, macht einen Tool-Call, verifiziert dass Audit-Headers ihren Account zeigen (nicht nur subject_hash)
- 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)
- 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)
- 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
- 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
- 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:
- 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.)
- Projekt-Verlauf updaten _index mit Sprint-1-Done + Sprint-2-Outlook
- VF-Kunden-File updaten vibe-factory mit zweitem Service-Eintrag (Open WebUI Chat)
- Capability-Eintrag anlegen
intern/capabilities/apps/open-webui-vf.mdanalog mcp-vf-hosted-Eintrag — Status, Endpoint, Auth, Cost, Operations-Cheatsheet - CloudWatch-Dashboard-URL in den VF-Kunden-File aufnehmen damit du es schnell findest
docs/architecture.mdim 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) — nackteanthropic.*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=trueist 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.md —
mcp-replicate-hostedals 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