Skip to main content

Database Setup — PlanetScale Postgres

PlanetScale menyediakan Postgres yang di-manage dengan fitur branching, connection pooling bawaan (PgBouncer), dan dashboard monitoring. Project Cekolah menggunakan Drizzle ORM dengan adapter postgres-js.

Alur Koneksi

PlanetScale Dashboard
  └── Buat Role (user database)
        └── Dapat connection string
              └── Tambah ke .env / Vercel Environment Variables
                    └── Drizzle ORM konek via postgres-js

Langkah 1 — Buat Role di PlanetScale

Saat kamu membuka “Connect to your database”, PlanetScale meminta kamu membuat Role terlebih dahulu.

Apa itu Role?

Role adalah user/akun yang digunakan aplikasimu untuk login ke database. Setiap role punya:
  • Password sendiri
  • Izin (permissions) yang bisa dikustomisasi
  • Branch yang bisa diakses (misal: main, staging)

Pilihan Role

PilihanKeterangan
User-defined roleKamu pilih sendiri permission apa yang diberikan ✅ Direkomendasikan
Default rolePlanetScale pilihkan permission standar secara otomatis

Permission yang Perlu Diceklis

Untuk production app, cukup centang dua ini:
PermissionFungsiWajib?
pg_read_all_dataBaca data dari semua tabel, view, sequenceYa
pg_write_all_dataTulis data ke semua tabel, view, sequenceYa
pg_read_all_settingsBaca config variable PostgresTidak perlu
pg_read_all_statsBaca pg_stat_* viewsTidak perlu
pg_stat_scan_tablesMonitoring scan tabelTidak perlu
pg_monitorBaca semua monitoring viewsTidak perlu
pg_signal_backendCancel/terminate query session lainTidak perlu
pg_checkpointJalankan CHECKPOINTTidak perlu
pg_maintainVACUUM, ANALYZE, REINDEXTidak perlu
pg_use_reserved_connectionsPakai reserved connection slotsTidak perlu
pg_create_subscriptionBuat subscription (replication)Tidak perlu
postgresSuperuser — bisa hapus tabel/databaseJangan dicentang
Jangan centang postgres (superuser). Ini memberi akses penuh termasuk bisa menghapus seluruh database. Berbahaya untuk production.

Query Safety (pg_strict)

Di bagian bawah form ada Query Safety dengan dua opsi:
SettingFungsiRekomendasi
require_where_on_updateBlokir UPDATE tanpa WHERE clausewarn atau on untuk prod
require_where_on_deleteBlokir DELETE tanpa WHERE clausewarn atau on untuk prod
Set ke warn dulu saat development — query bermasalah tetap jalan tapi ada warning. Set ke on di production untuk keamanan ekstra.

Langkah 2 — Dapatkan Connection String

Setelah role dibuat, PlanetScale akan menampilkan connection string. Ada dua tipe:

Connection String (langsung ke database)

postgresql://USERNAME:PASSWORD@HOST/DATABASE?sslmode=require

Pooled Connection String (via PgBouncer) — Direkomendasikan

postgresql://USERNAME:PASSWORD@HOST/DATABASE?sslmode=require&pgbouncer=true
Project Cekolah menggunakan konfigurasi 2 koneksi di production, 10 di development (lihat packages/database/src/index.ts). Gunakan pooled connection untuk production agar lebih efisien.

Langkah 3 — Tambah ke Environment Variables

Untuk Development Lokal

Edit file .env di root project:
DATABASE_URL="postgresql://USERNAME:PASSWORD@HOST/DATABASE?sslmode=require"
Jangan pernah commit file .env ke git. Pastikan .env ada di .gitignore.

Untuk Production di Vercel

  1. Buka Vercel Dashboard → pilih project kamu
  2. Masuk ke SettingsEnvironment Variables
  3. Tambah variable:
    • Key: DATABASE_URL
    • Value: Connection string dari PlanetScale
    • Environment: Centang Production, Preview, dan Development
  4. Klik Save
  5. Redeploy project agar variable aktif

Langkah 4 — Verifikasi Koneksi

Setelah environment variable ditambah, verifikasi koneksi dengan menjalankan Drizzle Studio:
bun run db:studio
Jika berhasil, browser akan terbuka menampilkan tabel-tabel database kamu.

Troubleshooting

Error: SSL connection required

Pastikan connection string mengandung ?sslmode=require di bagian akhir.

Error: too many connections

PlanetScale punya batas koneksi per plan. Gunakan pooled connection string (PgBouncer) untuk production. Project ini sudah dikonfigurasi dengan max: 2 untuk production.

Error: password authentication failed

  • Pastikan kamu copy password dengan benar saat role dibuat (PlanetScale hanya menampilkan password sekali)
  • Buat role baru jika lupa password

Migrations tidak jalan

Pastikan role memiliki permission pg_write_all_data. Drizzle migration butuh akses tulis untuk membuat/mengubah tabel.

Referensi