Antecedentes
Tenemos 2 webs montadas en un servidor con PM2 con NodeJS 12, donde una tiene 8 instancias y la otra 2. Estas dos webs son dos aplicaciones en Angular usando SSR a través de Angular Universal.
Ahora lo que necesitamos es desplegar una nueva aplicación web, también en Angular usando SSR con Angular Universal, pero esta nueva web está en una versión más reciente de Angular, que a su vez requiere de una versión más reciente de NodeJS. Por tanto necesitamos poder desplegar esta versión sin necesidad de subir de versión las otras webs, debemos poder tener diferentes versiones, ya que no siempre será posible tener todo al mismo nivel.
En nuestro servidor tenemos instalado, además de PM2, NodeJS 12. Pero en un primer momento no teníamos instalado NVM.
Spoiler
Aunque conseguimos configurar PM2 como necesitamos, no consideramos que sea la solución ideal, y de hecho lo vamos a cambiar. Nuestra idea es dockerizar cada una de las aplicaciones de forma que cada aplicación tenga su propio contenedor en Docker y sean totalmente independentes entre ellas, aunque las despleguemos en el mismo servidor.
Instalación de NVM
Nuestro primer punto fue instalar NVM, si necesitas varias versiones de NodeJS en el mismo equipo es la mejor opción que hay, y de hecho así trabajamos en nuestros equipos locales sin ningún problema.
Como instalar NVM en tu máquina Linux lo puedes ver en su propia página web.
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
Una vez instalado nvm tenemos que instalar la versión concreta que queramos con el comando nvm install.
Asociar versión de NodeJS en PM2
Viendo documentación de PM2 y diferentes blogs parece que la solución será tan sencilla como incluir esta línea en la configuración de nuestra nueva aplicación dentro del fichero de configuración de PM2.
interpreter : "[email protected]"
Al hacer este cambio y reiniciar PM2 nos encontramos con este error:
[PM2][ERROR] NVM is not available in PATH
[PM2][ERROR] Fallback to node in PATH
[PM2][ERROR] Install NVM:
$ curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash
Y nuestra aplicación con status “errores”
Por tanto, no nos vale. Lo que tenemos que hacer es indicarle al interpreter la ruta exacta del node que queremos ejecutar. En nuestro caso:
interpreter : "/root/.nvm/versions/node/v18.12.1/bin/node",
Modo de ejecución
Seguramente verás que sigue sin ir. O PM2 te muestra una advertencia indicando que no se puede cambiar la versión de node en modo cluster o haciendo un pm2 show [id] ves que no ha cambiado la versión de node. Esto es porque para cambiar una versión de node concreta la aplicación se debe ejecutar en modo fork, por tanto tendrás que añadir esta configuración a tu aplicación:
exec_mode: "fork",
Configuración final
Y finalmente nos funciona con esta configuración:
{
name : "DAD-front-angular-pruebas",
cwd : "[path]",
script : "[path]",
instances: 2,
interpreter : "/root/.nvm/versions/node/v18.12.1/bin/node",
exec_mode: "fork",
env :{
"NODE_ENV":"test",
}
}