Deploy dan Environment Variable — dari Berjalan di Komputer Sendiri sampai Dipublikasikan

Artikel ini adalah bagian dari kursus Dasar-Dasar Teknologi Informasi, yang membangun dari nol pengetahuan TI praktis yang minimal kamu butuhkan untuk memprogram dan melakukan vibe coding.
Penyebab aplikasi yang berjalan di komputer kamu tetapi gagal setelah dipublikasikan ada di luar kode. Diagram memperlihatkan 3 tahap build, deploy, dan rilis, serta environment variable yang menukar nilai per lingkungan.

Artikel ini membahas deploy, yaitu langkah-langkah membawa aplikasi yang sudah berjalan di komputer kamu sampai dipublikasikan, dan environment variable yang menukar nilai sesuai tujuan publikasinya.

app.js yang sama berjalan di 2 tempat: komputer kamu dan server publik.

Kalau di komputer kamu berjalan tetapi di server publik tidak, penyebabnya ada di luar kode.

Satu app.js berjalan di 2 tempat
app.jsyang ditulis satuJalankan langsungnode app.jsDeploybuild→deploy→rilisKomputer kamulocalhost:3000Server publikmy-app.example.comHanya kamuSiapa saja
app.js yang kamu tulis hanya satu file. Jalur atas menjalankannya apa adanya di komputer kamu, jalur bawah men-deploy-nya lalu menjalankannya di server publik. Ujung kanan adalah siapa yang bisa membuka URL itu.

Perbedaan 2 tempat inilah alasan aplikasi berhenti bekerja setelah dipublikasikan.

Deploy terdiri atas 3 tahap: build, deploy, dan rilis

Pekerjaan menaruh aplikasi di server publik supaya siapa saja bisa memakainya adalah deploy, dan isinya terdiri atas 3 tahap: build, deploy, dan rilis.

Tiga tahap deploy, dan yang terlihat kalau salah satunya gagal
BuildDeployRilisKumpulkan app.jsdan file pendukungKirim ke serverpublik, jalankanTerima requestdi URLFolder hasil buildmy-app berjalanmy-app.example.comterbukaDeploy tidak jalanBerhenti di startHasil build lama
Baca dari atas ke bawah. Kolom kiri adalah tahapnya, dua kolom tengah adalah yang dikerjakan di sana dan yang dihasilkan, dan kolom kanan adalah yang terlihat kalau tahap itu gagal.

Tahap pertama adalah build, yaitu pekerjaan mengumpulkan app.js dan file yang diperlukan menjadi bentuk yang bisa dijalankan di server publik, dan kumpulan file yang dihasilkan adalah hasil build (build output).

Yang dikumpulkan build menjadi satu, dan yang tidak masuk hasil build
app.jskamu yang menulisLibrary eksternalkode orang lainFile pengaturankomputer kamu sajaBuildFolder hasil builddikirim ke serverTetap di komputertidak dikirim
app.js dan library eksternal disatukan menjadi satu hasil build, lalu dikirim ke server publik. File pengaturan yang hanya dipakai di komputer kamu tidak ikut dikumpulkan dan tetap tinggal di komputer kamu.

File pengaturan yang hanya dipakai di komputer kamu tidak masuk ke hasil build dan tetap tinggal di komputer kamu.

Yang sampai ke server publik hanya hasil build yang sudah dikumpulkan.

Mengembalikannya ke hasil build sebelumnya adalah rollback.

Kata deploy kadang merujuk hanya ke tahap tengah, kadang ke ketiga tahapnya sekaligus.

Ada juga sebutan CI/CD (Continuous Integration / Continuous Delivery, yaitu mekanisme yang menjalankan 3 tahap ini secara otomatis setiap kali kode dicatat), tetapi yang berubah hanya otomatisasinya dan tahapnya tetap sama.

Deploy adalah sebutan untuk 3 pekerjaan sekaligus

Deploy adalah melakukan 3 hal berturut-turut: mengumpulkan, mengirim, dan menerima.

Mengumpulkan adalah build, mengirim lalu menjalankan adalah deploy, dan menerima request di URL adalah rilis, sedangkan file pengaturan yang hanya dipakai di komputer kamu tidak termasuk yang dikumpulkan sehingga tidak sampai ke server publik.

Lingkungan pengembangan dan lingkungan produksi — kode sama, tetapi sekelilingnya berbeda

app.js yang berjalan di komputer kamu tidak berjalan di server publik bukan karena kodenya berubah.

Penyebabnya adalah lingkungan (environment, yaitu satu paket berisi komputer, OS, runtime, database, dan nilai pengaturan yang disiapkan untuk menjalankan app.js) yang berbeda.

Pada artikel "Apa Itu Lingkungan Pengembangan", lingkungan pengembangan berarti kombinasi peralatan, sedangkan di sini lingkungan pengembangan berarti tempat menjalankan peralatan itu.

Isi 2 lingkungan yang menjalankan app.js yang sama
Dua lingkungan, satu app.js
  • app.js yang dijalankan sama-sama satu file di kedua lingkungan
Pengembangan — komputer kamu
  • node yang kamu pasang sendiri
  • Database di dalam komputer yang sama
  • Pengaturan yang menampilkan isi error di layar
Produksi — server publik
  • node yang terpasang di server
  • Database di server yang berbeda
  • Pengaturan yang tidak menampilkan error di layar tetapi mencatatnya di log
Bingkai luar adalah keseluruhan lingkungan yang menjalankan app.js, dan 2 bagian di dalamnya adalah masing-masing lingkungannya. Walaupun app.js yang dijalankan hanya satu, yang disiapkan di sekelilingnya berbeda.

Di dalam bingkai luar ada 2 lingkungan, dan app.js yang dijalankan keduanya sama-sama satu file.

Yang sama hanya kodenya; URL yang dibuka, lokasi database, dan API key semuanya berbeda.

Anggapan yang berlaku di komputer kamuDi server publikYang terjadi setelah dipublikasikan
Terhubung ke localhost:5432Tidak ada database dengan nama ituError saat menyimpan
API key-nya untuk pengujianKey pengujian tidak diterimaDitolak layanan eksternal
Error ditampilkan di layarMuncul apa adanya di layar penggunaIsinya terlihat oleh orang lain
Isi app.jsapp.js yang samaBerjalan apa adanya

Tiga baris teratas adalah anggapan yang hanya berlaku di komputer kamu.

Kalau setelah dipublikasikan aplikasinya tidak jalan, curigai sekelilingnya lebih dahulu daripada kodenya.

Kalau kamu masuk ke server publik lalu memperbaiki hasil build atau pengaturannya dengan tangan, deploy berikutnya akan menimpanya dan perbaikan itu hilang.

Yang diperbaiki adalah app.js di lingkungan pengembangan, dan setelah diperbaiki, deploy sekali lagi.

Yang sama hanya kodenya

Lingkungan adalah segala sesuatu yang disiapkan di sekeliling app.js supaya bisa berjalan.

Komputer kamu adalah lingkungan pengembangan dan server publik adalah lingkungan produksi, dan meski di kedua sisi ada hal dengan peran yang sama, isi tujuan koneksi maupun key-nya berbeda, jadi kalau setelah dipublikasikan tidak jalan, mulailah memeriksa dari sekelilingnya ini.

Environment variable menukar nilai per lingkungan tanpa mengubah kode

Mekanisme menaruh nilai di luar kode dan membuat kode hanya membaca namanya adalah environment variable, yaitu nilai yang diatur di luar program dan dibaca lewat namanya saat program dijalankan.

Yang ditulis di app.js hanya namanya, dan di komputer kamu nilainya ditulis di .env (file yang memuat daftar nama dan nilai environment variable).

Di mana nama dan nilai DATABASE_URL disimpan
Komputer kamu (pengembangan)
Folder my-app
  • app.js — hanya nama DATABASE_URL yang ditulis
  • .env — nilainya ditulis, DATABASE_URL=localhost:5432
  • .env tidak masuk hasil build dan tidak dicatat di Git
Server publik (produksi)
Folder hasil build
  • app.js — tiba dengan hanya namanya yang tertulis
Pengaturan deploy
  • Mendaftarkan DATABASE_URL=db.example.com
  • app.js yang berjalan membaca nilai ini lewat namanya
Kiri adalah komputer kamu, kanan adalah server publik. Yang ditulis di app.js hanya namanya; nilainya ditaruh di .env pada sisi kiri, dan di pengaturan deploy pada sisi kanan.

.env di komputer kamu hanya dibaca di dalam komputer tempat kamu menaruhnya.

Karena .env memuat API key, isinya tidak dicatat di Git, dan karena tidak masuk hasil build juga, .env tidak sampai ke lingkungan produksi.

Kalimat "atur environment variable produksi" pada panduan berarti mendaftarkan nama yang sama di sisi server publik.

Tempat dijalankanSumber nilainyaNilai DATABASE_URLHasil koneksi
Komputer kamu.env di komputer kamulocalhost:5432Ke database di komputer kamu
Server publik, sudah didaftarkanPengaturan deploydb.example.comKe database produksi
Server publik, lupa didaftarkanTidak ada di mana punTetap kosongTidak bisa terhubung, berhenti dengan error

Dengan app.js yang sama, nilai yang dibaca berubah menurut tempat aplikasinya dijalankan.

Nilainya dibaca saat aplikasi mulai dijalankan, jadi setelah mengubah nilai, jalankan ulang.

Yang berjalan di kotak kiri dan kanan adalah app.js yang sama.

Yang berbeda hanya nilai-nilai yang ditaruh di luarnya.

Nama di kode, nilai di sisi lingkungan

Environment variable adalah nilai yang ditaruh di luar kode dan dipanggil lewat namanya.

Di komputer kamu nilainya ditulis di file bernama .env, dan di server publik nama yang sama didaftarkan sebagai pengaturan di tempat itu, jadi kalau setelah dipublikasikan aplikasinya tidak jalan, hal pertama yang kamu lihat adalah apakah pendaftaran ini terlupa.

Informasi rahasia hanya ditaruh di environment variable, tidak di kode sumber dan hasil build

Di antara nilai yang ditaruh di environment variable, yang paling perlu diperhatikan adalah informasi rahasia (secret, yaitu string yang membuat orang lain bisa menyamar sebagai kamu kalau mereka mengetahuinya), dengan API key dan password sebagai contoh utamanya.

Environment variable yang dibaca frontend nilainya dituliskan ke dalam hasil build saat build berlangsung.

Nilai yang sudah dituliskan itu sampai apa adanya ke perangkat orang yang membuka URL-nya.

Informasi rahasia hanya ditaruh di environment variable produksi yang tidak masuk hasil build, dan didaftarkan lewat layar pengaturan deploy.

Nilai yang didaftarkan tidak masuk hasil build, melainkan diserahkan saat server publik menjalankan app.js.

Kalau lupa mendaftarkan, aplikasinya mulai berjalan dengan nama yang ada tetapi tanpa nilai.

Nilai yang didaftarkan hanya ada di sisi server publik, dan nilai yang sama tidak tersalin ke hasil build maupun ke .env di komputer kamu.

Setelah dipublikasikan, nilai itu sendiri hanya ada di 1 tempat.

Setelah dipublikasikan, di mana nilai API key berada
Server publik
Env var produksi
  • API_KEY berisi nilai untuk produksi
  • Yang bisa membacanya hanya app.js yang berjalan dan orang yang bisa mengoperasikan server
Folder hasil build
  • app.js hanya berisi nama API_KEY
  • Nilainya sendiri tidak tertulis di sana
Perangkat pengguna
  • Yang sampai hanya HTML dan JavaScript untuk layar
  • Nilai informasi rahasia tidak ikut
Kiri adalah bagian dalam server publik, kanan adalah perangkat pengguna. Nilai API key hanya ada di environment variable produksi.

Nilainya hanya ada di environment variable produksi, tidak di hasil build dan tidak di perangkat pengguna.

Cara melihat berapa banyak orang yang bisa membaca tempat penyimpanan itu dibahas di artikel "Hal yang Perlu Diwaspadai soal Keamanan".

Batasi tempat penyimpanan nilai ke 1 tempat saja

Informasi rahasia adalah string yang bisa dipakai orang lain kalau mereka mengetahuinya.

Kalau ditulis di kode, isinya ikut dikumpulkan saat build dan sampai ke perangkat pengguna, jadi jangan tulis nilainya, melainkan daftarkan sebagai pengaturan di server publik dan tulis hanya namanya di kode.

QUIZ

Cek Pemahaman

Jawab setiap pertanyaan satu per satu.

Soal 1Di antara 3 tahap deploy, tahap mana yang mengumpulkan app.js dan file yang diperlukan menjadi bentuk yang bisa dijalankan di server publik?

Soal 2my-app berjalan di komputer kamu, tetapi setelah dipublikasikan berhenti dengan error. Penyebab mana yang benar menurut artikel ini?

Soal 3Tempat menaruh informasi rahasia seperti API key dan password database, mana yang sesuai dengan penjelasan artikel ini?