Nahaufnahme blauer Netzwerkkabel in einem Patchpanel eines Server-Racks

SaaS-Entwicklung · mandantenfähig

SaaS-Plattformen und Cloud-Anwendungen entwickeln

Sie wollen Ihre Anwendung als Dienst für eigene Kunden anbieten. Wir bauen das Produkt und treffen mit Ihnen die frühen, schwer umkehrbaren Entscheidungen zu Mandantentrennung, Identität und Abrechnung.

  • Mandantentrennung in PostgreSQL
  • Identität über OpenID Connect
  • Optional Abrechnung über Stripe
  • Betrieb auf Kubernetes

01Ausgangslage

Vier Festlegungen, die ein SaaS-Produkt ein Leben lang begleiten

Bei SaaS entscheiden wenige frühe Festlegungen über Sicherheit, Kosten und Skalierbarkeit der gesamten Lebensdauer. Wer sie nachträglich ändert, ändert das Produkt. Diese Seite richtet sich an Geschäftsführung, CTOs und Produktverantwortliche, die ein Produkt aufbauen und diese Entscheidungen von Anfang an richtig treffen wollen. Für die interne Fachanwendung statt eines Produkts siehe Individuelle Softwareentwicklung.

  • Mandantenmodell: wie werden Daten verschiedener Kunden getrennt?
  • Identität: wie melden sich Nutzer an, wie werden Rollen je Mandant verwaltet?
  • Abrechnung: wie hängen Tarife, Nutzung und Zugriffsrechte zusammen?
  • Betrieb: welche Umgebung, welche Verfügbarkeitsziele, wer ist rufbereit?
Eine Person skizziert mit Marker auf einem Whiteboard einen Ablauf mit den Stichworten APIs und Feedback

02Mandantenmodell

Welches Mandantenmodell trägt Ihr Produkt?

Drei Wege, Kundendaten zu trennen. Keiner ist grundsätzlich richtig; er muss zu Mandantenzahl und Trennungsanforderung passen.

Mandantenmodelle im Vergleich: gemeinsames Schema, Schema je Mandant, Datenbank je Mandant
KriteriumGemeinsames Schema (Mandantenkennung je Zeile)Schema je MandantDatenbank je Mandant
Trennunglogisch, muss konsequent durchgesetzt werdenstärker, innerhalb einer Datenbankstark, getrennte Instanzen
Betriebsaufwand bei vielen Mandantengeringmittel (viele Schemas, Migrationen je Schema)hoch (viele Datenbanken)
Schemaänderungeneine Migrationeine Migration je Schemaeine Migration je Datenbank
Auswertungen über Mandanteneinfachmöglich, aufwendigeraufwendig
Individuelle Wiederherstellung je Mandantschwermöglicheinfach
Passt, wennviele kleine bis mittlere Mandanten, einheitliche Anforderungenmittlere Zahl Mandanten, höhere Trennungswünschewenige große Mandanten mit strengen Vorgaben (Datenort, Isolation)
RisikoProgrammierfehler legt Fremdmandanten-Daten offenBetriebsaufwand wächst mit MandantenzahlKosten und Betriebsaufwand je Mandant

03PostgreSQL

Row-Level Security: wo die Trennung wirklich hält

Beim gemeinsamen Schema setzen wir PostgreSQL Row-Level Security ein: Richtlinien legen fest, welche Zeilen eine Sitzung sehen oder ändern darf, ohne Richtlinie sind standardmäßig keine Zeilen sichtbar.

Wichtig: Superuser und Rollen mit BYPASSRLS umgehen die Sicherheit immer, Tabelleneigentümer standardmäßig auch, solange die Tabelle nicht mit FORCE ROW LEVEL SECURITY gesetzt ist. Deshalb verwendet die Anwendung eine eigene Rolle ohne diese Rechte, und die Mandantenkennung wird pro Verbindung oder Transaktion gesetzt und im Test gegengeprüft.

Datenbankdetails: PostgreSQL-Beratung und Datenbankarchitektur.

04Abnahmekriterien

Acht Prüfpunkte, bevor ein Mandant echte Daten einträgt

  • Jede Tabelle mit Mandantendaten trägt die Mandantenkennung oder liegt im Schema des Mandanten.
  • Trennung wird in der Datenbank durchgesetzt (Row-Level Security), nicht nur in der Anwendung.
  • Anwendungsrolle ist weder Eigentümer noch Superuser noch BYPASSRLS.
  • Automatisierte Tests prüfen aktiv, dass Mandant A keine Daten von Mandant B lesen, ändern oder löschen kann, auch über Verknüpfungen, Hintergrundjobs und Exporte.
  • Caches, Suchindizes, Dateiablagen und Protokolle sind ebenfalls mandantengetrennt.
  • Administrative und Support-Zugriffe laufen über eigene, protokollierte Wege.
  • Sicherung und Wiederherstellung sind je Mandant beschrieben (Granularität, Dauer), soweit zugesagt.
  • Löschung und Datenexport eines Mandanten sind als Funktion vorhanden.

05Architektur

Der Weg einer Anfrage durch die Plattform

Vom Nutzer eines Mandanten über Identität und Anwendung bis in die Datenbank. Die Vertrauensgrenze zwischen Mandant A und Mandant B verläuft durch alle Schichten.

Schichtenbild einer mandantenfähigen SaaS-Plattform Nutzer zweier Mandanten melden sich über OIDC an, die Anwendung setzt den Mandantenkontext, PostgreSQL erzwingt die Trennung per Row-Level-Security. Billing-Ereignisse laufen über eine Warteschlange, Beobachtbarkeit begleitet alle Schichten. Nutzer Mandant ANutzer Mandant B IdentitätAPI / AnwendungPostgreSQL Billing-DienstWarteschlange Beobachtbarkeit: Logs, Metriken, Traces Browser / ClientBrowser / Client OpenID ConnectMandanten-Claim setzt Mandantenkontextje Anfrage / Transaktion Row-Level-SecurityRolle ohne BYPASSRLS Tarife und Rechte ausAbrechnungszustand Ereignisse, asynchron Zahlungs-Webhook (optional) Vertrauensgrenze
Schichtenbild einer mandantenfähigen SaaS-Plattform
Schichtenbild einer mandantenfähigen SaaS-Plattform Nutzer zweier Mandanten melden sich über OIDC an, die Anwendung setzt den Mandantenkontext, PostgreSQL erzwingt die Trennung per Row-Level-Security. Billing-Ereignisse laufen über eine Warteschlange, Beobachtbarkeit begleitet alle Schichten. Vertrauensgrenze NutzerMandant A NutzerMandant B Identität API / Anwendung PostgreSQL Warteschlange Billing-Dienst Beobachtbarkeit:Logs, Metriken, Traces Browser / ClientBrowser / Client OpenID ConnectMandanten-Claim setzt Mandantenkontextje Anfrage / Transaktion Row-Level-SecurityRolle ohne BYPASSRLS Ereignisse, asynchron Tarife und Rechte ausAbrechnungszustand Zahlungs-Webhook (optional)
Schichtenbild einer mandantenfähigen SaaS-Plattform

06Identität

Anmeldung, Rollen und Single Sign-On je Mandant

Anmeldung über OpenID Connect, wahlweise mit Anbindung an Kunden-Identitätssysteme (Single Sign-On je Mandant), Rollen und Berechtigungen je Mandant, Prüfung der Mandantenzugehörigkeit bei jedem Zugriff. Das Zugriffsmodell richtet sich nach IAM und Zero Trust.

07Abrechnung

Stripe-Webhooks: der Teil, der in der Praxis Fehler verursacht

Wenn Sie Abonnements oder Nutzung abrechnen, binden wir Stripe an. Nach der Stripe-Dokumentation zu Webhooks gelten unter anderem diese Regeln, die wir umsetzen. Tarife und Berechtigungen werden aus dem Abrechnungszustand abgeleitet und in Ihrer Datenbank geführt; die Zuordnung eines Ereignisses zu Ihrem Mandanten erfolgt über eigene Kennungen, nicht über Annahmen. Ob Stripe oder ein anderer Dienst passt, klären wir mit Ihnen; Stripe ist optional.

  • Die Signatur jedes Ereignisses wird mit dem Signaturgeheimnis des Endpunkts geprüft, auf Basis des unveränderten Roh-Bodys.
  • Der Endpunkt antwortet schnell mit 2xx, bevor aufwendige Logik läuft; die Verarbeitung erfolgt asynchron über eine Warteschlange.
  • Doppelte Zustellungen werden über die Ereignis-ID erkannt (bereits verarbeitete IDs werden protokolliert).
  • Die Reihenfolge der Ereignisse ist nicht garantiert; die Verarbeitung darf nicht von ihr abhängen.
  • Nur die tatsächlich benötigten Ereignistypen werden abonniert.
Aufgeklappter Laptop mit Entwicklungsumgebung und Programmcode auf einem Holztisch

08Betrieb

Absichern, ausliefern, betreiben

Verfügbarkeitszusagen an Ihre Kunden setzen wir erst, wenn Architektur und Betrieb sie tragen.

09Projektablauf

Vom Produktzuschnitt bis zur Übergabe

  1. 01

    Produktzuschnitt

    Ergebnis: ADRs

    Zielkunden, Mandantenanforderungen, Tarifmodell, Betriebsanforderungen; Entscheidungen als ADR.

  2. 02

    Fundament

    Ergebnis: Plattform

    Mandantenmodell, Identität, Pipeline, Plattformanbindung, Beobachtbarkeit.

  3. 03

    Kernfunktionen

    Etappen

    Umsetzung in Etappen mit Demonstration; Billing-Anbindung, wo gewünscht.

  4. 04

    Härtung

    Ergebnis: Nachweise

    Mandanten-Isolationstests, Lasttests, Sicherheitsprüfungen, Wiederherstellungstest.

  5. 05

    Übergabe

    Ergebnis: Betrieb

    Übergabe an Ihr Team oder in den Betrieb durch SKAFFON.

10Technologie

Womit wir SaaS-Produkte bauen

Sprachen

  • Go
  • TypeScript

Daten und Plattform

  • PostgreSQL
  • Kubernetes

Identität und Abrechnung

  • OIDC
  • Stripe (optional)

11Passung

Wann Sie kein individuelles SaaS-Projekt brauchen

Aufwand bestimmen Funktionsumfang, Mandantenmodell, Zahl der Integrationen (Identität, Billing, Fremdsysteme), Anforderungen an Verfügbarkeit, Isolation und Datenort sowie der Betriebsanteil.

Das passt zu uns

  • Sie bauen ein eigenes Produkt mit mandantenfähiger Architektur.
  • Sie wollen die schwer umkehrbaren Entscheidungen früh und dokumentiert treffen.

Das passt nicht

  • Eine bestehende SaaS-Standardlösung deckt Ihr Geschäftsmodell ab.
  • Sie suchen Produktstrategie oder Marketing, nicht technische Umsetzung.
  • Sie erwarten einen Festpreis für ein Produkt, dessen Funktionsumfang noch nicht abgegrenzt ist.

12

Häufige Fragen

Warum reicht Mandantentrennung in der Anwendung allein nicht?

Ein einzelner Programmierfehler kann dann Daten eines anderen Mandanten offenlegen. Deshalb wird die Trennung in der Datenbank durchgesetzt, etwa mit Row-Level Security, und mit automatisierten Tests gegengeprüft.

Ist Stripe für die Abrechnung Pflicht?

Nein. Stripe ist eine gängige Wahl, aber kein Bestandteil, den wir voraussetzen. Wir wählen den Zahlungsdienst gemeinsam mit Ihnen nach Zielmärkten und Abrechnungsmodell.

Nennen Sie Verfügbarkeitszahlen für meine Kunden?

Nicht pauschal. Eine Zahl, die Sie Ihren Kunden zusagen, muss durch Architektur, Wiederherstellungstests und Betriebsmodell gedeckt sein. Erst dann sagen wir sie zu.

Wer betreibt das Produkt nach dem Start?

Entweder Ihr Team nach der Übergabe oder auf Wunsch SKAFFON, zum Beispiel über Managed Kubernetes.

Beschreiben Sie Produkt, Zielkunden und Abrechnungsmodell

Mit diesen drei Angaben können wir die Mandantenfrage und den Projektzuschnitt konkret besprechen. Weitere Leistungen: Software Engineering.