Deploy Node.js — Node.js

Deploy adalah proses mempublikasikan aplikasi ke server agar bisa diakses user. PM2 — Process Manager untuk Node.js: // Install global: npm install -g pm2 // Ja

Deploy adalah proses mempublikasikan aplikasi ke server agar bisa diakses user.

PM2 — Process Manager untuk Node.js:

// Install global: npm install -g pm2

// Jalankan aplikasi
// pm2 start app.js --name "my-app"

// Monitoring
// pm2 status        → lihat semua proses
// pm2 logs          → lihat log real-time
// pm2 restart my-app → restart aplikasi
// pm2 stop my-app   → hentikan aplikasi

// Ecosystem file (ecosystem.config.cjs):
module.exports = {
  apps: [{
    name: "my-app",
    script: "src/app.js",
    instances: "max",     // Gunakan semua CPU cores
    exec_mode: "cluster", // Mode cluster
    env_production: {
      NODE_ENV: "production",
      PORT: 3000,
    },
  }],
};
// pm2 start ecosystem.config.cjs --env production

Docker untuk Node.js:

# Dockerfile
FROM node:20-alpine

WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .

EXPOSE 3000
USER node
CMD ["node", "src/app.js"]

docker-compose.yml:

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://db:5432/myapp
    depends_on:
      - db
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: secret

Health check endpoint:

app.get("/health", (req, res) => {
  res.json({
    status: "ok",
    uptime: process.uptime(),
    timestamp: new Date().toISOString(),
  });
});

Graceful shutdown — tutup koneksi dengan rapi:

process.on("SIGTERM", async () => {
  console.log("SIGTERM received. Shutting down gracefully...");
  server.close(() => {
    console.log("HTTP server closed");
  });
  await db.end(); // Tutup koneksi database
  process.exit(0);
});

Logging di production:

import winston from "winston";

const logger = winston.createLogger({
  level: "info",
  format: winston.format.json(),
  transports: [
    new winston.transports.File({ filename: "error.log", level: "error" }),
    new winston.transports.File({ filename: "combined.log" }),
  ],
});

Zero-downtime deployment:

Checklist deploy production:

  1. Set NODE_ENV=production
  2. Gunakan HTTPS (SSL/TLS)
  3. Health check endpoint
  4. Graceful shutdown handler
  5. Logging terstruktur (JSON)
  6. Rate limiting & security headers
  7. Environment variables untuk secrets
  8. Database migration otomatis

Yang akan kamu pelajari