PocketBase adalah project open source backend dengan fitur embedded SQLite, real-time database, file storage, dan autentikasi bawaan. PocketBase merupakan alternatif dari Supabase, yang merupakan alternatif dari Firebase, yang juga merupakan alternatif dari membuat infrastruktur back end sendiri from scratch.
PocketBase, tidak seperti base-base lainnya, berbasis binary. Hal tersebut membuat PocketBase sangat mudah untuk di self-host. Saat ini Official PocketBase Release tersedia dalam 3 OS yang umum digunakan yakni linux, windows, dan MacOS.
Untuk menjalankan PocketBase kamu cukup mendownload binary dari https://pocketbase.io/docs/ sesuai dengan OS yang kamu gunakan lalu jalankan command
./pocketbase serve
Server PocketBase akan menyala di http://127.0.0.1:8090 by default. Setelah menyala, PocketBase memiliki admin dashboard bawaan yang dapat diakses melalui http://127.0.0.1:8090/_/ di browser. Saat pertama kali membuka admin dashboard kamu akan diminta membuat akun super admin.
Gambar 1. Tampilan PocketBase admin dashboard
Melalui admin dashboard ini, kamu dapat membuat “collection” yang dapat dianalogikan sebagai tabel pada database berbasis sql. Semua collection yang kamu buat akan otomatis dapat diakses melalui api pada http://127.0.0.1:8090/api/ . Untuk melihat preview api kamu dapat klik tombol API Preview di sudut kanan atas. Selain melalui REST API, PocketBase juga memiliki SDK JavaScript dan Dart untuk menghubungkan dengan front end. Berikut merupakan contoh implementasi SDK JavaScript pada Vite JS (React + JSX).
// src/PocketBaseService.js import PocketBase from 'pocketbase'; const pb = new PocketBase('http://127.0.0.1:8090'); export const getUsers = async () => { return await pb.collection('users').getFullList(); }; export const createUser = async (user) => { return await pb.collection('users').create(user); };
// src/App.jsx import React, { useEffect, useState } from 'react'; import { getUsers, createUser } from './PocketBaseService'; function App() { const [users, setUsers] = useState([]); useEffect(() => { getUsers().then(data => setUsers(data)); }, []); const handleAddUser = async () => { const user = { name: 'User Baru' }; await createUser(user); setUsers(await getUsers()); }; return ( <div> <h1>Daftar Pengguna</h1> <ul> {users.map(user => ( <li key={user.id}>{user.name}</li> ))} </ul> <button onClick={handleAddUser}>Tambah Pengguna</button> </div> ); } export default App;
Bonus tips:
Pocketbase serve, selain menjalankan server pocketbase juga akan menjalankan file statis yang ada pada pb_public. Kita bisa memanfaatkan fitur ini untuk menjalankan file front end yang sudah dicompile, contohnya dengan menjalankan npm run build pada Vite JS. Berikut contoh Dockerfile sederhana untuk dockerize Vite JS dan PocketBase
FROM node:18-alpine AS build-stage WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build FROM alpine:3.14 AS runtime-stage RUN apk add --no-cache wget unzip WORKDIR /pb RUN wget https://github.com/pocketbase/pocketbase/releases/download/v0.22.12/pocketbase_0.22.12_linux_amd64.zip && \ unzip pocketbase_0.22.12_linux_amd64.zip && \ rm pocketbase_0.22.12_linux_amd64.zip COPY ./pb/pb_migrations /pb/pb_migrations VOLUME /pb/pb_data COPY --from=build-stage /app/dist /pb/pb_public EXPOSE 8090 CMD ["sh", "-c", "./pocketbase serve --http 0.0.0.0:8090"]