Volvemos con una pregunta interesante ¿Como desplegamos nuestra aplicación nodejs como un servicio en nuestra máquina de producción? El proyecto en el que estoy trabajando es un requisito que el servidor de nodejs arranque con el sistema empezando a leer los sensores proporcionando la información a la aplicación cliente que se conecte al websocket que abre el servidor. El objetivo es que no deban de arrancar el servicio y que este se levante automáticamente solo en caso de caerse por algún tipo de error.
En Linux existen distintas vertientes y estrategias de arranques de los servicios, pero hoy voy a hablar de Upstart, que es una estrategia basada en eventos para el demonio init, el cual es el encargado de arrancar todos los servicios necesarios para el funcionamiento del sistema operativo. Upstart se encarga de lanzar todas las tareas necesarias para el arranque del sistema por lo que podemos engancharnos a él pudiendo crear nuestras propias tareas, de tal manera arrancar nuestro servicio al arranque del sistema.
Configurando nuestro servicio nodejs
Para hacer que nuestro server se comporte como un servicio del sistema y podamos arrancarlo, pararlo, reiniciarlo, ver su estado, acceder a su log debemos de definir este servicio con Upstart implementando un script que incluiremos en /etc/init. El fichero debe de tener una extensión .conf , por ejemplo miapp.conf. A continuación os dejo un script de prueba como ejemplo de configuración de este un servicio nodejs.
description "daemon for my node app"
author "me"
env LOG_FILE= /var/log/node/miapp.log
env APP_DIR= /var/node/miapp
env APP= server.js
env PID_NAME= miapp.pid
env USER= root
env GROUP= www-data
env POST_START_MESSAGE_TO_LOG="miapp ha sido iniciada."
env NODE_BIN= /usr/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="prod"
# Arranca cuando el sistema esta cargado
start on runlevel [2345]
# Se detiene cuando el sistema se apague
stop on runlevel [016]
#Levanta el proceso automáticamente si se muere
respawn
# Limitamos el "respawn" a xveces con un timeout T de 5s para que no intente levantar el proceso infinitamente.
respawn limit X T
pre-start script
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> $LOG_FILE
mkdir -p $PID_PATH
mkdir -p /var/log/node
end script
pre-stop script
rm /var/run/yourprogram.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> $LOG_FILE
end script
script
export NODE_ENV=$SERVER_ENV
exec start-stop-daemon --start --chuid $USER:$GROUP</span> --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE2>&1
end script
Puedes ejecutar el servicio en cualquier momento con: sudo service start miservice. Automaticamente arrancara el servicio y podrás ver la salida del log en el directorio configurado y nuestro servidor nodejs corriendo.