In den letzten 14 Tagen habe Ich mit ein paar anderen Azubis an einem Projekt gearbeitet, bei dem es sich um einen r/place Klon handelt. Wir haben schon einige Male Projekte durchgeführt, allerdings sind wir dieses Mal deutlich vorbereiteter an das Projekt rangegangen. Außerdem ist dies auch unser erstes Projekt gewesen, bei welchem wir Skalierung mittels Kubernetes einsetzen.
Das Projekt ist in drei Services aufgeteilt, von denen zwei das Backend darstellen und einer das Frontend. Zusätzlich zu den eigenen Services wir außerdem ein MariaDB, Redis und ElasticSearch verwendet, um z.B. Pixeldaten und Logs zu persistieren.
Natürlich würde ich hier auch gerne ein paar Screenshots einbauen, da wir gerade noch in einer Testphase sind und dementsprechend auch noch nicht alles funktionstüchtig ist, werde ich diese bei Zeiten nachreichen.
Backend-Aufbau
Das Backend von Az/Place ist wie bereits erwähnt auf zwei Services verteilt, ein REST-Service und ein WebSocket-Server. Der WebSocket-Server hat alleine die Aufgabe die Nutzer über neu platzierte Pixel zu informieren, wohingegen der REST-Service noch einige andere Tätigkeiten übernimmt.
Zu den Haupttätigkeiten des REST-Services zählen selbstverständlich das Platzieren von Pixeln und das Abfragen des gesamten Boards. Der Service allerdings auch die Nutzervalidierung (die Authentifizierung wird über ein CAS durchgeführt) und bietet unter Anderem auch die Möglichkeit Nutzer bei Bedarf temporär zu sperren, die Farbpaletten anzupassen oder Statistiken über das Board zu erhalten.
Frontend
Das Frontend stellt einerseits das Board da und bietet die Möglichkeit sich anzumelden, andererseits werden hier auch die vom WebSocket-Server gesendeten Daten verarbeitet und live dargestellt.
Server-Architektur
Wie bereits erwähnt kam in diesem Projekt Kubernetes zum Einsatz, weshalb alle Services auch als Docker-Image verfügbar sind. Das Kubernetes-Cluster verfügt derzeit unter Anderem über ein Fluentd, einen Vault, ein Traefik sowie einen CertManager.
Der Traefik ist für sämtlich Services als IngressController eingerichtet und übernimmt auch die Verteilung der Zertifikate. Da wir die meisten Teile im Internen Netzwerk verwenden, kommen dort eigene Zertifikate zum Einsatz. Für die externen Services wiederum werden Mittels CertManager Lets-Encrypt Zertifikate generiert und automatisch aktualisiert.
Für unsere Services haben wir zusätzlich zu den Docker-Images auch noch Helm-Charts über eine GitHub Action automatisch deployed und über den Vault mit Secrets versorgt werden. Auch viele der anderen Services sind mit Hilfe eines Helm-Charts deployed worden.
Feature-Set
In der derzeitigen Version (1.0.0) kann man Pixel Platzieren, sehen wer den Pixel zuletzt übermalt hat und bekommt den Cooldown im Frontend angezeigt. Über das Backend haben wir unter Anderem auch die Möglichkeit bei Bedarf die Größe des Boards anzupassen, sowie den Cooldown zu verlängern oder zu verkürzen.
Fazit
Auf Grund der vielen Dependencies ist es leider etwas schwerer az/place einzurichten, in der Theorie kann das Projekt aber von jedem eingerichtet und verwendet werden. Die derzeitige Version ist allerdings noch etwas instabil, aber wird vermutlich in den nächsten Wochen noch etwas verbessert. In zukünftigen Versionen wird hoffentlich auch die Einrichtung einfacher und einige Dependencies optional.