PM2 Node.js Deployment
PM2 process manager: start, cluster mode, ecosystem config, log management, startup.
pm2nodejsdevopsdeployment
# PM2 Node.js Deployment
## Install
```bash
npm install -g pm2
```
## Basic commands
```bash
pm2 start app.js --name api
pm2 start npm --name web -- start # npm script
pm2 stop api
pm2 restart api
pm2 delete api
pm2 list
pm2 monit # live monitor
pm2 logs api --lines 100
pm2 logs api --err
```
## Cluster mode (uses all CPU cores)
```bash
pm2 start app.js -i max # max = num CPUs
pm2 start app.js -i 4
pm2 reload api # zero-downtime reload
pm2 scale api 6 # scale to 6 instances
```
## ecosystem.config.cjs
```js
module.exports = {
apps: [
{
name: 'api',
script: 'dist/index.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'development',
PORT: 3000,
},
env_production: {
NODE_ENV: 'production',
PORT: 3000,
},
error_file: 'logs/err.log',
out_file: 'logs/out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
merge_logs: true,
},
{
name: 'worker',
script: 'dist/worker.js',
instances: 1,
cron_restart: '0 2 * * *', // restart daily at 2am
},
],
}
```
```bash
pm2 start ecosystem.config.cjs --env production
pm2 reload ecosystem.config.cjs --env production
```
## Startup on reboot
```bash
pm2 startup # generates systemd command, run it
pm2 save # save current process list
# To restore after reboot: pm2 resurrect
```
## Log rotation
```bash
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
```
## Zero-downtime deploy script
```bash
#!/bin/bash
git pull origin main
npm install --omit=dev
npm run build
pm2 reload ecosystem.config.cjs --env production
echo "Deploy done: $(date)"
```API: /api/skills/pm2-node-deploy