# 🗄️ Panduan Migrasi & Backup Database

Aplikasi bawaan pakai **SQLite** (satu file `prisma/dev.db`, tanpa server DB).
Dokumen ini menjelaskan cara **pindah ke PostgreSQL**, **backup**, dan
**pindah data lama**.

---

## 1. Kapan Perlu Pindah ke PostgreSQL?

| Pakai SQLite (bawaan) kalau… | Pakai PostgreSQL kalau… |
|---|---|
| Jalan di 1 komputer / 1 VPS | Hosting serverless (Vercel/Netlify) |
| Data tidak terlalu besar | Banyak pengguna bersamaan / data besar |
| Ingin simpel, tanpa server DB | Butuh backup & skala yang andal |

SQLite sudah cukup untuk operasional harian. Pindah ke PostgreSQL hanya jika
salah satu kondisi kanan terpenuhi.

---

## 2. Migrasi SQLite → PostgreSQL

> Prisma menyimpan migrasi **khusus per jenis database**. Migrasi SQLite yang ada
> **tidak bisa langsung** dipakai di PostgreSQL. Karena itu langkahnya adalah
> membuat ulang migrasi untuk PostgreSQL (struktur/skema sama persis, hanya
> SQL-nya menyesuaikan). Data lama dipindah terpisah (lihat bagian 4).

### Langkah 1 — Siapkan PostgreSQL
- **Cloud (mudah):** buat di Neon / Supabase / Railway → salin connection string.
- **Lokal (Docker):**
  ```bash
  docker run --name telur-pg -e POSTGRES_PASSWORD=pass \
    -e POSTGRES_DB=telur -p 5432:5432 -d postgres:16
  ```

### Langkah 2 — Ubah `prisma/schema.prisma`
```prisma
datasource db {
  provider = "postgresql"   // sebelumnya "sqlite"
  url      = env("DATABASE_URL")
}
```

### Langkah 3 — Set `DATABASE_URL` di `.env`
```
# Contoh lokal Docker:
DATABASE_URL="postgresql://postgres:pass@localhost:5432/telur?schema=public"

# Contoh cloud (Neon/Supabase) — biasanya butuh sslmode=require:
# DATABASE_URL="postgresql://user:pass@host:5432/telur?sslmode=require"
```

### Langkah 4 — Buat ulang migrasi untuk PostgreSQL
Karena pindah jenis database, ganti folder migrasi lama dengan yang baru:
```bash
# Hentikan dulu server dev bila jalan (npm run dev)

# Hapus migrasi SQLite lama (struktur akan dibuat ulang untuk Postgres)
rm -rf prisma/migrations        # Windows: rmdir /s /q prisma\migrations

# Buat migrasi awal untuk PostgreSQL + terapkan
npm run db:migrate -- --name init_postgres
# (atau: npx prisma migrate dev --name init_postgres)

# Isi data awal
npm run db:seed
```

> **Catatan kolom JSON:** beberapa kolom (`beforeData`, `afterData`,
> `proposedChange`, `polygonGeojson`) disimpan sebagai **String** demi
> kompatibilitas SQLite. Di PostgreSQL boleh dipromosikan ke tipe `Json` bila
> diinginkan (opsional, tidak wajib).

### Langkah 5 — Verifikasi
```bash
npm run db:studio     # buka GUI, pastikan tabel & data ada
npm run dev           # coba login superadmin@telur.local / password123
```

---

## 3. Backup Database

### SQLite (bawaan) — semudah menyalin file
File database ada di `prisma/dev.db`. Backup = salin file itu.
```bash
# Backup (beri nama sesuai tanggal)
cp prisma/dev.db backup-2026-07-07.db      # Windows: copy prisma\dev.db backup-2026-07-07.db

# Restore
cp backup-2026-07-07.db prisma/dev.db
```
> Sebaiknya hentikan aplikasi saat menyalin agar file tidak sedang ditulis.

### PostgreSQL — pakai `pg_dump`
```bash
# Backup ke file .sql
pg_dump "postgresql://user:pass@host:5432/telur" > backup-2026-07-07.sql

# Restore
psql "postgresql://user:pass@host:5432/telur" < backup-2026-07-07.sql
```
Penyedia cloud (Neon/Supabase) biasanya juga punya **backup otomatis** di
dashboard mereka — aktifkan.

### Backup terjadwal (VPS, otomatis harian)
Tambahkan ke `crontab -e` (contoh SQLite, tiap hari jam 2 pagi):
```
0 2 * * * cp /path/distribusi-telur/prisma/dev.db /path/backup/telur-$(date +\%F).db
```

---

## 4. Memindahkan DATA LAMA (SQLite → PostgreSQL)

Langkah di bagian 2 membuat database Postgres **kosong** (lalu di-seed data
contoh). Kalau Anda sudah punya data asli di SQLite yang ingin dibawa:

**Opsi termudah — lewat Prisma Studio (data sedikit):**
1. Buka data lama: `npm run db:studio` (saat masih SQLite) → catat/ekspor.
2. Setelah pindah ke Postgres, masukkan ulang lewat aplikasi / Studio.

**Opsi otomatis — `pgloader` (data banyak):**
`pgloader` bisa menyalin isi SQLite langsung ke PostgreSQL:
```bash
pgloader ./prisma/dev.db postgresql://user:pass@host:5432/telur
```
> Setelah pindah, jalankan `npm run db:migrate` untuk memastikan struktur sinkron,
> dan cek data lewat `npm run db:studio`. Uji dulu di database percobaan sebelum
> ke database produksi.

---

## 5. Kembali ke SQLite (kalau perlu)
Balik `provider` ke `"sqlite"` di `schema.prisma`, set `DATABASE_URL="file:./dev.db"`
di `.env`, ganti folder `prisma/migrations` ke versi SQLite, lalu `npm run setup`.

---

## Ringkasan Perintah

| Tujuan | Perintah |
|---|---|
| Terapkan migrasi | `npm run db:migrate` |
| Isi data contoh | `npm run db:seed` |
| Reset total (hapus + isi ulang) | `npm run db:reset` |
| Buka GUI database | `npm run db:studio` |
| Backup SQLite | salin `prisma/dev.db` |
| Backup PostgreSQL | `pg_dump ... > file.sql` |
