Jalankan Dev Environment Lokal dengan Devbox

by Marcus Chen
Jalankan Dev Environment Lokal dengan Devbox

Dev Environment Kamu Rusak Lagi?

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

error: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

Atau lebih parah — Node versinya beda, Python-nya conflict sama sistem, dan kamu nggak ingat kapan terakhir install libpq-dev. Satu jam kemudian kamu masih di terminal, bukan nulis kode.

Ini bukan masalah skill. Ini masalah tooling. Dev environment yang nggak reproducible adalah time sink terbesar buat solo engineer.

Solusinya bukan Docker (terlalu berat buat development loop), bukan virtualenv doang (nggak cover semua dependency), dan bukan ngandalin ingatan kamu soal apa yang di-install bulan lalu.

Solusinya: Devbox.


Apa Itu Devbox dan Kenapa Beda?

Devbox adalah CLI tool dari Jetpack.io yang bikin isolated shell environment per-project, powered by Nix di baliknya — tapi kamu nggak perlu belajar Nix syntax yang rumit itu.

Bedanya dari tool lain:

  • Nix-powered: setiap package di-pin ke versi spesifik, bukan "latest yang keinstall di sistem kamu"
  • Isolated per-project: Node 18 di project A, Node 20 di project B — nggak conflict
  • Declarative via devbox.json: file ini di-commit ke repo, jadi semua orang (atau kamu di laptop baru) dapat environment yang sama
  • Nggak butuh Docker: shell biasa, bukan container, jadi development loop tetap cepat

Ukuran overhead-nya minimal. Startup time-nya jauh lebih cepat dibanding spin up container.


Install Devbox

Install-nya satu command:

curl -fsSL https://get.jetify.com/devbox | bash

Script ini akan install Nix kalau belum ada, lalu install Devbox di atas Nix. Di Linux dan macOS, prosesnya mulus. Di WSL2 juga jalan — gue pakai Ubuntu 22.04 di WSL2 dan nggak ada masalah.

Gotcha #1: kalau kamu pakai macOS dan sudah ada Nix terinstall via Homebrew, ada kemungkinan conflict. Uninstall dulu Nix versi Homebrew, baru jalankan script di atas.

Verifikasi instalasi:

devbox version
# Output: 0.13.x (atau versi terbaru)

Setup Project Pertama

Misalnya kamu mau setup project Python + PostgreSQL client + Redis CLI. Tanpa Devbox, kamu harus install semua itu ke sistem, dan doain nggak conflict.

Dengan Devbox:

mkdir myproject && cd myproject
devbox init

Ini bikin file devbox.json di folder kamu:

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

Sekarang tambah packages:

devbox add python@3.11 postgresql@15 redis

Devbox akan resolve dan download package dari Nix package registry. Pertama kali agak lama (download Nix store), tapi selanjutnya di-cache.

File devbox.json kamu sekarang jadi:

{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.13.5/.schema/devbox.schema.json",
  "packages": [
    "python@3.11",
    "postgresql@15",
    "redis"
  ],
  "shell": {
    "init_hook": [],
    "scripts": {}
  }
}

Masuk ke isolated shell:

devbox shell

Sekarang cek versinya:

python --version
# Python 3.11.x

psql --version
# psql (PostgreSQL) 15.x

redis-cli --version
# redis-cli 7.x.x

Keluar dari shell? Ketik exit. Environment sistem kamu nggak tersentuh sama sekali.


Init Hook dan Scripts: Otomatisasi Setup

Ini bagian yang bikin Devbox beneran powerful buat solo engineer.

Init Hook

Init hook dijalankan setiap kali kamu masuk ke devbox shell. Cocok buat:

  • Aktifkan virtual environment Python
  • Set environment variable
  • Print reminder ke diri sendiri

Contoh devbox.json dengan init hook:

{
  "packages": [
    "python@3.11",
    "postgresql@15",
    "redis"
  ],
  "shell": {
    "init_hook": [
      "echo 'Dev environment ready. DB port: 5432, Redis: 6379'",
      "[ ! -d .venv ] && python -m venv .venv",
      "source .venv/bin/activate"
    ],
    "scripts": {}
  }
}

Setiap kali devbox shell, Python virtual environment langsung aktif. Nggak perlu ingat-ingat lagi.

Scripts

Scripts adalah shortcut command yang bisa kamu define dan jalankan via devbox run:

{
  "packages": [
    "python@3.11",
    "postgresql@15",
    "redis"
  ],
  "shell": {
    "init_hook": [
      "[ ! -d .venv ] && python -m venv .venv",
      "source .venv/bin/activate"
    ],
    "scripts": {
      "start-db": "pg_ctl start -D .devbox/db -l .devbox/db/logfile",
      "stop-db": "pg_ctl stop -D .devbox/db",
      "init-db": "initdb -D .devbox/db && pg_ctl start -D .devbox/db -l .devbox/db/logfile && createdb myapp_dev",
      "start-redis": "redis-server --daemonize yes --logfile .devbox/redis.log",
      "dev": "python manage.py runserver"
    }
  }
}

Jalankan dari luar shell sekalipun:

devbox run init-db
devbox run start-redis
devbox run dev

Gotcha #2: PostgreSQL yang di-install Devbox nggak auto-start sebagai service sistem. Kamu harus start manual via pg_ctl seperti di atas, atau pakai script. Ini intentional — environment kamu terisolasi dari sistem.


Real Case: Setup FastAPI + PostgreSQL + Redis

Ini setup yang gue pakai untuk side project API:

devbox init
devbox add python@3.11 postgresql@15 redis nodejs@20

Kenapa Node.js juga? Karena gue pakai Prisma sebagai ORM, dan Prisma CLI butuh Node.

devbox.json final:

{
  "packages": [
    "python@3.11",
    "postgresql@15",
    "redis",
    "nodejs@20"
  ],
  "shell": {
    "init_hook": [
      "[ ! -d .venv ] && python -m venv .venv",
      "source .venv/bin/activate",
      "export DATABASE_URL=postgresql://postgres@localhost:5432/myapp_dev",
      "export REDIS_URL=redis://localhost:6379"
    ],
    "scripts": {
      "init-db": "initdb -D .devbox/pgdata && pg_ctl start -D .devbox/pgdata -l .devbox/pgdata/postgres.log && createdb myapp_dev",
      "start-db": "pg_ctl start -D .devbox/pgdata -l .devbox/pgdata/postgres.log",
      "stop-db": "pg_ctl stop -D .devbox/pgdata",
      "start-redis": "redis-server --daemonize yes --logfile .devbox/redis.log --dir .devbox",
      "install": "pip install -r requirements.txt",
      "dev": "uvicorn app.main:app --reload --port 8000",
      "migrate": "alembic upgrade head"
    }
  }
}

Workflow pertama kali di laptop baru (atau onboarding teman):

git clone https://github.com/kamu/myproject
cd myproject
devbox shell
devbox run init-db
devbox run install
devbox run migrate
devbox run dev

Selesai. Nggak ada "works on my machine" drama.


Commit devbox.json, Ignore .devbox/

File yang perlu di-commit:

  • devbox.json — definisi environment
  • devbox.lock — pin exact version dari semua package (mirip package-lock.json)

Folder yang perlu di-ignore:

  • .devbox/ — ini tempat Devbox nyimpen data lokal (database files, logs, dll)

Tambahkan ke .gitignore:

# Devbox local data
.devbox/

# Tapi jangan ignore devbox.json dan devbox.lock!
!devbox.json
!devbox.lock

Gotcha #3: Banyak yang salah ignore devbox.lock juga. Jangan. File lock itu yang bikin environment reproducible di semua mesin. Tanpa lock file, Nix bisa resolve ke versi yang sedikit berbeda.


Integrasi dengan direnv (Opsional tapi Recommended)

Kalau kamu capek ketik devbox shell setiap masuk folder, integrate dengan direnv:

devbox add direnv
devbox generate direnv

Ini bikin file .envrc di project kamu. Setelah direnv allow, setiap kali kamu cd ke folder project, environment Devbox langsung aktif otomatis.

cd myproject
# direnv: loading .envrc
# direnv: export +DATABASE_URL +REDIS_URL ...

Keluar dari folder? Environment langsung unload. Clean.


Cari Package: Nix Search

Bingung nama package-nya apa di Nix? Dua cara:

1. Via CLI:

devbox search ripgrep
# Menampilkan versi yang tersedia

2. Via web: Buka search.nixos.org — search engine untuk semua package Nix. Ini lebih lengkap dan ada deskripsi package-nya.

Contoh: mau install jq?

devbox add jq

Mau install versi spesifik?

devbox add python@3.10

Nggak semua package punya semua versi available. Kalau versi yang kamu mau nggak ada, cek di search.nixos.org untuk nama exact-nya.


Yang Gue Lakuin Sekarang

Semua project baru gue mulai dengan devbox init. Bahkan project kecil sekalipun — karena devbox.json yang kosong pun lebih baik daripada nggak ada dokumentasi environment sama sekali.

Setup yang gue pakai sekarang:

  1. Devbox untuk isolasi environment dan dependency management
  2. direnv untuk auto-activate saat masuk folder
  3. devbox.lock selalu di-commit ke repo
  4. Scripts di devbox.json untuk semua command yang sering dipakai — nggak ada lagi "eh tadi command-nya apa ya?"

Kalau kamu solo engineer yang sering ganti-ganti project atau laptop, ini setup yang akan menghemat berjam-jam waktu setup. Coba mulai dari project yang paling sering kamu setup ulang — migrate devbox.json-nya, commit, dan rasakan bedanya next time kamu clone repo itu di mesin baru.

Satu hal lagi: Devbox juga punya fitur Devbox Cloud dan Devbox Secrets kalau kamu mau extend ke team setup. Tapi this guide buat solo engineer, fitur lokal yang gue bahas di sini sudah lebih dari cukup.