Cara self host Turso LibSQL Server di Kubernetes

Apa itu Libsql?

Aplikasi yang saya host baik di Homelab atau di Fly.io sebagian besar menggunakan sqlite sebagai database karena saya tidak ingin repot setup database server. Setup saya sebelum-nya banyak menggunakan Litestream backup ke Cloudflare R2, namun kekurangan-nya hanya 1 instance dari aplikasi kita yang bisa akses database dalam 1 waktu, ini memang kekurangan dari sqlite.

Libsql memberikan solusi sqlite lewat http server yang memungkinkan lebih dari 1 instance server yang akses database secara bersamaan. Misal aplikasi kita punya web server dan worker pada container yang terpisah namun meng-akses database yang sama.

Itu kenapa saya tertarik ngoprek Libsql ini untuk dipasang di Homelab, apalagi setelah Turso mengumumkan dukungan library Libsql client untuk Laravel, karena dengan library ini saya tidak perlu repot berurusan dengan custom php extension.

Membuat Statefulset

Untuk deploy libsql berikut adalah statefulset yang saya gunakan terdiri dari container libsql-server dan pvc-nya.

1apiVersion: apps/v1
2kind: StatefulSet
3metadata:
4 name: libsql-demo-1
5 namespace: default
6spec:
7 serviceName: libsql-demo
8 replicas: 1
9 selector:
10 matchLabels:
11 app: libsql-demo
12 template:
13 metadata:
14 labels:
15 app: libsql-demo
16 spec:
17 containers:
18 - name: libsql
19 image: ghcr.io/tursodatabase/libsql-server:v0.24.31
20 command: ["/bin/sqld"]
21 args:
22 - "--http-listen-addr"
23 - "127.0.0.1:8081"
24 - "--admin-listen-addr"
25 - "127.0.0.1:8080"
26 - "--enable-namespaces"
27 ports:
28 - containerPort: 8080
29 - containerPort: 8081
30 env:
31 - name: SQLD_NODE
32 value: primary
33 volumeMounts:
34 - name: data
35 mountPath: /var/lib/sqld
36 volumeClaimTemplates:
37 - metadata:
38 name: data
39 spec:
40 accessModes: ["ReadWriteOnce"]
41 storageClassName: openebs-hostpath
42 resources:
43 requests:
44 storage: 512Mi

Dari entrypoint container libsql dapat dilihat kalau server expose beberapa port antara lain

disamping itu ada argument tambahan --enable-namespaces untuk enable namespace, yang memungkinkan instance server ini bisa me-manage beberapa database sekaligus.

Membuat Namespace

Jika server sudah berjalan, kita bisa memuat beberapa namespace baru misalkan setiap project kita memiliki database sendiri.

1curl -X POST \
2 -H "Content-Type: application/json" \
3 -d {} \
4 http://localhost:8080/v1/namespaces/db1/create

Tes koneksi dengan Database

Sekarang kita bisa menyambungkan aplikasi dengan database db1 yang sudah dibuat. Saya membuat script sederhana dengan Deno dan Drizzle ORM, code-nya bisa di contoh di repo ini.

Seperti dijelaskan disini, untuk akses db1 yang dimanage lewat namespace kita perlu menggunakan custom host, agar gak ribet setup dns saya pakai nip.io.

1export DATABASE_URL=http://db1.127-0-0-1.nip.io:8081

alamat diatas akan resolve ke 127.0.0.1 dan libsql akan mendapatkan nama database db1, kemudian coba kita eksekusi database migration

1jimbo@nobarapc:~/.../libsql-client$ deno -A --node-modules-dir npm:drizzle-kit migrate
2No config path provided, using default 'drizzle.config.ts'
3Reading config file '/home/jimbo/clones/labs/try/libsql-client/drizzle.config.ts'
4[✓] migrations applied successfully

Migrate berhasil dan coba kita lakukan select data sederhana dari table yang sudah dibuat

1jimbo@nobarapc:~/.../libsql-client$ deno run -A src/main.ts
2{ result: [] }

Akses melalui DBeaver

Jika perlu akses database yang ada di libsql melalui GUI client salah satu aplikasi yang disarankan dari turso adalah DBeaver.

Akses dari DBeaver

Jadi sekian sesi ngoprek Libsql kali ini, server ini akan saya pakai untuk dev dan testing, sedangkan kalau production akan pakai dari Turso platform.