Ir para o conteúdo

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:

  1. O PATH do systemd ainda tem /usr/bin antes do bin do nvm.
  2. O nvm só está no .bashrc, e shells não-interactivos saem do .bashrc logo no início — logo sudo -u coaching bash -lc 'node -v' não carrega nvm e usa /usr/bin/node da 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.