Diese kostenlose Go-Alternative zu Firebase besteht aus nur einer Datei
BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology
Transcript
00:00:00PocketBase ist eine Open-Source-Alternative zu Supabase oder Firebase und wohl das einfachste
00:00:04Backend, das Sie je betreiben könnten. Nur eine einzelne Datei bietet Ihnen Echtzeit-Datenbank, Authentifizierung und
00:00:11Dateispeicherung. Das steht im krassen Gegensatz dazu, wie unglaublich komplex moderne Webentwicklung geworden ist.
00:00:16Im heutigen Video testen wir also PocketBase und sehen, ob seine einfache Architektur
00:00:21wirklich besteht, wenn man mehr als eine einfache App baut.
00:00:29PocketBase ist eine einzelne Go-Binary mit eingebettetem SQLite, aber das Programmieren in Go selbst ist tatsächlich
00:00:35optional, da das Backend mit JavaScript und TypeScript erweitert werden kann. Außerdem erhalten Sie
00:00:40Zugriff auf eine einfache Admin-Benutzeroberfläche, in der Sie all Ihre Sammlungen genau wie bei Supabase konfigurieren können.
00:00:46Kommen wir nun zur Architektur und dazu, wie man es eigentlich nutzt: Sobald PocketBase live ist, können Sie
00:00:51über das JavaScript-SDK vom Frontend darauf zugreifen. Auch das ist sehr ähnlich zu dem, wie Firebase
00:00:57und Supabase konzipiert sind, da man direkt vom Frontend auf die Datenbank zugreifen kann und sich nicht
00:01:02sorgen muss. PocketBase hat API-Regeln und Authentifizierung, um all diese Zugriffe sicher zu halten, aber lassen Sie uns direkt in
00:01:08eine Demo springen, um eine echte Anwendung mit Authentifizierung, Datenbank und Dateispeicherung zu zeigen. Und wenn Ihnen dieses
00:01:13Video gefällt, dann abonnieren Sie Better Stack, da wir auf diesem Kanal eine riesige Menge an Entwickler-Content abdecken.
00:01:18Wir haben also hier unsere Anwendung, mit PocketBase im Backend und einem Web-Frontend,
00:01:22geschrieben in React. Die wichtigste Datei im Web-Frontend ist diese pb.ts-Datei hier, denn
00:01:30darin importieren wir PocketBase, erstellen also die PocketBase-Klasse und eine neue Instanz
00:01:36davon. Dann können wir eine Verbindung zu unserem Backend-Dienst herstellen und pb im Rest der
00:01:42Anwendung nutzen. Die Anwendung selbst ist nur ein einfacher Bug-Tracker; wir können Elemente zwischen Spalten ziehen und
00:01:48brandneue Issues erstellen. Wenn wir in den Hook schauen, der den angemeldeten Benutzer steuert, sehen Sie,
00:01:53dass wir den Status anfangs mit pb.authStore.model festlegen. Das ruft einfach den aktuell authentifizierten Benutzer
00:01:59von PocketBase ab. Dann richten wir auch noch einen Listener ein, also sagen wir: Wenn sich der Auth-Store durch das
00:02:05onChange-Ereignis ändert, setzen wir einfach den neuen Benutzer in den Status. Es ist also wirklich so einfach.
00:02:11Wir können auf den Status zugreifen, den Status abonnieren, und das Gleiche gilt auch für unsere Issues.
00:02:16Also, in unserem useIssues-Hook initialisieren wir wieder einen Status, lassen ihn in diesem Fall aber leer,
00:02:21dann haben wir einen useEffect und wir sagen, dass wir alle Issues abrufen, die vollständige Liste erhalten und dann
00:02:27werden wir die Issues mit dieser Liste festlegen. Das würde die Daten anfänglich vorab laden und dann können wir
00:02:32auch Issues abonnieren. Wenn man also Issues zwischen Spalten zieht oder ein Issue erstellt oder löscht,
00:02:38können wir sagen pb.collection(“issues”).subscribe, und jedes Mal, wenn ein neuer Datensatz eingeht, können wir ihn
00:02:44an unseren Status anhängen. Das bedeutet, wenn wir direkt mit der PocketBase-Datenbank interagieren,
00:02:49wie wenn wir eine Karte hier ziehen, wird der Status automatisch aktualisiert. Im Falle des Erstellens eines
00:02:54brandneuen Issues können wir auch einen Screenshot anhängen. Machen wir also einen Screenshot der Anwendung
00:02:59selbst, klicken dann auf “File Issue” und das neue Issue erscheint hier im Frontend-Code. Dies wird
00:03:05über eine Submit-Funktion gehandhabt, dann hängen wir alle Formulardaten an und rufen schließlich pb
00:03:11.collection(“issues”).create auf und übergeben die Daten. Was wir im Backend haben, sind Sammlungs-API-
00:03:17Regeln, um den Missbrauch dieser APIs zu verhindern, also gibt PocketBase standardmäßig diese Admin-Oberfläche.
00:03:24Und hier sehen Sie, dass wir die Users-Sammlung und auch die Issues-Sammlung haben,
00:03:27in der alle unsere Issues leben. Wenn wir in die Users-Sammlung schauen und dann hier oben auf “Settings” drücken,
00:03:32dann haben wir diesen Tab “API Rules”, und das sind all die Regeln, die den Zugriff auf diese spezielle
00:03:37Sammlung einschränken. Wir sagen also im Fall der Benutzer, dass die request.auth.id kein leerer String sein darf, und dann beim
00:03:43Aktualisieren oder Löschen von Benutzern muss die ID mit der ID des authentifizierten Benutzers übereinstimmen. Und darauf können wir zugreifen
00:03:50mit diesem speziellen String hier, dem @-Zeichen und dann request.auth.id. Wenn Sie Supabase
00:03:56in der Vergangenheit verwendet haben, wird Ihnen dieses Muster sehr vertraut vorkommen. Was passiert nun, wenn das Backend nicht
00:04:02alles tut, was Sie brauchen? Glücklicherweise können Sie es über Hooks mit natürlich Go, aber auch JavaScript
00:04:08und TypeScript erweitern. Wir können uns also in Ereignisse einklinken wie onBootstrap, wenn die App startet, oder onRecord
00:04:15Create, wenn ein Datenbank-Datensatz erstellt wird. Zum Zeitpunkt der Aufnahme gibt es 82 einzigartige Hooks, also so ziemlich
00:04:21alles, was Sie benötigen, sollte abgedeckt sein. Lassen Sie uns nun unseren PocketBase-Dienst erweitern, um zu sehen, wie es funktioniert.
00:04:27Wenn wir in den pb-Ordner schauen, sehen Sie unsere PocketBase-Binary, und diese Datei ist buchstäblich
00:04:32alles, was Sie brauchen, um die Standardversion von PocketBase auszuführen. In meinem Fall habe ich jedoch alle Hooks
00:04:38in TypeScript geschrieben, also habe ich eine Einrichtung, um diese Hooks in den pb_hooks-Ordner als JavaScript zu kompilieren, denn
00:04:44PocketBase unterstützt tatsächlich nur JavaScript nativ. Wenn Sie also TypeScript verwenden, müssen Sie es herunterkompilieren.
00:04:50Wenn wir in die Haupt-Hook-Datei schauen, sehen wir, dass wir hier einen Hook für onRecordCreate haben,
00:04:55und das zielt speziell darauf ab, wenn wir Issues erstellen. Was wir hier tun, ist, dass wir sagen:
00:05:00Jedes Mal, wenn ein Datensatz erstellt wird, senden wir eine E-Mail an den Benutzer, und das können wir tun, indem wir
00:05:05e.app.newMailClient().send(...) aufrufen und das Nachrichtenobjekt übergeben, das wir hier erstellt haben.
00:05:10Sie können sich natürlich in eine Menge verschiedener Funktionen innerhalb von PocketBase einklinken, also jede benutzerdefinierte Funktionalität,
00:05:15die Sie benötigen könnten, wird mit den über 82 Hooks, die in PocketBase bereits verfügbar sind, immer unterstützt.
00:05:21Da dies SQLite ausführt, bedeutet dies, dass wir persistente Speicherung benötigen. Plattformen wie Heroku, Render
00:05:28oder Railway wären aufgrund ihrer ephemeren Dateisysteme eigentlich eine schlechte Wahl, da Sie grundsätzlich Ihre Daten verlieren würden,
00:05:33jedes Mal, wenn Sie Ihre App neu bereitstellen. Um dies zu vermeiden, können Sie ein permanentes Dateisystem anhängen, aber die bessere und
00:05:39billigere Option wäre einfach, auf einem VPS zu hosten, und diese Daten leben im pb_data-Ordner. Wenn
00:05:45wir hier hineinschauen, sehen Sie, dass wir einen Storage-Ordner haben, und dieser würde alle
00:05:50Bilder enthalten, die wir für unsere Issues hochgeladen haben. Sie werden zufällig im Storage-Ordner gespeichert,
00:05:55also können Sie in dieser zufälligen ID hier beispielsweise das Bild sehen, das ich vorhin für das Issue hochgeladen habe.
00:05:59Die Datenbankdateien selbst würden ebenfalls in diesem Ordner persistent gespeichert werden, also data.db hier. Dies
00:06:05würde all unseren SQLite-Code enthalten. Wenn ich diese Datei also löschen würde, würde ich alle Daten in der
00:06:11Anwendung verlieren, also braucht man offensichtlich eine gute Backup-Strategie, anstatt es nur als einzelne
00:06:16Datei auf der Festplatte zu belassen. Im Vergleich zu Tools wie Supabase, die bei 25 Dollar für die Basisstufe anfangen, ist PocketBase
00:06:22im Grunde kostenlos. Sie müssen nur Ihre VPS-Kosten bezahlen, die nur vier Dollar betragen können, und es ermöglicht
00:06:28Ihnen, so viele Projekte auszuführen, wie Sie möchten, aber natürlich würden Sie dies mit der Nutzung skalieren wollen.
00:06:33PocketBase kommt auch mit allem, was Sie für Produktions-Apps benötigen, wie Migrationen, Job-Scheduling und
00:06:38Logging. Sie können statische Dateien auch direkt mit PocketBase bereitstellen, indem Sie sie in den pb_public-Ordner legen,
00:06:44und das wäre nützlich für etwas wie ein React-Frontend. Alternativ können Sie auch
00:06:49dynamische Routen mit Template-Rendering hosten, und das wäre perfekt für Dinge wie E-Mail-Vorlagen. Wenn Sie also
00:06:54eine Single-Box-Einrichtung möchten, dann tun Sie es so. Nun, die große Frage: Ist das produktionsbereit?
00:06:59Nun, es enthält alle Funktionen, die Sie benötigen, um eine moderne SaaS-App zu bauen, insbesondere die
00:07:04Produktionsfunktionen wie Migrationen und Logging. Es ist auch vollständig erweiterbar, Sie sind also nicht nur
00:07:09auf die Standards beschränkt. Aber der große Haken ist, dass dies vor der v1 ist, also sagen sie ausdrücklich, man solle dies nur verwenden,
00:07:15wenn man damit einverstanden ist, Changelogs zu lesen und von Zeit zu Zeit manuelle Migrationen durchzuführen. Aber wenn das
00:07:20auf Sie zutrifft, dann los, Sie können einfach das erste Single-File-Einhorn bauen. Sie können mehr über PocketBase
00:07:25erfahren, indem Sie sich die relevanten Links unten in der Beschreibung ansehen. Und wenn Sie Open-Source-Alternativen lieben,
00:07:29dann schauen Sie sich unser Video über OpenCode an, die Open-Source-Alternative zu Claude Code. Ich war Warren von
00:07:35Better Stack, danke fürs Zuschauen und natürlich sehen wir uns beim nächsten Mal.