Membawa aplikasi fullstack ke production: memahami konsep environments, membangun pipeline CI/CD dengan GitHub Actions, deployment ke Vercel, serta menangani migration database dengan aman saat deploy.

Kode yang berjalan di mesin kalian belum berarti apa-apa — sampai ia mencapai pengguna. Episode ini membahas deployment & CI/CD: tiga hal yang mengubah kode lokal menjadi produk hidup — environment yang terpisah, pipeline yang menguji otomatis, dan proses deploy yang tidak membuat orang panik.
Di episode 2 kita memilih Next.js server-rendered. Sekarang waktunya mengirimnya ke dunia: Vercel sebagai platform (atau alternatifnya), dengan GitHub Actions sebagai pipeline.
Jangan pernah deploy langsung ke production. Tiga environment standar:
| Environment | Tujuan | Siapa yang melihat | Database |
|---|---|---|---|
| Development | Mengembangkan fitur | Developer lokal | DB lokal |
| Staging | Menyamakan production | Tim & QA | DB staging (salinan) |
| Production | Melayani pengguna | Semua | DB production |
Kunci utamanya: konfigurasi terpisah, kode sama. Selisih antara staging dan production hanyalah environment variables (DATABASE_URL, secrets) — bukan kode yang berbeda. Dengan begitu, apa pun yang lolos di staging besar kemungkinannya aman di production.
Note
Variabel yang wajib berbeda antar environment: DATABASE_URL, AUTH_SECRET, STORAGE_*, dan URL aplikasi. Simpan di platform (Vercel settings atau GitHub secrets) — bukan di repo. Referensi lengkap: .env.example di repo kalian.
CI (Continuous Integration): setiap push diuji otomatis. CD (Continuous Deployment): jika lolos, perubahan terdeploy otomatis. Pipeline GitHub Actions kita akan menjalankan tiga tahap:
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: 20
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm vitest run
- run: pnpm buildpnpm install --frozen-lockfile memastikan dependensi persis dari pnpm-lock.yaml, lalu lint, unit test, dan build dijalankan berurutan. Jika salah satu gagal, PR tidak boleh merge — inilah nilai CI yang sesungguhnya.
Vercel mendeteksi Next.js secara otomatis. Setup manual singkat:
Setiap push ke main membuat production deployment; setiap PR membuat preview deployment terpisah. Konfigurasi framework-nya:
{
"framework": "nextjs",
"buildCommand": "pnpm build",
"installCommand": "pnpm install --frozen-lockfile"
}Momen paling menegangkan: perubahan skema harus diterapkan ke database produksi tanpa downtime. Prisma memberikan alat yang tepat — migrate deploy:
- run: pnpm prisma migrate deploy
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
- run: pnpm prisma generate
- run: pnpm buildAturan yang wajib dihormati:
migrate dev hanya di development — di production pakai migrate deploy.Warning
Migrasi yang menghancurkan data (drop kolom, rename tanpa memikirkan kode lama) adalah penyebab umum downtime. Alur aman: deploy kode baru yang kompatibel dengan skema lama → jalankan migration → deploy kode yang memakai kolom baru. Pisahkan dua langkah ini saat perubahan besar.
Deploy yang gagal bukan masalah — masalah adalah tidak punya rencana saat itu terjadi. Dua strategi dasar:
const showNewUI = await prisma.featureFlag.findUnique({
where: { key: "new-note-ui" },
})
return showNewUI?.enabled ? <NewNoteUI /> : <LegacyNoteUI />Feature flag memberi kalian saklar darurat — kalian bisa menonaktifkan fitur bermasalah dalam detik, tanpa deploy.
Selesaikan dengan urutan berikut:
.github/workflows/ci.yml seperti di atas dan push — pipeline harus hijau.prisma migrate deploy sebagai tahap deploy (untuk penyedia yang mendukung akses DB).pnpm buildInti yang harus dibawa pulang:
main, preview per PR.migrate deploy untuk production; migration harus backward compatible.Di episode 18 selanjutnya kita membahas serverless & edge fullstack — edge functions, serverless, dan deployment global — untuk menghadirkan aplikasi lebih dekat ke pengguna. Sampai jumpa di episode 18!