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:
- PM2 cluster mode +
pm2 reload(restart satu per satu) - Docker: rolling update dengan
docker-compose up --no-deps -d app - Kubernetes: rolling deployment strategy
Checklist deploy production:
- Set
NODE_ENV=production - Gunakan HTTPS (SSL/TLS)
- Health check endpoint
- Graceful shutdown handler
- Logging terstruktur (JSON)
- Rate limiting & security headers
- Environment variables untuk secrets
- Database migration otomatis