Jalankan Dev Environment Lokal dengan Devbox

by Marcus Chen
Jalankan Dev Environment Lokal dengan Devbox

Dev Environment Kamu Hancur Lagi?

Skenario klasik: kamu clone repo lama, jalankan npm install, dan langsung disambut error:

error: The engine "node" is incompatible with this module.
Expected version "16.x". Got "20.4.0"

Atau lebih parah — kamu baru ganti laptop, dan habis dua hari cuma buat install ulang semua dependency: Python versi ini, Go versi itu, PostgreSQL yang harus match sama production. Belum lagi kalau kamu kerja di beberapa project sekaligus dengan versi runtime yang konflik.

Solusi yang biasa disarankan? Docker. Tapi Docker buat dev environment itu berat — image-nya gede, rebuild-nya lama, dan kalau kamu solo engineer yang kerja di laptop dengan RAM 8GB, itu terasa banget.

Ada alternatif yang lebih ringan dan elegan: Devbox.


Apa Itu Devbox dan Kenapa Beda

Devbox adalah CLI tool dari Jetpack.io yang bikin isolated development environment tanpa container. Di baliknya, Devbox pakai Nix package manager — tapi kamu nggak perlu belajar Nix sama sekali. Devbox wraps Nix dengan interface yang jauh lebih manusiawi.

Bedanya sama Docker untuk dev:

  • Nggak ada container overhead — environment-nya jalan langsung di sistem kamu, tapi terisolasi per-project.
  • Reproducible — satu file devbox.json di-commit ke repo, siapapun yang clone langsung bisa devbox shell dan langsung jalan.
  • Fast — package di-cache secara global di sistem kamu. Install kedua kalinya? Instan.
  • Nggak ganggu sistem — semua package Devbox hidup di /nix/store, nggak nyentuh /usr/local/bin atau sistem package manager kamu.

Kalau kamu pernah pakai asdf atau mise, konsepnya mirip — tapi Devbox lebih luas karena bisa manage hampir semua package, bukan cuma runtime.


Install Devbox

Satu command, jalan di macOS dan Linux:

curl -fsSL https://get.jetpack.io/devbox | bash

Script ini akan install Nix dulu kalau belum ada, lalu install Devbox. Prosesnya sekitar 2–5 menit tergantung koneksi.

Verifikasi:

devbox version
# 0.10.x

Gotcha: Di macOS dengan SIP (System Integrity Protection) aktif, installer Nix kadang gagal di langkah mount. Kalau kena ini, jalankan installer Nix secara manual dulu dari https://nixos.org/download dengan opsi --daemon, baru install Devbox.


Setup Project Pertama: Node + PostgreSQL

Kita ambil contoh konkret: project Express.js yang butuh Node 18 dan PostgreSQL 15. Tanpa Devbox, kamu harus manage ini manual atau pakai Docker Compose yang lumayan verbose.

Init Devbox di Project

cd ~/projects/my-api
devbox init

Ini bikin file devbox.json kosong di direktori project kamu:

{
  "$schema": "https://raw.githubusercontent.com/jetpack-io/devbox/0.10.0/.schema/devbox.schema.json",
  "packages": [],
  "shell": {
    "init_hook": [],
    "scripts": {}
  }
}

Tambah Package

devbox add nodejs@18 postgresql@15

Devbox bakal resolve package dari Nixpkgs dan update devbox.json:

{
  "$schema": "https://raw.githubusercontent.com/jetpack-io/devbox/0.10.0/.schema/devbox.schema.json",
  "packages": [
    "nodejs@18",
    "postgresql@15"
  ],
  "shell": {
    "init_hook": [
      "echo 'Dev environment ready. Node: '$(node --version)"
    ],
    "scripts": {
      "start": "node src/index.js",
      "db:init": "initdb -D .devbox/db && pg_ctl -D .devbox/db -l .devbox/db/postgres.log start"
    }
  }
}

Gue tambah init_hook buat greeting sederhana, dan dua scripts: satu buat jalanin app, satu buat init database PostgreSQL lokal.

Masuk ke Dev Shell

devbox shell

Output:

Installing packages. This may take a few minutes...
Dev environment ready. Node: v18.20.3
(devbox) $

Sekarang kamu ada di isolated shell. Cek:

which node
# /nix/store/xxxx-nodejs-18.20.3/bin/node

which psql
# /nix/store/xxxx-postgresql-15.x/bin/psql

Keluar dari shell? Tinggal exit. Node dan psql versi Devbox nggak akan keliatan di shell normal kamu.


Init Database PostgreSQL Lokal

Ini bagian yang biasanya ribet kalau manual. Dengan script yang udah kita define:

devbox run db:init

Ini bakal:

  1. Bikin direktori .devbox/db/ sebagai data directory PostgreSQL.
  2. Jalanin initdb buat initialize cluster.
  3. Start PostgreSQL server yang listen di socket lokal.

Tambahkan .devbox/db/ ke .gitignore:

# .gitignore
.devbox/db/

Buat connect ke database:

psql -h localhost -U $USER postgres

Atau kalau kamu pakai Unix socket (lebih cepat):

psql -d postgres

Gotcha: PostgreSQL yang dijalankan via Devbox ini nggak pakai port 5432 sistem kamu — dia pakai socket di .devbox/db/. Kalau app kamu hardcode host: 'localhost', pastikan juga set port yang benar atau switch ke socket connection string: postgresql:///mydb.


Environment Variables dengan devbox.json

Salah satu fitur yang underrated: kamu bisa set env vars langsung di devbox.json via init_hook, atau lebih rapi lagi pakai file .env yang di-source otomatis.

Tambahkan ini ke init_hook:

"init_hook": [
  "export DATABASE_URL=postgresql://localhost/myapp_dev",
  "export NODE_ENV=development",
  "echo 'Env loaded. Node: '$(node --version)"
]

Atau kalau kamu prefer .env file (dan udah ada di project):

"init_hook": [
  "[ -f .env ] && source .env",
  "echo 'Env loaded.'"
]

Ini jauh lebih clean daripada harus source .env manual tiap buka terminal baru.


Devbox Scripts: Ganti npm run / make

Bagian scripts di devbox.json itu basically task runner ringan. Kamu bisa define workflow yang kompleks:

"scripts": {
  "start": "node src/index.js",
  "dev": "node --watch src/index.js",
  "db:init": "initdb -D .devbox/db && pg_ctl -D .devbox/db -l .devbox/db/postgres.log start",
  "db:start": "pg_ctl -D .devbox/db -l .devbox/db/postgres.log start",
  "db:stop": "pg_ctl -D .devbox/db stop",
  "db:migrate": "node scripts/migrate.js",
  "setup": "npm install && devbox run db:init && devbox run db:migrate"
}

Jalanin dengan:

devbox run setup   # first time setup
devbox run dev     # development mode
devbox run db:stop # matiin postgres sebelum tutup laptop

Script setup itu one-liner yang handle full onboarding: install npm deps, init database, jalanin migration. Kalau ada teammate baru (atau kamu sendiri di laptop baru), satu command itu cukup.


Commit devbox.json ke Repo

Ini poin pentingnya. File yang perlu di-commit:

✅ devbox.json
✅ devbox.lock   # generated, pin exact package versions
❌ .devbox/db/   # data directory, masuk .gitignore
❌ .devbox/virtenv/  # generated, masuk .gitignore

devbox.lock itu mirip package-lock.json — dia pin exact Nix store hash dari setiap package. Ini yang bikin environment kamu benar-benar reproducible: orang lain yang clone repo kamu bakal dapat bit-for-bit package yang sama.

Contoh .gitignore tambahan:

# Devbox
.devbox/db/
.devbox/virtenv/

Integrasi dengan Direnv (Opsional tapi Recommended)

Capek harus ketik devbox shell tiap masuk direktori project? Pakai direnv.

Install direnv:

# macOS
brew install direnv

# Ubuntu/Debian
apt install direnv

Tambah ke shell config kamu (~/.zshrc atau ~/.bashrc):

eval "$(direnv hook zsh)"   # atau bash

Generate .envrc di project:

devbox generate direnv --print-envrc > .envrc
direnv allow

Sekarang setiap kamu cd ke direktori project, Devbox environment langsung aktif otomatis. Keluar dari direktori, environment hilang. Zero friction.

Gotcha: Jangan commit .envrc kalau dia contain secret. Tapi kalau isinya cuma eval "$(devbox shellenv)" (yang di-generated Devbox), itu aman di-commit.


Cari Package yang Tersedia

Nixpkgs punya lebih dari 80.000 package. Cara cari:

devbox search ripgrep
devbox search python
devbox search "python@3.11"

Atau lewat web: search.nixos.org

Beberapa package yang sering gue pakai di dev environment:

devbox add python@3.11 poetry    # Python project
devbox add go@1.22               # Go project
devbox add rustup                # Rust
devbox add redis                 # Redis lokal
devbox add awscli2 terraform     # Infrastructure tools
devbox add jq httpie             # CLI utilities

Perbandingan Singkat: Devbox vs Alternatif

Devbox Docker Compose asdf/mise
Overhead Rendah Tinggi Rendah
Reproducible ✅ (bit-exact) ✅ ⚠️ (versi saja)
Non-runtime packages ✅ ✅ ❌
Setup complexity Rendah Sedang Rendah
Works offline ✅ (cached) ⚠️ ✅
Learning curve Rendah Sedang Rendah

Devbox bukan pengganti Docker untuk production atau service isolation — kalau kamu butuh run multiple service dalam network yang terisolasi, Docker Compose masih lebih tepat. Tapi untuk dev environment tooling, Devbox menang di hampir semua kategori.


Yang Gue Lakuin Sekarang

Semua project aktif gue sekarang punya devbox.json. Workflow-nya:

  1. Clone repo → devbox shell (atau otomatis via direnv) → langsung kerja.
  2. Butuh tool baru? devbox add <package>, commit devbox.json dan devbox.lock.
  3. Ganti laptop? git clone, devbox shell, devbox run setup. Selesai dalam menit, bukan jam.

Langkah lanjutan yang bisa kamu coba:

  • Tambah Devbox ke CI/CD pipeline — Jetpack punya GitHub Action resmi.
  • Explore devbox generate dockerfile kalau mau containerize app kamu dengan base image yang match dev environment.
  • Coba devbox global add buat install tool yang kamu pakai di semua project (seperti ripgrep, fd, httpie) tanpa polusi sistem.

Dev environment yang reproducible itu bukan luxury — itu prerequisite buat kerja yang tenang. Devbox bikin itu jadi mudah tanpa harus jadi Nix expert dulu.