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.
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 protected]" $ 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.
Por leonciokof el 08 de Octubre de 2013
Por gustavinho el 08 de Octubre de 2013
Por alejonext el 08 de Octubre de 2013
Lo que hace es abrir una URL (Desde ExpressJs), para cuando llegue determinada información haga un procedimiento. En este caso descarga desde Git (Repositorio), y actualiza toda los archivos que se actualizaron (Modificaron/Quitaron/Crearon).
El objetivo es hacer que la misma aplicación se actualice sin un tercero.
OJO!!! Aunque el escrito suena como un Tutorial, no lo es dado que tienes que hacer modificaciones al código, para que funcione en tu aplicación.
Es el caso del PID, mi aplicación crea automáticamente los un archivo que contiene todos los PID. Con el objetivo, de no crearlo desde el archivo que esta en '/etc/init.d/'.
Por js_toni el 28 de Junio de 2015