neon.tech und Strapi: Ein moderner Ansatz für Feature-Branching von Datenbanken
In diesem Artikel zeigen wir eine einfache Möglichkeit auf, die neue neon.tech Datenbank Platform mit Strapi zu verwenden. Dabei wird die neon API und das “Branching” Feature perfekt integriert. Das dafür entwickelte Strapi Plugin findet sich auf Github
neon.tech - Postgres im 21. Jahrhundert
neon.tech ist eine moderne serverless PostgresQL Plattform, die es ermöglicht, Datenbanken schnell und einfach zu erstellen und zu verwalten. Dabei können Datenbanken und Branches bei verschiedenen Cloudanbietern und Regionen gestartet werden. Entsprechend dem “serverless” Ansatz stoppt jeder Branch automatisch wieder, wenn der Traffic aufhört.
neon.tech bietet ebenfalls eine API-Schnittstelle und ein benutzerfreundliches Dashboard, um die Datenbanken zu überwachen und zu konfigurieren. Durch den programmatischen Ansatz eignet sich das System perfekt um tief in Entwicklungsworkflows eingebunden zu werden. Das Ziel ist, schnell und einfach neue Git-Branches zu öffnen um Features zu entwickeln. Jeder Git-Branch soll synchron mit einem neon Datenbankbranch sein. Dadurch können wir das Schema erweitern und neue Funktionalitäten programmieren, ohne eine produktive Datenbank zu verwenden. Neon ermöglicht es, einen neuen Branch mit Daten aus einem “parent” Branch zu starten. Dadurch hat man nie wieder das Problem, Datenbanken erstmal zu seeden, bevor man loslegen kann.
Featurebranches und Strapi - eine Leidensgeschichte
In der herkömmlichen Softwareentwicklung werden "Featurebranches" verwendet. Dabei wird für jedes neue Feature ein eigener Git-Branch erstellt und neuer Code committed. Wenn die Funktionalität fertig ist, wird der Featurebranch wieder mit "main" zusammengeführt. Soweit so bekannt. Das Problem bei der Arbeit mit Datenbanken ist, dass diese im Normalfall nicht für diese flexible Arbeitsweise ausgelegt sind. Neue Features bedeuten meist auch Änderungen am Datenschema, weshalb man eigentlich für jeden Git-Branch eine eigene Datenbank haben möchte, da man keine Schemaänderungen an einer produktiven Datenbank vornehmen kann. Mit Strapi wird das Ganze noch problematischer. Wenn man für jeden Featurebranch eine neue Datenbank erstellt, ist diese zunächst leer. Beim Start von Strapi wird automatisch das Schema migriert, es sind jedoch noch keine Daten vorhanden. Als Entwickler kann man hier lokal den notwendigen Inhalt erstellen, um sein Feature zu testen. Sobald man jedoch ein sogenanntes "Preview Deployment" haben möchte, das beispielsweise mit Kunden und anderen Stakeholdern abgestimmt werden soll, hat man wieder ein Problem: Man benötigt eine Cloud-Datenbank und muss den Inhalt anschließend manuell übertragen. Das regelmäßige Migrieren von Inhalten stellt einen starken Bruch im bekannten Softwareentwicklungs-Flow da und erschwert die Arbeit enorm. Es ist Zeit für ein Datenbank-Setup, das mit Featurebranches umgehen kann, und das lästige wiederholte anlegen von Test-Content eliminiert.
Das neon.tech Strapi Plugin
Um die ganzen Vorteile von neon mit Strapi zu verwenden müssen folgende Punkte erfüllt werden:
- Automatisches einfügen des Postgres connection Strings: da jeder Featurebranch ein eigene, autogenerierte URL erhält, sollte diese über die neon API geladen werden.
- Automatisches erstellen von FeatureDBs: Strapi sollte nach Möglichkeit beim Start überprüfen, auf welchem Git-Branch wir uns befinden und entsprechend eine neue Datenbank, ausgehend von “main” erstellen.
- Steuerung des Datenbank Branch über Informationen von “Git” oder bei deployten Versionen mittels Umgebungsvariablen.
- Gleiche Umgebung lokal wie in der Cloud - dadurch muss Content nicht doppelt gepflegt werden
Installation & Konfiguration des Plugins
Der Sourcecode und eine ausführliche Dokumentation des Plugins findet sich auf Github. Installiert wird das Plugin mit npm, pnpm oder yarn:
npm i strapi-neon-tech-db-branches
oder
pnpm i strapi-neon-tech-db-branches
Konfiguration
Als erstes muss unter neon.tech ein neues Projekt erstellt werden welches wir für die Anbindung mit Strapi verwenden soll. Um strapi jetzt mit der neuen postgresql DB zu verbinden müssen wir folgende Einstellungen im Plugin vornehmen:
- Den Neon API Key setzen (Kann hier erstellt werden)
- Den Namen vom Neon Projekt konfigurieren
- Den Namen der Role setzen
Wir setzen diese 3 Einstellungen über das plugins.js
File in Strapi
module.exports = {
...
'strapi-neon-tech-db-branches': {
enabled: true,
config: {
neonApiKey: "09hx...0a8yjd", // get it from here: https://console.neon.tech/app/settings/api-keys
neonProjectName: "strapi-project-xyz", // the neon project under wich your DB runs
neonRole: "sample-user", // create it manually under roles for your project first
//(gitBranch: env.GIT_BRANCH || "main") // branch can be pinned via this config option or vie env GIT_BRANCH. Will not use branch from git then. Usefull for preview/production deployment
}
},
...
}
Habt ihr das Plugin so konfiguriert wie oben beschrieben, erstellt es beim start von Strapi automatisch einen DB Branch + neon Endpoint mit dem Namen eures aktuellen git branches. Solltet ihr den git branch wechseln, startet sich Strapi neu und verbindet sich wieder mit dem passenden branch (bzw. erstellt Ihn wenn noch nicht vorhanden). Solltet ihr an das Limit der aktuell verfügbaren branches in neon kommen, habt ihr direkt in der Konsole von Strapi die Möglichkeit einen alten branch zu löschen.
Verwendung in der CI (für production/preview deployments)
Euer Preview Deployment von Strapi richtet ihr jetzt am besten so ein, dass es die selbe Datenbank (bzw. Datenbank branch) wie in der Entwicklungsumgebung verwendet. Damit habt ihr dann bereits den gesamten Test-Content den ihr während dem Entwickeln angelegt habt auch im Preview Deployment. Dadurch spart ihr euch das lästige rüber kopieren/synchronisieren von Content oder die Konfiguration von Strapi import-export Plugins.
Wenn Strapi auf einem Server deployed werden soll ist in der Regel das .git Verzeichnis nicht mehr vorhanden und es kann nicht mehr automatisch der passende Datenbank Branch ausgewählt werden. Alternativ kann man für diesen Fall Strapi mit der Umgebungsvariable GIT_BRANCH
starten und sich so trotzdem mit der richtigen Datenbank verbinden. Solltet ihr für euer deployment in Github Actions einen Strapi Docker Container bauen könnt ihr in der CI mit ARG GIT_BRANCH
und --build-arg=${{ github.ref_name }}
den DB branch automatisch auf den aktuellen git branch Namen setzen.
Unterstützung und Github-Repository
Der Quellcode und die Dokumentation können im öffentlichen Github-Repository des Plugins gefunden werden. Das Repo kann geforked werden, um weitere Funktionen hinzuzufügen oder auch Issues bei Problemen direkt selbst zu lösen. Solltet ihr gute Ideen für Erweiterungen oder Bugfixes haben, freuen wir uns über jeden Pull-Request.