Cara Deploy Node.js ke VPS: Panduan Lengkap Setup PM2 dan Nginx 2026

Pendahuluan: Mengapa Deploy Node.js Berbeda dari PHP?
Cara deploy Node.js ke VPS berbeda secara fundamental dari cara deploy aplikasi PHP
yang mungkin sudah Anda kenal. Aplikasi PHP cukup di-upload ke folder public_html dan
langsung bisa diakses - Apache atau Nginx menangani eksekusinya secara otomatis per-request.
Node.js bekerja berbeda: aplikasi berjalan sebagai proses yang terus aktif di background, mendengarkan di sebuah port (misalnya 3000, 8080). Nginx kemudian berperan sebagai reverse proxy yang menerima request di port 80/443 dan meneruskannya ke aplikasi Node.js tersebut. Itulah mengapa kita membutuhkan PM2 sebagai process manager untuk menjaga aplikasi tetap berjalan, dan Nginx sebagai gerbang depan yang menghadap internet.
Panduan cara deploy Node.js ini menggunakan Ubuntu 22.04 LTS sebagai sistem operasi VPS. Seluruh perintah juga berlaku untuk Debian 12 dan distribusi berbasis Debian lainnya.
Prasyarat Sebelum Deploy Node.js
Pastikan Anda sudah memiliki:

- VPS Linux aktif (Ubuntu 22.04 LTS direkomendasikan) dengan akses SSH root
- Aplikasi Node.js yang sudah berjalan dengan baik di lokal
- Kode tersimpan di repositori Git (GitHub, GitLab, Bitbucket)
- Domain yang sudah diarahkan ke IP VPS (opsional, bisa gunakan IP langsung untuk testing)
- File
.env.exampleyang mendokumentasikan semua variabel lingkungan yang dibutuhkan
Langkah 1: Persiapan Awal VPS
Login ke VPS via SSH dan lakukan update sistem terlebih dahulu:
ssh root@IP_VPS_ANDA
# Update semua paket sistem
apt update && apt upgrade -y
# Install paket utilitas yang diperlukan
apt install -y curl wget git ufw nano htop
Buat User Non-Root (Praktik Keamanan Terbaik)
Jangan jalankan aplikasi production sebagai root. Buat user khusus untuk aplikasi:
# Buat user baru
adduser deploy
# Tambahkan ke grup sudo
usermod -aG sudo deploy
# Pindah ke user deploy
su - deploy
Konfigurasi Firewall UFW
# Izinkan SSH, HTTP, dan HTTPS
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Aktifkan firewall
sudo ufw enable
# Verifikasi status
sudo ufw status
Langkah 2: Instalasi Node.js via NVM
Menggunakan NVM (Node Version Manager) adalah cara terbaik untuk menginstal Node.js di VPS karena memudahkan pengelolaan versi dan tidak memerlukan akses root untuk instalasi:
# Install NVM (sebagai user deploy, bukan root)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Reload konfigurasi shell
source ~/.bashrc
# Install Node.js versi LTS terbaru
nvm install --lts
# Pastikan versi LTS digunakan secara default
nvm alias default node
# Verifikasi instalasi
node --version # Output: v22.x.x
npm --version # Output: 10.x.x
Alternatif: Install Node.js dari NodeSource Repository
Jika Anda menginstal sebagai root dan ingin Node.js tersedia untuk semua user:
# Install Node.js 22.x LTS dari NodeSource
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs
node --version
npm --version
Langkah 3: Clone dan Setup Aplikasi Node.js
Upload kode aplikasi ke VPS menggunakan Git (cara yang paling direkomendasikan):
# Buat direktori untuk aplikasi
sudo mkdir -p /var/www/myapp
sudo chown deploy:deploy /var/www/myapp
# Clone repository
cd /var/www/myapp
git clone https://github.com/username/nama-repo.git .
# Install dependensi produksi saja
npm install --production
# Atau jika menggunakan package-lock.json (lebih konsisten):
npm ci --only=production
Konfigurasi Environment Variables
Jangan pernah menyimpan .env di Git. Buat file .env langsung di server:
nano /var/www/myapp/.env
Isi dengan variabel yang dibutuhkan aplikasi Anda:
NODE_ENV=production
PORT=3000
MONGODB_URI=mongodb://localhost:27017/myapp_production
JWT_SECRET=ganti_dengan_string_rahasia_yang_panjang_dan_acak
API_KEY=kunci_api_production_anda
ALLOWED_ORIGIN=https://domainanda.com
Amankan file .env agar hanya bisa dibaca oleh owner:
chmod 600 /var/www/myapp/.env
Langkah 4: Install dan Konfigurasi PM2
PM2 (Process Manager 2) adalah komponen kritis dalam cara deploy Node.js yang benar. PM2 bertugas:
- Menjaga aplikasi tetap berjalan 24/7
- Otomatis restart jika aplikasi crash karena error
- Menjalankan aplikasi otomatis saat server reboot
- Manajemen log terpusat
- Cluster mode untuk memanfaatkan semua CPU core
- Monitoring penggunaan CPU dan RAM real-time
Install PM2
# Install PM2 secara global
npm install -g pm2
# Verifikasi instalasi
pm2 --version
Menjalankan Aplikasi dengan PM2
# Cara paling sederhana: jalankan file utama
pm2 start /var/www/myapp/src/app.js --name "myapp"
# Jika menggunakan npm start:
pm2 start npm --name "myapp" -- start
# Jika menggunakan custom script:
pm2 start npm --name "myapp" -- run start:prod
Konfigurasi PM2 via Ecosystem File (Direkomendasikan)
Cara terbaik mengonfigurasi PM2 adalah dengan file ecosystem.config.js di root proyek.
Ini memungkinkan Anda mendefinisikan semua konfigurasi dalam satu tempat:
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'myapp',
script: 'src/app.js',
instances: 'max', // Gunakan semua CPU core (cluster mode)
exec_mode: 'cluster', // Mode cluster untuk load balancing
watch: false, // Jangan watch file di production
max_memory_restart: '500M', // Restart jika RAM melebihi 500MB
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
// Log configuration
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/myapp/error.log',
out_file: '/var/log/myapp/access.log',
merge_logs: true,
}
]
};
# Buat direktori log
sudo mkdir -p /var/log/myapp
sudo chown deploy:deploy /var/log/myapp
# Jalankan dengan ecosystem file
pm2 start ecosystem.config.js --env production
# Lihat status semua aplikasi
pm2 list
# Monitor real-time (CPU, RAM, request/s)
pm2 monit
Setup PM2 untuk Auto-Start saat Server Boot
Ini adalah langkah yang sering terlupakan namun sangat penting:
# Generate dan jalankan startup script
pm2 startup
# PM2 akan menampilkan perintah yang harus dijalankan, contoh:
# sudo env PATH=$PATH:/home/deploy/.nvm/versions/node/v22.0.0/bin # /home/deploy/.nvm/versions/node/v22.0.0/lib/node_modules/pm2/bin/pm2 # startup systemd -u deploy --hp /home/deploy
# Salin dan jalankan perintah tersebut!
# Simpan daftar proses yang sedang berjalan
pm2 save
# Verifikasi: aplikasi harus muncul di list setelah save
pm2 list
Perintah PM2 yang Wajib Diketahui
# Restart aplikasi (ada sedikit downtime)
pm2 restart myapp
# Reload tanpa downtime (zero-downtime, untuk cluster mode)
pm2 reload myapp
# Hentikan aplikasi
pm2 stop myapp
# Hapus aplikasi dari PM2
pm2 delete myapp
# Lihat log real-time
pm2 logs myapp
# Lihat log 100 baris terakhir
pm2 logs myapp --lines 100
# Informasi detail proses
pm2 show myapp
# Reset counter restart
pm2 reset myapp
Langkah 5: Install dan Konfigurasi Nginx sebagai Reverse Proxy
Nginx berperan sebagai "gerbang" yang menerima semua request dari internet di port 80/443, kemudian meneruskannya ke aplikasi Node.js yang berjalan di port internal (3000). Ini disebut reverse proxy.
Keuntungan menggunakan Nginx di depan Node.js:
- Menangani SSL/HTTPS termination dengan efisien
- Serving file statis (CSS, JS, gambar) jauh lebih cepat
- Load balancing ke beberapa instance Node.js
- Fitur rate limiting dan security header bawaan
- Bisa menjalankan beberapa aplikasi berbeda di satu server
Install Nginx
sudo apt install nginx -y
sudo systemctl start nginx
sudo systemctl enable nginx
# Verifikasi: buka http://IP_VPS_ANDA di browser
sudo systemctl status nginx
Konfigurasi Nginx untuk Node.js
sudo nano /etc/nginx/sites-available/myapp
Masukkan konfigurasi berikut (ganti domainanda.com dengan domain Anda):
upstream nodejs_backend {
# Jika PM2 cluster mode dengan beberapa instance:
server 127.0.0.1:3000;
# server 127.0.0.1:3001; # Tambahkan jika ada instance kedua
keepalive 64;
}
server {
listen 80;
listen [::]:80;
server_name domainanda.com www.domainanda.com;
# Log files
access_log /var/log/nginx/myapp.access.log;
error_log /var/log/nginx/myapp.error.log;
# Serve file statis langsung dari Nginx (lebih cepat)
location /public/ {
alias /var/www/myapp/public/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# Semua request lain diteruskan ke Node.js
location / {
proxy_pass http://nodejs_backend;
proxy_http_version 1.1;
# Header untuk WebSocket support
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
# Forward informasi client asli ke Node.js
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache_bypass $http_upgrade;
# Timeout settings
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Buffer settings
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
}
}
# Aktifkan konfigurasi
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# Hapus konfigurasi default Nginx jika masih ada
sudo rm -f /etc/nginx/sites-enabled/default
# Test konfigurasi Nginx (harus "syntax is ok")
sudo nginx -t
# Reload Nginx dengan konfigurasi baru
sudo systemctl reload nginx
Buka browser dan akses http://domainanda.com - aplikasi Node.js Anda seharusnya sudah bisa diakses!

Langkah 6: Pasang SSL/HTTPS dengan Let's Encrypt
HTTPS wajib untuk setiap website production - untuk keamanan, kepercayaan pengguna, dan peringkat SEO. Let's Encrypt menyediakan sertifikat SSL gratis dengan pembaruan otomatis setiap 90 hari.
# Install Certbot untuk Nginx
sudo apt install -y certbot python3-certbot-nginx
# Dapatkan dan install sertifikat SSL
sudo certbot --nginx -d domainanda.com -d www.domainanda.com
# Certbot akan meminta:
# - Email address untuk notifikasi kedaluwarsa
# - Persetujuan Terms of Service
# - Apakah ingin redirect HTTP ke HTTPS otomatis (pilih Ya/2)
# Verifikasi auto-renewal berfungsi
sudo certbot renew --dry-run
Setelah certbot selesai, konfigurasi Nginx akan otomatis diperbarui untuk mendukung HTTPS dan redirect
dari HTTP. Kini aplikasi Node.js Anda bisa diakses di https://domainanda.com.
Konfigurasi Nginx Tambahan untuk Performa dan Keamanan
Setelah SSL terpasang, edit konfigurasi Nginx untuk menambahkan security headers dan optimasi:
# Di blok server HTTPS (yang ditambahkan certbot), tambahkan:
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Kompresi Gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript
text/xml application/xml text/javascript;
Langkah 7: Setup Database MongoDB di VPS
Jika aplikasi Anda menggunakan MongoDB, berikut cara instalasi di Ubuntu 22.04:
# Import MongoDB GPG key
curl -fsSL https://www.mongodb.org/static/pgp/server-7.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-7.0.gpg
# Tambahkan repository MongoDB
echo "deb [ signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update
sudo apt install -y mongodb-org
# Start dan enable MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod
# Verifikasi
sudo systemctl status mongod
Amankan MongoDB
# Akses MongoDB shell
mongosh
# Di dalam MongoDB shell:
use admin
db.createUser({
user: "adminUser",
pwd: "passwordKuat123!",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})
# Buat user untuk database aplikasi
use myapp_production
db.createUser({
user: "myapp_user",
pwd: "passwordAppKuat456!",
roles: [ { role: "readWrite", db: "myapp_production" } ]
})
exit
# Aktifkan autentikasi MongoDB
sudo nano /etc/mongod.conf
# Uncomment atau tambahkan:
# security:
# authorization: enabled
sudo systemctl restart mongod
Update .env di server dengan connection string yang terautentikasi:
MONGODB_URI=mongodb://myapp_user:passwordAppKuat456!@localhost:27017/myapp_production?authSource=myapp_production
Langkah 8: Workflow Update Deployment
Setiap kali ada update kode, berikut workflow yang direkomendasikan untuk deploy pembaruan ke server:
# 1. Masuk ke direktori aplikasi
cd /var/www/myapp
# 2. Pull perubahan terbaru dari Git
git pull origin main
# 3. Install/update dependensi jika ada perubahan di package.json
npm ci --only=production
# 4. Build jika diperlukan (misal untuk TypeScript atau bundling)
# npm run build
# 5. Reload PM2 tanpa downtime (zero-downtime reload)
pm2 reload myapp
# 6. Verifikasi aplikasi berjalan normal
pm2 status myapp
pm2 logs myapp --lines 20
Otomatisasi dengan Script Deploy
Buat script deploy yang bisa dijalankan satu perintah:
nano /var/www/myapp/deploy.sh
#!/bin/bash
set -e # Hentikan script jika ada perintah yang gagal
APP_DIR="/var/www/myapp"
APP_NAME="myapp"
echo "=== Memulai deployment ==="
cd $APP_DIR
echo ">>> Pull kode terbaru dari Git..."
git pull origin main
echo ">>> Install dependensi..."
npm ci --only=production
echo ">>> Reload aplikasi dengan PM2 (zero-downtime)..."
pm2 reload $APP_NAME
echo ">>> Status aplikasi:"
pm2 status $APP_NAME
echo "=== Deployment selesai! ==="
# Buat executable
chmod +x /var/www/myapp/deploy.sh
# Jalankan
./deploy.sh
Langkah 9: Monitoring dan Maintenance
Deploy yang sukses hanyalah awal. Monitoring rutin memastikan aplikasi berjalan optimal:
Monitoring dengan PM2
# Dashboard monitoring real-time (CPU, RAM, request, error)
pm2 monit
# Lihat statistik semua proses
pm2 list
# Log terbaru aplikasi
pm2 logs myapp --lines 50
# Rotasi log agar tidak memenuhi disk
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
Cek Penggunaan Resource Server
# Penggunaan CPU, RAM, proses secara real-time
htop
# Penggunaan disk
df -h
# Penggunaan RAM ringkas
free -h
# Log error Nginx
sudo tail -f /var/log/nginx/myapp.error.log
Tips Troubleshooting Deploy Node.js yang Sering Terjadi
Masalah: Aplikasi tidak bisa diakses setelah restart server
Pastikan PM2 startup sudah dikonfigurasi dengan benar dan pm2 save sudah dijalankan setelah
semua proses berjalan. Verifikasi dengan: sudo systemctl status pm2-deploy.
Masalah: Error "502 Bad Gateway" dari Nginx
Ini berarti Nginx tidak bisa terhubung ke Node.js. Cek: (1) Apakah PM2 berjalan? (pm2 list);
(2) Apakah port yang dikonfigurasi di Nginx (3000) sama dengan yang digunakan aplikasi di
.env; (3) Apakah ada error di log PM2? (pm2 logs myapp).
Masalah: Environment variables tidak terbaca
Pastikan file .env ada di direktori yang sama dengan titik mulai aplikasi, dan aplikasi
menggunakan require('dotenv').config() di baris paling awal. Alternatif, set variabel
langsung di ecosystem.config.js PM2.
FAQ: Cara Deploy Node.js ke VPS
Pertanyaan yang Sering Diajukan
Apa itu PM2 dan mengapa wajib digunakan untuk deploy Node.js?
PM2 adalah process manager untuk Node.js yang memastikan aplikasi tetap berjalan 24/7. Tanpa PM2, jika aplikasi crash, tidak ada yang akan me-restart-nya otomatis dan website Anda akan mati. PM2 juga menyediakan cluster mode, log management, dan zero-downtime reload.
Mengapa perlu Nginx jika Node.js sudah punya server HTTP sendiri?
Nginx diperlukan sebagai reverse proxy karena lebih efisien untuk file statis, menangani SSL/HTTPS termination, memiliki fitur rate limiting dan security headers yang matang, serta memungkinkan menjalankan beberapa aplikasi di satu server.
Bagaimana cara update aplikasi Node.js di production tanpa downtime?
Gunakan perintah pm2 reload nama-aplikasi (bukan pm2 restart). PM2 reload
melakukan rolling restart tanpa downtime, asalkan aplikasi berjalan dalam cluster mode.
Berapa spesifikasi VPS minimum untuk Node.js production?
Untuk aplikasi kecil, VPS 1 GB RAM dan 1 vCPU sudah cukup. Untuk SaaS kecil, gunakan 2 GB RAM dan 2 vCPU. Marketplace atau e-commerce membutuhkan minimal 4 GB RAM dan 2-4 vCPU.
Bagaimana cara mengamankan environment variables di production?
Jangan simpan .env di Git. Buat file .env langsung di server dan atur permission
menjadi 600. Alternatif: set variabel langsung di ecosystem.config.js PM2 atau gunakan secrets
manager untuk proyek enterprise.
Apa perbedaan pm2 restart dan pm2 reload?
pm2 restart menghentikan semua instance dulu (ada downtime singkat), kemudian
menjalankan kembali. pm2 reload melakukan rolling restart satu per satu instance
(zero-downtime). Untuk production, selalu gunakan pm2 reload.
Apakah bisa deploy Node.js ke shared hosting tanpa VPS?
Bisa, jika shared hosting mendukung Node.js via cPanel Node.js Selector. Namun VPS memberikan kontrol dan performa lebih baik untuk production serius. Shared hosting Node.js cocok untuk proyek kecil dan pemula.
Kesimpulan
Cara deploy Node.js ke VPS dengan PM2 dan Nginx yang telah kita pelajari bersama - mulai dari persiapan server, instalasi Node.js via NVM, konfigurasi PM2 sebagai process manager, setup Nginx sebagai reverse proxy, hingga pemasangan SSL gratis dengan Let's Encrypt - adalah stack deployment yang digunakan oleh ribuan developer profesional di seluruh dunia untuk menjalankan aplikasi production yang handal.
Kombinasi PM2 + Nginx + Let's Encrypt adalah standar industri yang memberikan: uptime tinggi dengan auto-restart, performa optimal dengan cluster mode, keamanan dengan HTTPS, dan kemudahan maintenance. Dengan setup ini, aplikasi Node.js Anda siap menghadapi traffic production yang sesungguhnya.
Mulai perjalanan hosting Node.js Anda dengan VPS yang tepat. Kunjungi rekomendasi VPS terbaik untuk Node.js di Indonesia untuk memilih provider yang sesuai dengan kebutuhan dan budget Anda.
Artikel Terkait
Cara Membuat Website dengan Node.js: Panduan Lengkap untuk Pemula 2026
Pelajari cara membuat website dengan Node.js dari nol. Panduan lengkap mencakup instalasi Node.js, Express.js, struktur proyek, koneksi database, hingga deploy website Node.js ke hosting Indonesia.
Baca Selengkapnya →VPS Terbaik untuk Node.js Indonesia 2026: Rekomendasi & Perbandingan
Rekomendasi VPS terbaik untuk Node.js di Indonesia 2026. Perbandingan provider VPS lokal dan internasional, spesifikasi yang dibutuhkan, cara memilih hosting Node.js yang tepat sesuai budget dan kebutuhan.
Baca Selengkapnya →Hosting Node.js Terbaik Indonesia 2026: Rekomendasi & Panduan Deploy
Rekomendasi hosting Node.js terbaik di Indonesia 2026. Panduan lengkap cara memilih, deploy aplikasi Node.js ke hosting, konfigurasi PM2 dan Nginx, serta perbandingan provider hosting Node.js terpopuler.
Baca Selengkapnya →Butuh Hosting untuk Website Anda?
Dapatkan hosting cepat, aman, dan terpercaya dengan harga terjangkau. Gratis domain, SSL, dan support 24/7.
Jangan Ketinggalan Promo!
Subscribe newsletter kami dan dapatkan diskon hingga 50% untuk pembelian pertama kamu.
Gratis, tanpa spam. Bisa unsubscribe kapan saja.