Nextjs Environment Variables Runtime Deployment Considerations
Selesai membaca dokumentasi ini?
Kembali ke rujukan utama Next.js untuk melanjutkan topik lainnya.
Kembali ke rujukan utama Next.js untuk melanjutkan topik lainnya.
Di Next.js, environment variables dipakai untuk memisahkan konfigurasi dari kode. Pola ini penting karena nilai yang sama bisa dipakai di lingkungan berbeda: local development, preview, staging, dan production.
Topik ini biasanya menyangkut tiga pertanyaan utama:
Kalau tiga hal ini dicampur, hasilnya sering terlihat normal di local, lalu pecah setelah deploy.
Server-only env vars adalah variabel yang hanya boleh dipakai di sisi server. Contohnya:
Di Next.js, variabel seperti ini biasanya diakses lewat process.env.NAMA_VARIABEL dari kode server, misalnya di Server Component, Route Handler, Server Action, atau helper yang hanya dieksekusi di server.
Contoh:
const dbUrl = process.env.DATABASE_URLPrinsipnya sederhana: kalau nilainya sensitif atau punya akses ke sistem backend, jangan pernah dianggap aman untuk client bundle.
Public env vars adalah variabel yang sengaja diekspos ke browser. Di Next.js, pola umumnya memakai prefix NEXT_PUBLIC_.
Contoh:
const analyticsId = process.env.NEXT_PUBLIC_ANALYTICS_IDNilai dengan prefix ini bisa masuk ke JavaScript bundle client saat build. Artinya:
Aturan praktisnya:
Ini bagian yang paling sering bikin salah paham.
Sebagian env var dibaca saat proses build, lalu nilainya disalin ke hasil bundle atau ke kode yang sudah di-compile. Ini umum untuk:
NEXT_PUBLIC_* yang dipakai di client componentKonsekuensinya:
Env var dibaca saat runtime ketika kode benar-benar berjalan di server. Ini biasanya terjadi pada:
process.env saat request datangKeuntungan runtime read:
Batas pentingnya:
NEXT_PUBLIC_*: biasanya terkunci saat buildDiagram ini menunjukkan kenapa satu variabel bisa berperilaku berbeda tergantung tempat dipakai.
// lib/database.ts
export function getDatabaseUrl() {
const url = process.env.DATABASE_URL
if (!url) {
throw new Error('DATABASE_URL belum diset')
}
return url
}Pola seperti ini aman selama fungsi dipanggil dari server-only path.
// app/layout.tsx atau client component
const analyticsId = process.env.NEXT_PUBLIC_ANALYTICS_IDPakai ini hanya kalau nilainya memang boleh dilihat publik. Jangan simpan token akses di sini.
const requiredEnv = ['DATABASE_URL', 'JWT_SECRET'] as const
for (const key of requiredEnv) {
if (!process.env[key]) {
throw new Error(`Environment variable ${key} belum diset`)
}
}Validasi seperti ini membantu fail fast saat build atau startup, jadi masalah tidak baru muncul setelah user kena error.
Platform deployment biasanya memberi environment berbeda untuk branch preview, staging, dan production. Jangan asumsi semua deployment memakai nilai yang sama.
Hal yang perlu dicek:
DATABASE_URL sendiriNEXT_PUBLIC_* sudah diset di semua environment yang butuhKalau env dibaca saat build, variabel itu harus sudah ada sebelum command build berjalan.
Kasus umum:
Tidak semua platform memperlakukan runtime env dengan cara yang sama. Ada yang menyuntikkan env saat container start, ada yang memaketkan nilai lebih awal.
Implikasinya:
Kalau route atau middleware berjalan di Edge Runtime, asumsi terhadap process.env dan akses Node.js bisa berbeda dibanding Node runtime.
Artinya:
Perubahan env tidak selalu langsung terlihat karena masih ada:
Kalau mengubah env dan perilaku tidak ikut berubah, cek apakah artefak yang berjalan benar-benar hasil build baru.
process.env dibaca runtimeIni jebakan paling umum. Tidak semua env tetap dinamis setelah deploy. Kalau sudah diinlin ke client bundle, nilainya ikut build.
NEXT_PUBLIC_*Begitu prefix ini dipakai, anggap nilainya publik. Jangan menyimpan credential, token, atau private key di sana.
Kalau variabel dipakai saat build, update env saja tidak cukup. Artefak lama masih membawa nilai lama.
Biasanya karena:
.env.local ada di laptop, tapi tidak diset di platformSatu variabel dipakai oleh client component dan server helper sekaligus. Akibatnya developer sering “membuka” secret ke client supaya error hilang. Itu solusi yang salah.
Pola yang lebih sehat:
Kalau env wajib tidak divalidasi lebih awal, error sering baru muncul saat request pertama datang. Itu bikin debugging lebih mahal.
NEXT_PUBLIC_* hanya untuk data yang aman dibaca browsernext buildKalau topik ini dipakai sebagai pegangan produksi, biasakan melihat dua pertanyaan dulu:
Kalau dua pertanyaan itu dijawab dengan benar, sebagian besar bug environment di Next.js biasanya langsung ketahuan sebelum masuk ke production.