Diese kostenlose Go-Alternative zu Firebase besteht aus nur einer Datei

BBetter Stack
컴퓨터/소프트웨어창업/스타트업AI/미래기술

스크립트

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.

핵심 요약

PocketBase bietet als kompaktes Open-Source-Backend in einer einzelnen Datei eine kostengünstige, selbst gehostete Alternative zu Firebase, die trotz fehlendem v1-Status produktionsreife Funktionen wie Echtzeit-Synchronisation und erweiterbare Hooks besitzt.

하이라이트

  • PocketBase ist eine einzelne Go-Binary mit eingebettetem SQLite, die Echtzeit-Datenbank, Authentifizierung und Dateispeicherung bietet.

  • Über 82 Hooks in Go oder JavaScript erlauben die Erweiterung der Backend-Funktionalität, etwa für automatisierte E-Mails bei Datensatz-Erstellungen.

  • Der Zugriff auf die Datenbank erfolgt direkt vom Frontend über ein JavaScript-SDK, ähnlich wie bei Firebase oder Supabase.

  • Daten und Dateien werden persistent im Ordner pb_data gespeichert, was eine solide Backup-Strategie anstelle einer reinen Ein-Datei-Lösung erforderlich macht.

  • Im Vergleich zu Managed-Diensten wie Supabase, bei denen Kosten bei 25 Dollar beginnen, fallen bei PocketBase lediglich VPS-Kosten ab circa vier Dollar an.

타임라인

Architektur und Grundkonzept

  • PocketBase ist eine Open-Source-Alternative zu Firebase oder Supabase als einzelne Go-Binary.
  • Die Architektur basiert auf einer eingebetteten SQLite-Datenbank.
  • Das Backend ist über JavaScript und TypeScript erweiterbar.

Die Software kombiniert Echtzeit-Datenbank, Authentifizierung und Dateispeicherung in einer einzigen Datei. Eine Admin-Benutzeroberfläche ermöglicht die Konfiguration von Datensammlungen analog zu bekannten Cloud-Plattformen. Der Zugriff erfolgt direkt über ein JavaScript-SDK vom Frontend aus, wobei API-Regeln die Sicherheit der Datenbankzugriffe gewährleisten.

Frontend-Integration und API-Regeln

  • Das Web-Frontend interagiert über eine PocketBase-Instanz mit dem Backend.
  • Die Authentifizierung erfolgt über den pb.authStore, der den angemeldeten Benutzer verwaltet.
  • Echtzeit-Aktualisierungen des Status werden durch Listener bei Änderungen im Auth-Store oder durch Subscriptions bei Sammlungen erreicht.
  • API-Regeln steuern den Zugriff auf Sammlungen, beispielsweise durch Validierung der Benutzer-ID.

In einer React-Anwendung wird die PocketBase-Klasse instanziiert, um Verbindungen zum Backend herzustellen. Änderungen an Daten, etwa das Verschieben von Aufgaben in einem Bug-Tracker, werden durch die `subscribe`-Funktion in Echtzeit im Frontend reflektiert. Sicherheitseinstellungen werden direkt in der Admin-Oberfläche über den Tab 'API Rules' konfiguriert, wobei Muster wie `request.auth.id` den Datenzugriff basierend auf der Benutzer-ID einschränken.

Erweiterbarkeit durch Hooks

  • Das Backend lässt sich über 82 verschiedene Hooks in Go oder JavaScript erweitern.
  • TypeScript-Code muss für die Verwendung in PocketBase zu JavaScript kompiliert werden.
  • Beispiel-Hooks ermöglichen Aktionen wie das Senden von E-Mails bei Erstellung neuer Datensätze.

Für Anforderungen, die über die Standardfunktionen hinausgehen, bietet PocketBase ein Hooks-System. Diese greifen bei Ereignissen wie Anwendungsstart (`onBootstrap`) oder Datenbankänderungen (`onRecordCreate`). Entwickler hinterlegen diese Hooks im `pb_hooks`-Ordner, um benutzerdefinierte Logik, wie beispielsweise automatische E-Mail-Benachrichtigungen, direkt im Backend auszuführen.

Persistenz, Kosten und Produktionsreife

  • Hosting auf einem VPS mit persistentem Speicher ist für den Betrieb von PocketBase notwendig.
  • Datenbank und hochgeladene Dateien befinden sich im `pb_data`-Ordner.
  • Die Betriebskosten beschränken sich auf die VPS-Gebühren, die bei etwa vier Dollar starten.
  • Der aktuelle Entwicklungsstand liegt vor der Version 1.0, was manuelle Migrationen erfordern kann.

Da PocketBase auf SQLite basiert, erfordert der Einsatz ein persistentes Dateisystem, weshalb ephemere Cloud-Umgebungen wie Heroku ungeeignet sind. Die gesamte Anwendung kann samt statischer Dateien über den `pb_public`-Ordner bereitgestellt werden. Trotz des Status vor der v1.0 sind alle für SaaS-Apps relevanten Funktionen wie Migrationen, Job-Scheduling und Logging vorhanden, erfordern jedoch aufgrund der fehlenden v1-Stabilität unter Umständen manuelle Wartungsschritte bei Updates.

커뮤니티 글

모든 글 보기