Neue Welt - Strapi - Part 1
Die “Neue Welt”-Serie findet hier ihren technischen Anfang. In diesem Artikel werde ich Strapi als Docker Container/Stack betreiben.
Was war nochmal Strapi?
Strapi ist ein Headless-CMS. Das heißt: Strapi stellt alle Anforderungen, die an ein Backend anfallen, bereit. Datenhaltung, WebService und Administration sind ein paar dieser Anforderungen.
Um die Darstellung der Inhalte etc. muss vom Betreiber/Entwickler separat gesorgt werden. Ich werde als Beispiel auf GatsbyJS setzen.
Was kann Strapi?
Ghost als Beispiel ist ein System, was ich mittlerweile sehr gern habe. Ghost kann übrigens auch als Headless-CMS betrieben werden. Wenn Ghost die Erstellung von eigenen “Inhaltstypen” anbieten würde, würde ich diesen Post nicht schreiben.
ContentTypes / Fields
Mit Strapi kann ich eigene Inhaltstypen anlegen. Zusätzlich werden verschiedene Feldtypen angeboten, mit denen der Inhaltstyp modelliert werden kann.
Das Beziehungs-/Relations-Feld ist hier noch eine eigene Erwähnung wert. Für jemanden, der seit über 10 Jahren ContentTypes modelliert hat – ich kann SharePoint und das sogar ziemlich gut – war das Lookup-Feld immer so ein halbfertiges Ding. Mit MOSS 2007 war das cool, mit den Jahren nicht mehr so :)
Das Lookup-Feld kann heute noch 1->1 oder 1->n Relationen. Strapi kann mehr: Neben 1->1 und 1->n sind auch n->n möglich – und dann noch das Ganze invers :)
GraphQL
Strapi kann GraphQL und das ziemlich gut! Strapi kann meiner Meinung nach auch für schnelle Showcases oder kleine bis mittelgroße PoCs verwendet werden.
Ich modelliere mein (relationelles) Datenmodell an der Oberfläche, die benötigten Berechtigungen für die API vergebe ich über eine Oberfläche und kann anschließend dagegen abfragen/entwickeln. Das ist einfach, einfach :)
Der technologische Stack
Strapi ist in Node.js geschrieben. Für mich ist dieser Teil eigentlich sehr uninteressant, da ich Sprachen und/oder Frameworks als Werkzeuge ansehe, die ich verwenden können sollte.
Was aber wiederum interessant ist: Ich kann an verschiedenen Stellen programmatisch reagieren und z.B. den Service, Controller oder das Model für einen ContentType anpassen. Letzteres – Models – bieten sogar die Möglichkeiten, auf verschiedene Ereignisse bei der Verwaltung von Entitäten zu reagieren. In etwa so wie bei SharePoint ListEventReceivern. Ich liebe es :)
Was Strapi nicht kann
Strapi kann vieles nicht OOTB, das Meiste kann programmatisch implementiert/integriert werden.
Verwaltungsoberfläche
Was mir nicht so gut gefällt, ist die Adminoberfläche. Die ist zwar besser als die von manch anderen Headless-CMS-Systemen, aber immer noch potthässlich. Versucht mal ein Datum in einem Datumsfeld zu setzen, welches vor 2012 liegt…
Keine ContentType-Hierarchie
Es gibt auch Funktionen, die ich z.B. von SharePoint gewohnt bin und tatsächlich in Strapi vermisse: Hierarchische ContentType-Struktur!
Würde Strapi so etwas anbieten, wäre das für mich die ideale Plattform, um kleine Ontologien aufzubauen und mit bisschen Logik eine semantische Web-Umgebung aufzubauen.
Inbetriebnahme mit externer MongoDB
Dieses Vorhaben ist eigentlich sehr simpel, da die Macher von Strapi zum einen ein Docker Image und zum anderen eine halbwegs gute Dokumentation bereitstellen.
Das dazugehörige docker-compose.yml:
version: '3'
services:
strapi:
container_name: strapi
image: strapi/strapi:${TAG}
environment:
- DATABASE_CLIENT=${DATABASE_CLIENT}
- DATABASE_HOST=${DATABASE_HOST}
- DATABASE_PORT=${DATABASE_PORT}
- DATABASE_NAME=${DATABASE_NAME}
- DATABASE_USERNAME=${DATABASE_USERNAME}
- DATABASE_PASSWORD=${DATABASE_PASSWORD}
- DATABASE_AUTHENTICATION_DATABASE=${DATABASE_AUTHENTICATION_DATABASE}
- VIRTUAL_HOST=${VIRTUAL_HOST}
- LETSENCRYPT_HOST=${LETSENCRYPT_HOST}
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
ports:
- 1337:1337
volumes:
- strapi_data:/srv/app
volumes:
strapi_data:
networks:
default:
external:
name: nginx-proxy
Mit docker-compose up starten und dann kann mit dem Modellieren begonnen werden.
Wie geht es weiter?
Was auf jeden Fall irgendwann mal folgen wird: Eine Anleitung, wie man per Paketmanager Strapi als Entwicklungsumgebung lokal einrichtet, Anpassungen vornimmt und ein Docker Image daraus baut… Und wie man (relativ) einfach die Artikel aus Ghost importiert.