HOSTING CEPATDOMAIN MURAHSSL GRATISSUPPORT 24/7UPTIME 99.9%SERVER INDONESIAHOSTING CEPATDOMAIN MURAHSSL GRATISSUPPORT 24/7UPTIME 99.9%SERVER INDONESIA
Tutorial

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

Tim HostingEkspres|12 Mei 2026|15 menit baca
cara deploy nodejsdeploy nodejs ke vpspm2 nodejs tutorialnginx reverse proxy nodejsnodejs production deploymentdeploy nodejs indonesianodejs vps setup
Cara Deploy Node.js ke VPS: Panduan Lengkap Setup PM2 dan Nginx 2026
📚 Baca juga: Cara Membuat Website dengan Nodejs | Hosting Nodejs | Cara Membuat Website | Cara Membuat Blog

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:

cara deploy nodejs
Ilustrasi cara deploy nodejs
  • 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.example yang 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!

cara deploy nodejs
Ilustrasi cara deploy nodejs

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.

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.