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
| Pilihan | Keterangan |
|---|
| User-defined role | Kamu pilih sendiri permission apa yang diberikan ✅ Direkomendasikan |
| Default role | PlanetScale pilihkan permission standar secara otomatis |
Permission yang Perlu Diceklis
Untuk production app, cukup centang dua ini:
| Permission | Fungsi | Wajib? |
|---|
✅ pg_read_all_data | Baca data dari semua tabel, view, sequence | Ya |
✅ pg_write_all_data | Tulis data ke semua tabel, view, sequence | Ya |
❌ pg_read_all_settings | Baca config variable Postgres | Tidak perlu |
❌ pg_read_all_stats | Baca pg_stat_* views | Tidak perlu |
❌ pg_stat_scan_tables | Monitoring scan tabel | Tidak perlu |
❌ pg_monitor | Baca semua monitoring views | Tidak perlu |
❌ pg_signal_backend | Cancel/terminate query session lain | Tidak perlu |
❌ pg_checkpoint | Jalankan CHECKPOINT | Tidak perlu |
❌ pg_maintain | VACUUM, ANALYZE, REINDEX | Tidak perlu |
❌ pg_use_reserved_connections | Pakai reserved connection slots | Tidak perlu |
❌ pg_create_subscription | Buat subscription (replication) | Tidak perlu |
❌ postgres | Superuser — bisa hapus tabel/database | Jangan 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:
| Setting | Fungsi | Rekomendasi |
|---|
require_where_on_update | Blokir UPDATE tanpa WHERE clause | warn atau on untuk prod |
require_where_on_delete | Blokir DELETE tanpa WHERE clause | warn 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
- Buka Vercel Dashboard → pilih project kamu
- Masuk ke Settings → Environment Variables
- Tambah variable:
- Key:
DATABASE_URL
- Value: Connection string dari PlanetScale
- Environment: Centang
Production, Preview, dan Development
- Klik Save
- Redeploy project agar variable aktif
Langkah 4 — Verifikasi Koneksi
Setelah environment variable ditambah, verifikasi koneksi dengan menjalankan Drizzle 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