Comunidad de diseño web y desarrollo en internet online

Deploy e instalación de Node.js en servidor

He buscado muchísimo cómo hacer Deploy en Node.Js y que cuando se hagan cambio a un repositorio se actualice la aplicación. Por eso me he animado a hacer una especie de tutorial para compartir a la comunidad.

Sólo aplica para las personas que tiene su propio servidor.


Qué características se necesitan?


En el OS

Yo recomiendo tener el servidor en diestro basados en Ubuntu o Debian, por la cantidad de foros e información que se puede conseguir.

Software adicional

Estamos hablando de Nodejs, por ende lo instalaremos. Tengan cuidado con las versiones que ustedes están trabajando.

Código :

sudo apt-get install python-software-properties 
sudo add-apt-repository ppa:chris-lea/node.js 
sudo apt-get update 
sudo apt-get install nodejs

Listo!, si todo sale bien podremos colocar `$ nodejs -v`, y nos va salir la versión de la instalación.

Si vamos a instalar bases de datos, preferiblemente no lo hagamos desde los repositorios de Ubuntu/Debian, sino directamente de los desarrolladores, porque generalmente los repositorios de Ubuntu/Debian tienen un par de versiones anteriores, y eso no es tan bueno.

Software para daemons

Un daemon, es un proceso en Linux, para siempre; eso quiere decir que jamás se va a morir. Imagina algo como Dropbox en tu PC o Skype. Existen varios creados en NodeJs.

Generador de Daemons en Nodejs


Existen dos muy buenos generadores de daemons: `forever` y `nodemon`, en lo personal me gusta mas `nodemon`.

Veamos ahora cómo ejecutarlos.

Código :

#!/bin/bash
DIR=/srv/data/app // Donde se encuentra la APP
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NODE_PATH=/usr/lib/node_modules // Los modulos de Nodejs
NPM_PATH=/usr/bin/npm // El NPM
NODE=/usr/bin/nodejs // Node
NODEMON=/usr/local/bin/nodemon // Nodemon o forever
NAME=mi_app // Nombre de la aplicion en el servidor

test -x $NODE || exit 0
test -x $NODEMON || exit 0

function start_app { // Cuando le demos star esto es lo que va hacer
  "cd $DIR" 
  $NODEMON "server.js" 1>>"/var/log/$NAME.sys.log" 2>&1 &
}

function stop_app {
  kill `cat $DIRTMP/$NAME.pid` // Metodo de matar la aplicacion
}

case $1 in
  start)
    start_app
    ;;
  stop)
    stop_app
    ;;
  restart)
    stop_app // Cuando le demos restart va a instalar todas las dependecias ;)
    $NPM_PATH "install $DIR" 1>>"/var/log/$NAME.install.log" 2>&1 &
    sleep 10
    start_app
    ;;
  *)
    echo "usage: $NAME {start|stop|restart}" ;;
esac
exit 0


Este pedazo de código lo guardamos sin extensión en la carpeta `/etc/init.d/`, con el nombre de la aplicación para que podamos hacer:

Código :

$ [sudo] service miapp start


Ya pusimos a correr nuestra aplicación!

Traer la app al servidor y actualizaciones


Aquí viene la parte interesante! Vamos a instalar Git, que es el mas usado!

Código :

$ [sudo] apt-get install git


Ahora le crearemos llaves de acceso a nuestro repositorio.

Código :

$ ssh-keygen -t rsa -C "email_admin@midominio.com"
$ ssh-add id_rsa // Seguiremos el procedimiento SIN CONTRASEÑA!
$ cat ~.shh/id_rsa


Copiaremos lo que nos muestra, e iremos a nuestro repositorio, después a la configuración y finalmente a `Deploy keys`, la agregamos y probaremos si funciona. Si funciona traeremos todo el proyecto con `git pull`. Listo, ya puede correr nuestra aplicación!

Actualizaciones


Existen dos métodos, el primero entramos al servidor y actualizamos. El segundo, el mismo (Servidor) actualiza todo! Yo opto siempre por el primero, dígase la ley del menor esfuerzo!

Lo haremos de la siguiente forma, en la configuración del repositorio le vamos a dar 'Service Hooks' o solo 'Hooks', esto es un servicio que hará algo en el momento que nosotros hagamos una actualización, un 'pull' o 'commit'.

Bueno soy de las personas que ama y adora el servicio de `POST`, es un servicio que hace un llamado a X dirección en post y envía el `pull`, pero solo envía la información no el código! Allí podremos generarle una extensión a nuestra app. Algo así:

Código :

app.post('/deploy', function(req, res, next){
   if(req.body.proviver == 'NuestroProvedor'){
    var spawn = require('child_process').spawn,
         git  = spawn('git', ['pull']);
    git.on('close', function (code, signal) {
       console.log('child process terminated due to receipt of signal '+signal);
       res.json({ mesg : code });
    });
   }
});


Listo, ahora se actualiza automáticamente nuestra aplicación. Después que haga el llamado, tendrán que contar aproximadamente 2 a 5 segundos que es el tiempo que la web estará caída. La verdad estoy trabajando para reducir ese tiempo a 0.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate