Konzept

Mandantenmodell.

Jeder Knowmind-Account ist ein Tenant. Tenant-Isolation ist nicht eine Empfehlung an die Programmierenden, sondern ein technisch erzwungener Zustand auf drei Ebenen.

PostgreSQL — Row-Level-Security

Jede geschäftsrelevante Tabelle trägt eine tenant_id NOT NULL-Spalte. Die Service-Rolle knowmind_app hat NOBYPASSRLS — auch wir können RLS nicht aushebeln. Jede Query läuft in einer Transaktion mit SET LOCAL app.current_tenant_id = <uuid>, die Policy prüft tenant_id = current_setting('app.current_tenant_id'). Vergisst eine neue Route den Filter, sieht sie keine Daten — kein Leak-Risiko.

Neo4j — tenantId auf jedem Knoten

Cypher-Queries werden über einen schmalen Wrapper geschickt, der den tenantId-Filter pflicht-injiziert. Composite-Indizes auf (tenantId, name) sorgen dafür, dass die Filterung performant bleibt.

Speicher — Bucket pro Tenant

Datei-Uploads landen in tenant-getrennten S3-Buckets (MinIO). Vektor-Index in pgvector hat tenant_id als Filter-Spalte. Audit-Logs in Langfuse sind mit tenant=… getaggt.

Was Tenants nicht teilen

  • • Memories, Edges, Dokumente
  • • Vektor-Embeddings
  • • Provider-Keys (BYOK)
  • • API-Tokens und Sessions
  • • Audit-Trail
  • • Settings und Onboarding-Vorlagen

Was Tenants teilen

Die Modellierungs-Wahl unterstützt Cross-Tenant-Funktionen, ohne dass Daten leaken können: Marketplaces für Memory-Packs (Templates, keine Daten) und Eval-Goldsets, die als Code committed sind.