Lewati ke konten utama
seratusribu.com
Semua artikel
DevOps & Shell

Cara Deploy Aplikasi Node.js ke VPS dengan PM2 dan Nginx

Oleh Anang H. Darmawan

2 menit baca
Laporkan
Cara Deploy Aplikasi Node.js ke VPS dengan PM2 dan Nginx

Foto: panumas nikhomkhai / Unsplash

Berbeda dengan website PHP yang bisa langsung diproses oleh PHP-FPM, aplikasi Node.js harus terus berjalan sebagai proses. Kalau kamu tutup terminal, proses itu ikut mati. Karena itu, butuh dua hal di server: proses manager yang menjaga aplikasi tetap hidup, dan reverse proxy yang meneruskan trafik web ke port aplikasimu.

Alur besarnya

Langkah paling aman adalah: push kode ke Git, clone di VPS, jalankan npm ci dan build (kalau ada), jalankan aplikasi dengan PM2, lalu atur Nginx untuk meneruskan request ke port aplikasi. Jangan menyalin file lewat drag-and-drop tanpa alasan kalau kamu bisa pakai git.

Build di server, bukan kirim node_modules

Pastikan kamu memakai .gitignore agar node_modules tidak ikut ter-push. Di VPS, jalankan npm ci (bukan npm install) supaya versi dependensi persis seperti yang dipakai di development. Kalau proyekmu pakai TypeScript atau perlu build, jalankan npm run build lalu jalankan file hasil build (misalnya dist/index.js) lewat PM2.

PM2 menjaga proses tetap hidup

PM2 menjaga proses, mencatat log, dan bisa me-restart saat aplikasi crash. Mulai dari "pm2 start dist/index.js --name appku". Buat ecosystem.config.js untuk konsistensi (nama, env, jumlah instance). Setelah terkonfigurasi, jalankan "pm2 save" dan "pm2 startup" supaya aplikasi auto-start saat server reboot.

Nginx sebagai reverse proxy

Aplikasi Node.js biasanya jalan di port lokal (3000, 8080, 4000). Atur server block di Nginx dengan proxy_pass ke http://127.0.0.1:3000. Tambahkan header proxy_set_header untuk X-Real-IP dan X-Forwarded-For. Kalau aplikasi pakai WebSocket, tambahkan upgrade dan connection headers. Jangan lupa "sudo nginx -t" sebelum reload.

Environment variable dan file rahasia

Simpan rahasia seperti DB_PASSWORD di file .env. PM2 bisa membaca .env, tapi pastikan file .env tidak ter-push ke repositori. Jangan hardcode secret di kode. Jika ada kredensial untuk CLI atau build, pisahkan antara env development dan production.

Domain dan HTTPS

Setelah Nginx bekerja, pasang HTTPS dengan certbot. Ikuti validasi HTTP challenge dan biarkan certbot mengupdate konfigurasi Nginx. Lalu periksa auto-renew lewat cron atau systemd timer.

Deployment berikutnya

Jangan restart paksa sembarangan. Untuk non-breaking change, "pm2 reload appku" lebih aman (zero-downtime). Untuk perubahan besar, restart bisa lebih gampang. Kalau kamu lebih suka systemd, Deploy Go/Node + Caddy + systemd generator (Rp200.000) memberi template siap pakai. Untuk provisioning VPS secara terstruktur, Ansible playbook provisioning VPS (Rp275.000) bisa menghemat berjam-jam setup. Dan jangan lupakan monitoring: Monitoring server, alert Telegram (Rp150.000) akan memberitahumu saat aplikasi mati.

Mulai dari satu aplikasi sederhana, pastikan alur build, run, dan proxy-nya beres, baru buat deployment untuk aplikasi yang penting.