Zum Inhalt springen
Omar Sharkeyeh

LebenslaufProjekteNun Pirat

Nun Pirat: die Plattform unter einer Arabisch-Lern-App

Mit Nun Pirat lernen Kinder, Familien und Schulklassen Arabisch lesen und schreiben. Ich entwickle die App und habe die Plattform entworfen und gebaut, auf der sie läuft: Infrastruktur, Auslieferung und Monitoring. Um die Plattform geht es hier.

Meine Rolle
Plattform entworfen, gebaut, betrieben
Zeitraum
App seit 2024, Plattform 2026
Umgebungen
Staging und Produktion
Code
15 Plattform-Repositories, eine Pipeline
Die App unter nunpirat.com. Alles Weitere auf dieser Seite sorgt dafür, dass sie schnell, erreichbar und sicher änderbar bleibt.

Was sie können musste

Familien lernen abends, Schulen vormittags. Die App muss also zu beiden Spitzenzeiten schnell sein und sollte dazwischen nicht ausfallen. Die Zahl der Lernenden sollte wachsen, und die Plattform musste mitwachsen, ohne neu gebaut zu werden. Ein Betriebsteam gibt es nicht, also musste die Routinearbeit von selbst laufen. An eine Cloud gebunden sein sollte sie nicht. Und eine Änderung auszuliefern musste so sicher sein, dass man es an einem gewöhnlichen Dienstagnachmittag tun kann.

Der Stack

Die Plattform besteht aus vier Schichten. Jede verlässt sich nur auf die darunter: Der App ist egal, auf welchen Servern sie läuft, und nur die unterste Schicht weiß, welche Cloud darunter liegt.

Anwendung

Was die Lernenden nutzen

LaravelReactPostgreSQLRedisTypesense-SucheHintergrund-Worker

Plattformdienste

Was jede App darauf bekommt

Zertifikateöffentliches und privates DNSVerkehrssteuerungDatenbank-Operatorgemeinsamer SpeicherVPNsichere Neustarts

Kubernetes

Wo alles läuft

Staging-ClusterProduktions-ClusterAutoscalingaktualisiert sich selbst

Fundament

Der einzige cloudspezifische Teil

NetzeProjekteZugänge für die Pipelines
Die oberen drei Schichten sind reines Kubernetes, Helm und Terraform. Ein Wechsel des Anbieters heißt, das Fundament neu zu schreiben; Plattform und App bleiben, wie sie sind.

Alles läuft aus Code

Kein Server dieser Plattform wurde von Hand eingerichtet. Cluster, Netze, DNS-Einträge, Zertifikate, Datenbanken und Zugriffsrechte sind in Terraform festgehalten und werden von der Pipeline angewendet. Eine neue Umgebung ist derselbe Code noch einmal, deshalb unterscheiden sich Staging und Produktion nur in der Größe. Eine Änderung an der Infrastruktur geht wie jede App-Änderung durch ein Review, mit einer Vorschau, was sich genau ändert. Und weil der Code die Beschreibung der Plattform ist, veraltet er nicht wie eine Wiki-Seite.

Automatisiert vom Commit bis zur Produktion

Alle Repositories, App wie Plattform, teilen sich einen Satz Pipeline-Vorlagen. Eine Änderung nimmt deshalb überall dieselben fünf Schritte. Einer davon braucht einen Menschen, an dreien laufen Tests; welche, zeigt der Abschnitt zu den Tests weiter unten.

  1. Merge RequestEine Änderung wird vorgeschlagen.
  2. Bauen und testenautomatischImage gebaut, Unit- und Feature-Tests, Code und Infrastruktur geprüft.
  3. StagingautomatischSofort ausgerollt, danach laufen die End-to-End-Tests dagegen.
  4. Freigabeein KlickErst möglich, wenn alle Tests bestanden sind.
  5. ProduktionDasselbe Release geht live und wird noch einmal geprüft.
SicherheitsnetzDatenbankänderungen laufen, bevor die neue Version startet. Schlägt eine fehl, stoppt das Release und die Nutzer behalten die laufende Version.
Überall dasselbe ReleaseStaging und Produktion bekommen dasselbe Image und denselben Infrastruktur-Code. Was getestet wurde, geht auch live.
Infrastruktur-Änderungen nehmen denselben Weg: Eine Änderung an einem Cluster oder einem DNS-Eintrag wird als Vorschau gezeigt, auf Staging angewendet und für die Produktion freigegeben wie ein App-Release.

Was sonst von allein läuft

Updates der Komponenten, auf die die Plattform baut, kommen als Merge Requests und durchlaufen dasselbe Review und dieselben Tests wie jede andere Änderung. Die Betriebssystem-Schicht unter der App wird jede Nacht neu gebaut, Sicherheitsupdates erreichen die Produktion also mit dem nächsten Release. Und die Testumgebung hält Bürozeiten ein:

Sie startet um neun, geht um sechs in den Ruhezustand und kostet nachts so gut wie nichts.

Automatisierte Tests

Die Tests sind Teil der Pipeline. Ein Release muss drei Ebenen davon bestehen, bevor überhaupt jemand um eine Freigabe gebeten wird, und nach dem Livegang wird die Produktion noch einmal geprüft.

  1. End-to-End-Tests

    Neun Szenarien im echten Browser: Registrierung als Erwachsener oder Elternteil, Anmeldung mit Einmalcode, Kinderkonten und Bezahlung mit Stripe und PayPal im Sandbox-Modus, samt der E-Mails, die dabei verschickt werden.

    bei jedem Staging-Release
  2. Feature-Tests

    Seiten und Schnittstellen gegen eine echte Datenbank: Anmeldung, Abrechnung, Lektionen, Benachrichtigungen, Datenschutz, Suchmaschinen-Tags.

    bei jedem Merge Request
  3. Unit-Tests und statische Prüfungen

    Geschäftsregeln, Frontend-Komponenten, Typen und Codestil; der Infrastruktur-Code wird validiert und als Vorschau gezeigt. Günstig und schnell, deshalb bei jedem Commit.

    bei jedem Commit
Backend-Tests
rund 1.300
Frontend-Testdateien
40
End-to-End-Szenarien
9
Nach dem LivegangEine Prüfung bestätigt, dass jeder Teil der App die neue Version fährt und die Seiten rendern. Wenn nicht, gilt das Release als fehlgeschlagen.
Unter LastLasttests simulieren viele gleichzeitige Nutzer und zeigen, wie viel Verkehr die Plattform verträgt, bevor der echte Verkehr kommt.
Die vielen schnellen Tests unten fangen die meisten Fehler wenige Minuten nach einem Commit ab. Die wenigen langsamen oben zeigen, dass das Ganze zusammen funktioniert.

360°-Monitoring

Eine Verfügbarkeitsprüfung sagt nur, ob die Seite antwortet. Auf dieser Plattform meldet jeder Teil, was er tut. Man sieht also auch, wie gut es läuft, was passiert ist, wohin eine Anfrage ging und wo die Zeit geblieben ist.

Quellen

  • Web-App
  • Hintergrund-Worker
  • Zeitgesteuerte Aufgaben
  • Live-Updates
  • Cluster und Nodes
MetrikenWie geht es dem System?Prometheus
LogsWas ist passiert?Loki
TracesWohin ging die Anfrage?Tempo
ProfileWo geht die Zeit hin?Pyroscope
Von außenIst die Seite für Nutzer erreichbar?Uptime Kuma

Grafana

Ein Dashboard
  • eine Karte aller Dienste
  • Signale untereinander verknüpft
  • das Release an jedem Signal
  • Alarme
Alles meldet über einen offenen Standard, OpenTelemetry. Die Signale werden nach Art gespeichert und treffen sich in einem Dashboard wieder, das mit einer Karte aller Dienste öffnet, eingefärbt nach Zustand.

Vom Alarm zur Ursache

Weil die Signale verknüpft sind und jedes das Release trägt, aus dem es stammt, ist der Weg zur Ursache einer Verlangsamung kurz, statt einer Suche in mehreren Werkzeugen:

  1. AlarmDie Antwortzeiten steigen.
  2. TraceEine langsame Anfrage, Schritt für Schritt.
  3. LogsWas während dieser Anfrage passiert ist.
  4. ReleaseDie Version, die es eingeführt hat.

Wenn etwas schiefgeht

Warum es so gebaut ist

Damit ein kleines Team es betreiben kann. Niemand muss sich an einen Handgriff erinnern, ein fehlgeschlagenes Release erreicht die Nutzer nicht, und wenn doch etwas schiefgeht, liegen die Daten zur Erklärung schon bereit.

Zurück zum Lebenslauf