Nxdom Framework

Nusantara eXtreme Development Object Model — dokumentasi resmi

Production Deployment v2.0.0

Deploy Node.js ke Production — Panduan lengkap deployment Node.js server ke production dengan PM2, clustering, auto-restart, dan monitoring.

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.

Fitur Production:
  • ✅ 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 --version
Windows PowerShell:

Jika pm2 command tidak ditemukan setelah install, restart PowerShell atau tambahkan ke PATH:

# Temporary (session saja) $env:Path += ";$env:APPDATA\npm" # Atau restart PowerShell

Langkah 2: Start Production Server

nxdom node production

Perintah ini akan:

  1. Membuat file ecosystem.config.js (jika belum ada)
  2. Start server dengan PM2 dalam cluster mode
  3. 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-node

ecosystem.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 100

Start, 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-node

Restart via nexa

# Restart Node.js saja nxdom restart node # Restart PHP saja nxdom restart php # Restart keduanya nxdom restart both

Auto-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)
💡 Windows: PM2 startup di Windows memerlukan setup tambahan. Gunakan pm2-windows-startup atau Windows Task Scheduler.

Monitoring & Logs

Real-time Monitoring

pm2 monit

Menampilkan 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-node

Log Files

Logs disimpan di folder logs/:

  • logs/pm2-out.log - Standard output
  • logs/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 1

Edit 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-node

Zero-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-node

pm2 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_prod

Reverse 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 nginx

SSL/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-run

Performance 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-node

PM2 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.pm2

Restore After Reboot

# Resurrect saved processes pm2 resurrect

Troubleshooting Production

Server tidak start

pm2 logs nxdom-node --err --lines 50

Common issues:

  • Port sudah digunakan → ubah PORT di .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 0

Solusi permanent:

  • Turunkan max_memory_restart di ecosystem.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=production di production
  • ✅ Set APP_ENV=production untuk disable uninstall
  • ✅ Jangan commit .env ke 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 strategy

Workflow 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 startup

Update 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 20

Rollback

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-node

Health 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-node

Load 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/test

Troubleshooting Production

Server crash terus-menerus

pm2 logs nxdom-node --err --lines 100

Common 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 instance

Solusi:

  • 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=true
pm2 restart nxdom-node

Best Practices

  1. Always use PM2 di production - Jangan gunakan node server.js langsung
  2. Set NODE_ENV=production - Untuk optimasi performance
  3. Use cluster mode - Untuk load balancing & high availability
  4. Monitor logs regularly - Deteksi masalah sebelum jadi besar
  5. Setup auto-restart - PM2 startup untuk reboot server
  6. Use Nginx reverse proxy - Untuk SSL, caching, static files
  7. Regular backups - Database, code, dan PM2 config
  8. 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