Pengenalan
Production deployment menggunakan PM2 (Process Manager 2) untuk menjalankan Node.js server dengan fitur enterprise-grade seperti clustering, auto-restart, load balancing, dan monitoring.
- ✅ Cluster mode (multiple instances)
- ✅ Auto-restart on crash
- ✅ Load balancing otomatis
- ✅ Zero-downtime reload
- ✅ Monitoring & logging
- ✅ Background process
Langkah 1: Install PM2
# Install PM2 globally
npm install -g pm2
# Verifikasi
pm2 --versionJika pm2 command tidak ditemukan setelah install, restart PowerShell atau tambahkan ke PATH:
# Temporary (session saja)
$env:Path += ";$env:APPDATA\npm"
# Atau restart PowerShellLangkah 2: Start Production Server
nxdom node productionPerintah ini akan:
- Membuat file
ecosystem.config.js(jika belum ada) - Start server dengan PM2 dalam cluster mode
- Menjalankan 2 instances untuk load balancing
Output
============================================
Starting Node.js Production Server (PM2)
============================================
[INFO] Creating ecosystem.config.js...
[OK] ecosystem.config.js created
[INFO] Starting PM2 process...
[PM2] Starting C:\Tnserver\www\server.js in cluster_mode (2 instances)
[PM2] Done.
┌─────┬──────────────┬─────────┬─────────┬──────────┐
│ id │ name │ mode │ status │ cpu │
├─────┼──────────────┼─────────┼─────────┼──────────┤
│ 0 │ nxdom-node │ cluster │ online │ 0% │
│ 1 │ nxdom-node │ cluster │ online │ 0% │
└─────┴──────────────┴─────────┴─────────┴──────────┘
[OK] Production server started!
[INFO] Management commands:
pm2 status
pm2 logs nxdom-node
pm2 restart nxdom-node
pm2 stop nxdom-nodeecosystem.config.js
File konfigurasi PM2 yang dibuat otomatis:
module.exports = {
apps: [{
name: 'nxdom-node',
script: './server.js',
instances: 2,
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: './logs/pm2-error.log',
out_file: './logs/pm2-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true,
autorestart: true,
watch: false,
max_memory_restart: '500M'
}]
};Konfigurasi Penting
| Property | Value | Deskripsi |
|---|---|---|
name |
nxdom-node | Nama aplikasi di PM2 |
script |
./server.js | Entry point aplikasi |
instances |
2 | Jumlah instances (cluster) |
exec_mode |
cluster | Mode eksekusi (cluster/fork) |
autorestart |
true | Auto-restart jika crash |
max_memory_restart |
500M | Restart jika memory > 500MB |
PM2 Management Commands
Status & Monitoring
# List semua processes
pm2 status
# Monitoring real-time
pm2 monit
# Logs real-time
pm2 logs nxdom-node
# Logs specific instance
pm2 logs nxdom-node --lines 100Start, Stop, Restart
# Start
pm2 start ecosystem.config.js
# Stop
pm2 stop nxdom-node
# Restart
pm2 restart nxdom-node
# Reload (zero-downtime)
pm2 reload nxdom-node
# Delete dari PM2
pm2 delete nxdom-nodeRestart via nexa
# Restart Node.js saja
nxdom restart node
# Restart PHP saja
nxdom restart php
# Restart keduanya
nxdom restart bothAuto-Start on Boot
Agar PM2 otomatis start saat server reboot:
# Save current PM2 processes
pm2 save
# Generate startup script
pm2 startup
# Ikuti instruksi yang muncul (copy-paste command)pm2-windows-startup atau Windows Task Scheduler.
Monitoring & Logs
Real-time Monitoring
pm2 monitMenampilkan dashboard real-time dengan:
- CPU usage per instance
- Memory usage per instance
- Logs streaming
- Process status
View Logs
# Logs real-time (all instances)
pm2 logs nxdom-node
# Last 100 lines
pm2 logs nxdom-node --lines 100
# Error logs only
pm2 logs nxdom-node --err
# Flush logs
pm2 flush nxdom-nodeLog Files
Logs disimpan di folder logs/:
logs/pm2-out.log- Standard outputlogs/pm2-error.log- Error output
Scaling
Menambah/Mengurangi Instances
# Scale ke 4 instances
pm2 scale nxdom-node 4
# Scale ke max (CPU cores)
pm2 scale nxdom-node max
# Scale down ke 1
pm2 scale nxdom-node 1Edit ecosystem.config.js
Untuk perubahan permanent, edit ecosystem.config.js:
module.exports = {
apps: [{
name: 'nxdom-node',
script: './server.js',
instances: 4, // Ubah dari 2 ke 4
exec_mode: 'cluster',
// ... config lainnya
}]
};Lalu restart:
pm2 restart nxdom-nodeZero-Downtime Deployment
Update code tanpa downtime:
# 1. Pull code terbaru
git pull origin main
# 2. Install dependencies (jika ada perubahan)
npm install
# 3. Reload (zero-downtime)
pm2 reload nxdom-nodepm2 reload akan:
- Restart instances satu per satu
- Tunggu instance baru ready sebelum stop instance lama
- Tidak ada request yang gagal
Environment Variables Production
Update .env untuk production:
# Production Configuration
APP_ENV=production
NODE_ENV=production
# Node.js Server
PORT=3000
PHP_SERVER=http://localhost:8000
# Database (example)
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your-secure-password
DB_NAME=nexaui_prodReverse Proxy (Nginx)
Untuk production, gunakan Nginx sebagai reverse proxy:
server {
listen 80;
server_name api.yourdomain.com;
# Node.js API
location /api/ {
proxy_pass http://localhost:3000/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# PHP API via Proxy
location /nx/ {
proxy_pass http://localhost:3000/nx/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# PHP Server (direct)
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Enable dan restart Nginx:
sudo ln -s /etc/nginx/sites-available/nexaui /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxSSL/HTTPS (Let's Encrypt)
# Install certbot
sudo apt install certbot python3-certbot-nginx
# Generate SSL certificate
sudo certbot --nginx -d api.yourdomain.com
# Auto-renewal
sudo certbot renew --dry-runPerformance Tuning
Optimal Instances
Rekomendasi jumlah instances:
| CPU Cores | Instances | Alasan |
|---|---|---|
| 1-2 cores | 2 | Minimal untuk load balancing |
| 4 cores | 3-4 | Sisakan 1 core untuk system |
| 8+ cores | max - 1 | Maximize throughput |
Memory Limit
module.exports = {
apps: [{
// ...
max_memory_restart: '500M', // Restart jika > 500MB
// Untuk high-traffic:
// max_memory_restart: '1G'
}]
};Monitoring Production
PM2 Dashboard
# Real-time dashboard
pm2 monit
# Status table
pm2 status
# Detailed info
pm2 info nxdom-nodePM2 Plus (Optional)
PM2 Plus menyediakan monitoring web-based:
# Link ke PM2 Plus
pm2 link <secret> <public>
# Dashboard: https://app.pm2.io/Backup & Restore
Save Configuration
# Save current processes
pm2 save
# Dump file: ~/.pm2/dump.pm2Restore After Reboot
# Resurrect saved processes
pm2 resurrectTroubleshooting Production
Server tidak start
pm2 logs nxdom-node --err --lines 50Common issues:
- Port sudah digunakan → ubah
PORTdi.env - Dependencies missing → jalankan
npm install - Syntax error di
server.js→ check logs untuk detail
High Memory Usage
# Check memory per instance
pm2 status
# Restart instance dengan memory tinggi
pm2 restart 0 # restart instance id 0Solusi permanent:
- Turunkan
max_memory_restartdiecosystem.config.js - Optimize code (memory leaks, caching berlebihan)
- Kurangi jumlah instances
PM2 command tidak ditemukan
pm2 : The term 'pm2' is not recognized...Solusi Windows:
# Option 1: Restart PowerShell
# Option 2: Add to PATH (temporary)
$env:Path += ";$env:APPDATA\npm"
# Option 3: Add to PATH (permanent)
[Environment]::SetEnvironmentVariable(
"Path",
[Environment]::GetEnvironmentVariable("Path", "User") + ";$env:APPDATA\npm",
"User"
)Security Best Practices
- ✅ Gunakan
NODE_ENV=productiondi production - ✅ Set
APP_ENV=productionuntuk disable uninstall - ✅ Jangan commit
.envke Git - ✅ Gunakan strong passwords untuk database
- ✅ Enable helmet middleware untuk security headers
- ✅ Implementasi rate limiting
- ✅ Gunakan HTTPS (SSL/TLS)
- ✅ Regular update dependencies
Deployment Checklist
□ Node.js installed
□ PM2 installed globally
□ nxdom install node (completed)
□ .env configured (production values)
□ APP_ENV=production
□ NODE_ENV=production
□ pm2 start ecosystem.config.js
□ pm2 save
□ pm2 startup (configured)
□ Nginx reverse proxy (configured)
□ SSL certificate (installed)
□ Firewall rules (configured)
□ Monitoring setup
□ Backup strategyWorkflow Production
Initial Deployment
# 1. Clone repository
git clone https://github.com/yourrepo/nexaui.git
cd nexaui
# 2. Install Node.js server
nxdom install node
# 3. Configure environment
cp .env.example .env
nano .env # Edit production values
# 4. Start production
nxdom node production
# 5. Save & auto-start
pm2 save
pm2 startupUpdate Deployment
# 1. Pull latest code
git pull origin main
# 2. Install/update dependencies
npm install
# 3. Reload (zero-downtime)
pm2 reload nxdom-node
# 4. Check status
pm2 status
pm2 logs nxdom-node --lines 20Rollback
Jika deployment bermasalah:
# 1. Rollback code
git log --oneline -5 # Lihat commit history
git reset --hard <commit-hash>
# 2. Reinstall dependencies
npm install
# 3. Restart
pm2 restart nxdom-nodeHealth Monitoring
Custom Health Check
Tambahkan health check endpoint di server.js:
app.get('/api/health', async (req, res) => {
try {
// Check database connection
await db.ping();
// Check PHP server
const phpHealth = await fetch(`${PHP_SERVER}/api/health`);
res.json(error);
} catch (error) {
res.status(503).json({
status: 'error',
message: error.message
});
}
});Monitoring dengan Cron
# Check health setiap 5 menit
*/5 * * * * curl -f http://localhost:3000/api/health || pm2 restart nxdom-nodeLoad Testing
Test performa server dengan autocannon:
# Install autocannon
npm install -g autocannon
# Test 10 seconds, 10 connections
autocannon -d 10 -c 10 http://localhost:3000/api/health
# Test dengan rate
autocannon -d 30 -c 100 -r 1000 http://localhost:3000/nx/testTroubleshooting Production
Server crash terus-menerus
pm2 logs nxdom-node --err --lines 100Common causes:
- Uncaught exceptions → tambahkan error handling
- Memory leak → profile dengan
node --inspect - Database connection issues → check credentials & connection pool
High CPU Usage
pm2 monit # Check CPU per instanceSolusi:
- Optimize code (infinite loops, heavy computation)
- Tambahkan caching
- Scale instances (distribute load)
- Offload heavy tasks ke worker queue
Requests timeout
Tambahkan timeout di proxy:
app.use('/nx', createProxyMiddleware({
target: PHP_SERVER,
changeOrigin: true,
pathRewrite: { '^/nx': '/api' },
timeout: 30000, // 30 seconds
proxyTimeout: 30000
}));Maintenance Mode
Untuk maintenance, buat endpoint khusus:
const MAINTENANCE_MODE = process.env.MAINTENANCE_MODE === 'true';
app.use((req, res, next) => {
if (MAINTENANCE_MODE) {
return res.status(503).json({
status: 'maintenance',
message: 'Server sedang maintenance, coba lagi nanti'
});
}
next();
});Enable maintenance:
MAINTENANCE_MODE=truepm2 restart nxdom-nodeBest Practices
- Always use PM2 di production - Jangan gunakan
node server.jslangsung - Set NODE_ENV=production - Untuk optimasi performance
- Use cluster mode - Untuk load balancing & high availability
- Monitor logs regularly - Deteksi masalah sebelum jadi besar
- Setup auto-restart - PM2 startup untuk reboot server
- Use Nginx reverse proxy - Untuk SSL, caching, static files
- Regular backups - Database, code, dan PM2 config
- Update dependencies - Security patches & bug fixes
Next Steps
- Setup monitoring dengan PM2 Plus atau Grafana
- Implementasi CI/CD pipeline
- Setup database replication
- Tambahkan Redis untuk caching
- Implementasi WebSocket untuk real-time features