$ -weight: 500;">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/-weight: 500;">install.sh | bash
-weight: 500;">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/-weight: 500;">install.sh | bash
-weight: 500;">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/-weight: 500;">install.sh | bash
source ~/.bashrc
source ~/.bashrc
source ~/.bashrc
nvm --version
# 0.40.1
nvm --version
# 0.40.1
nvm --version
# 0.40.1
# Install LTS
nvm -weight: 500;">install --lts # Or a specific version
nvm -weight: 500;">install 20.18.0 # Set default — without this, new shells may pick a different version
nvm alias default 20.18.0 # Verify
node -v && -weight: 500;">npm -v
# Install LTS
nvm -weight: 500;">install --lts # Or a specific version
nvm -weight: 500;">install 20.18.0 # Set default — without this, new shells may pick a different version
nvm alias default 20.18.0 # Verify
node -v && -weight: 500;">npm -v
# Install LTS
nvm -weight: 500;">install --lts # Or a specific version
nvm -weight: 500;">install 20.18.0 # Set default — without this, new shells may pick a different version
nvm alias default 20.18.0 # Verify
node -v && -weight: 500;">npm -v
/home/deploy/.nvm/versions/node/v20.18.0/bin/node
/home/deploy/.nvm/versions/node/v20.18.0/bin/node
/home/deploy/.nvm/versions/node/v20.18.0/bin/node
-weight: 500;">npm -weight: 500;">install -g pm2
-weight: 500;">npm -weight: 500;">install -g pm2
-weight: 500;">npm -weight: 500;">install -g pm2
~/.nvm/versions/node/v20.18.0/bin/pm2
~/.nvm/versions/node/v20.18.0/bin/pm2
~/.nvm/versions/node/v20.18.0/bin/pm2
pm2 --version
pm2 --version
pm2 --version
pm2 startup systemd
pm2 startup systemd
pm2 startup systemd
-weight: 600;">sudo env PATH=$PATH:/home/deploy/.nvm/versions/node/v20.18.0/bin \ /home/deploy/.nvm/versions/node/v20.18.0/lib/node_modules/pm2/bin/pm2 \ startup systemd -u deploy --hp /home/deploy
-weight: 600;">sudo env PATH=$PATH:/home/deploy/.nvm/versions/node/v20.18.0/bin \ /home/deploy/.nvm/versions/node/v20.18.0/lib/node_modules/pm2/bin/pm2 \ startup systemd -u deploy --hp /home/deploy
-weight: 600;">sudo env PATH=$PATH:/home/deploy/.nvm/versions/node/v20.18.0/bin \ /home/deploy/.nvm/versions/node/v20.18.0/lib/node_modules/pm2/bin/pm2 \ startup systemd -u deploy --hp /home/deploy
pm2 kill
rm -f ~/.pm2/dump.pm2
# -weight: 500;">start your apps again (covered in Part 2)
pm2 save
pm2 kill
rm -f ~/.pm2/dump.pm2
# -weight: 500;">start your apps again (covered in Part 2)
pm2 save
pm2 kill
rm -f ~/.pm2/dump.pm2
# -weight: 500;">start your apps again (covered in Part 2)
pm2 save
pm2 -weight: 500;">install pm2-logrotate pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
pm2 set pm2-logrotate:workerInterval 30
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
pm2 -weight: 500;">install pm2-logrotate pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
pm2 set pm2-logrotate:workerInterval 30
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
pm2 -weight: 500;">install pm2-logrotate pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 10
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
pm2 set pm2-logrotate:workerInterval 30
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
pm2 conf pm2-logrotate
pm2 conf pm2-logrotate
pm2 conf pm2-logrotate
# /etc/logrotate.d/pm2-myapp
/home/deploy/.pm2/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty copytruncate
}
# /etc/logrotate.d/pm2-myapp
/home/deploy/.pm2/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty copytruncate
}
# /etc/logrotate.d/pm2-myapp
/home/deploy/.pm2/logs/*.log { daily missingok rotate 14 compress delaycompress notifempty copytruncate
}
pm2 -weight: 500;">status # list all managed processes
pm2 logs # tail all logs
pm2 logs myapp # tail specific app
pm2 monit # real-time CPU/memory dashboard
pm2 reload myapp # zero-downtime reload (cluster mode)
pm2 -weight: 500;">restart myapp # hard -weight: 500;">restart
pm2 -weight: 500;">stop myapp # -weight: 500;">stop without removing
pm2 delete myapp # -weight: 500;">stop and -weight: 500;">remove from list
pm2 save # persist process list
pm2 resurrect # restore saved list
pm2 -weight: 500;">status # list all managed processes
pm2 logs # tail all logs
pm2 logs myapp # tail specific app
pm2 monit # real-time CPU/memory dashboard
pm2 reload myapp # zero-downtime reload (cluster mode)
pm2 -weight: 500;">restart myapp # hard -weight: 500;">restart
pm2 -weight: 500;">stop myapp # -weight: 500;">stop without removing
pm2 delete myapp # -weight: 500;">stop and -weight: 500;">remove from list
pm2 save # persist process list
pm2 resurrect # restore saved list
pm2 -weight: 500;">status # list all managed processes
pm2 logs # tail all logs
pm2 logs myapp # tail specific app
pm2 monit # real-time CPU/memory dashboard
pm2 reload myapp # zero-downtime reload (cluster mode)
pm2 -weight: 500;">restart myapp # hard -weight: 500;">restart
pm2 -weight: 500;">stop myapp # -weight: 500;">stop without removing
pm2 delete myapp # -weight: 500;">stop and -weight: 500;">remove from list
pm2 save # persist process list
pm2 resurrect # restore saved list - ✅ NVM installed with a pinned Node.js version
- ✅ PM2 installed globally via NVM
- ✅ Startup script registered — apps survive reboots
- ✅ Log rotation configured — no disk space surprises