PM2 como systemd — forçar a versão do Node.js
Quando o PM2 é iniciado pelo systemd, ele não lê o ~/.bashrc como uma sessão SSH interactiva. O node vem do PATH da unidade [Service], a menos que fixes interpreter no ecosystem.
Se o npm / EBADENGINE ainda mostra Node antigo mas no SSH o nvm mostra Node novo, causas típicas:
- O
PATHdo systemd ainda tem/usr/binantes dobindo nvm. - O nvm só está no
.bashrc, e shells não-interactivos saem do.bashrclogo no início — logosudo -u coaching bash -lc 'node -v'não carrega nvm e usa/usr/bin/nodeda distro.
nvm — porque sudo … bash -lc mostra Node 20 e o SSH mostra Node 24
SSH interactivo corre bash interactivo → .bashrc completo → nvm carrega.
bash -lc 'cmd' é login mas não-interactivo. No Ubuntu/Debian, ~/.profile muitas vezes faz source ao .bashrc. O .bashrc por defeito começa com “se não for interactivo, return”, logo o nvm não corre e command -v node é /usr/bin/node.
Testar como o systemd (não-interactivo)
sudo -u coaching -H bash -lc 'command -v node && node -v'
Testar com nvm (o que esperas)
Shell interactivo:
sudo -u coaching -H bash -lic 'command -v node && node -v'
Ou uma linha com source do nvm:
sudo -u coaching -H bash -lc 'export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" && command -v node && node -v'
Corrigir o .profile (opcional)
Edita /home/coaching/.profile: carrega o nvm antes do bloco que faz source ao .bashrc, para que mesmo quando o .bashrc faz return cedo, o nvm já esteja no PATH.
Acrescenta por cima de qualquer source ~/.bashrc:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
Confirma:
sudo -u coaching -H bash -lc 'command -v node && node -v'
1. PATH para o systemd (recomendado)
Não dependas do nvm dentro do systemd. Mete o bin da versão à frente no PATH da unidade, por exemplo:
/home/coaching/.nvm/versions/node/v24.15.0/bin
(Ajusta a pasta se instalares outra versão com nvm install.)
Drop-in
sudo systemctl edit pm2-coaching.service
[Service]
Environment=PATH=/home/coaching/.nvm/versions/node/v24.15.0/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
sudo systemctl daemon-reload
sudo systemctl restart pm2-coaching.service
2. Confirmar PM2
sudo -u coaching -H env PATH=/home/coaching/.nvm/versions/node/v24.15.0/bin:/usr/bin:/bin bash -lc 'node -v && pm2 describe coaching'
3. À prova de falhas: interpreter no ecosystem
interpreter: '/home/coaching/.nvm/versions/node/v24.15.0/bin/node',
Depois pm2 reload ecosystem.config.cjs --update-env e pm2 save.
4. Dump antigo do PM2
sudo -u coaching -H bash -lic 'cd /var/www/coaching && pm2 delete coaching && pm2 start ecosystem.config.cjs && pm2 save'
Exemplo no repositório
documentation/examples/systemd/pm2-node-path.conf.example.