Dokku – Heroku
Para lograr definir con mayor facilidad de lo que se trata Dokku debemos hablar primero de Heroku.
Heroku, en esencia se puede encontrar en la categoría de los PaaS (plataforma como un servicio), es decir, el servicio que ofrecen es su plataforma o hardware como tal al igual que muchas soluciones existentes hoy en día para montar tus aplicaciones como AWS, Digital Ocean, Google Cloud Platform, entre otros.
Sin embargo, Heroku es mucho más que un VPS o un computador en la nube que puedes gestionar como cualquier otro, este se enfoca en ser una plataforma de aplicaciones, mientras otros servicios comunes te ofrecen instancias o computadores virtuales, Heroku maneja cada una de tus aplicaciones por separado de manera encapsulada.
Ventajas
Despliegue de las aplicaciones mediante el control de versiones Git, cada aplicación es un repositorio, y cada push que hagas le indicará a Heroku que debe recompilar la aplicación con los nuevos cambios y volverla a servir.
Heroku sabe que tipo de aplicación es la que estas desarrollando y soporta la mayoría de los frameworks más modernos mediante lo que se denomina paquetes de construcción o buildpacks. ¡Así es! tu solo haz push y Heroku sabrá que tipo de aplicación es y como ejecutarla, todo sin instalar ningún software dependiente.
Y ni hablar de los servicios conectados o add-ons que ofrece para que puedas conectar directamente tu base de datos, sistemas de monitoreo, y mucho más directamente a tu aplicación.
Dokku – Docker
Al observar a simple vista como es el funcionamiento de Heroku podrás notar que cada aplicación se encuentra encapsulada dentro de su propio ambiente, es aquí donde entra en juego la implementación de Docker.
Ya hablamos en dicha entrada de las ventajas y facilidades que Docker nos ofrece, ahora este enfoque combinado es el que vuelve todo más interesante.
Entonces… ¿Qué es Dokku?
Así como su nombre lo dice, es un pequeño Heroku basado en Docker, este lo puedes montar en un VPS si lo deseas y tener tu propia implementación de Heroku para manejar tus aplicaciones.
Incluso algunos proveedores como Digital Ocean ofrecen una instancia (o droplet) ya con la imagen de Dokku para que no tengas que configurar nada. Aquí tomaremos el camino “largo” y lo instalaremos manualmente.
Para el momento de este escrito la última versión estable es la
v0.2.2
y es compatible con Ubuntu 12.04 x64bit. (Existen algunos problemas con 13.10 por el momento)
Instalación
Primero nos dirigimos a nuestra instancia remota y debemos instalar una dependencias de python:
$ sudo apt-get install -y python-software-properties1 $sudo apt-get install-ypython-software-properties
Luego procedemos a instalar la última versión estable de Dokku:
$ wget -qO- https://raw.github.com/progrium/dokku/v0.2.2/bootstrap.sh | sudo DOKKU_TAG=v0.2.2 bash1 $wget-qO-https://raw.github.com/progrium/dokku/v0.2.2/bootstrap.sh | sudo DOKKU_TAG=v0.2.2 bash
Esto tomará aproximadamente 5 minutos. Dependiendo también de tu velocidad de internet claro está.
Ahora debemos acceder a nuestro gestor de DNS y crear un dominio y un subdominio tipo comodín que apunte a la dirección IP de la instancia donde se encuentra nuestro Dokku.
Suponiendo que la IP de nuestra instancia es 182.60.60.100 crearíamos los dominios algo así:
servidordokku.com ~> 182.60.60.100 *.servidordokku.com ~> 182.60.60.10012 servidordokkucom~>182.60.60.100*servidordokkucom~>182.60.60.100
Verificamos si el archivo /home/dokku/VHOST
existe y contiene dentro el host que definimos:
12 $cat dokku/VHOSTservidordokkucom
En caso de no existir el archivo, lo creamos y le escribimos manualmente el host .
Ahora desde nuestro computador de trabajo pasamos nuestras llaves SSH a la instancia asociadas al usuario:
$ cat ~/.ssh/id_rsa.pub | ssh servidordokku.com "sudo sshcommand acl-add dokku codehero"1 $cat~/ssh/id_rsapub|ssh servidordokkucom"sudo sshcommand acl-add dokku codehero"
Muy bien tenemos nuestro servidor Dokku preparado.
Prueba
Clonemos el repositorio de esta entrada en nuestros computadores, es una sencilla aplicación hecha en Node.js:
$ git clone https://github.com/codeheroco/prueba-dokku.git $ cd prueba-dokku12 $git clonehttps://github.com/codeheroco/prueba-dokku.git$cd prueba-dokku
Como mencionamos anteriormente, el despliegue de las aplicaciones en Heroku, y por consiguiente en Dokku, se hace a través de git, para ello solo debemos agregar un remoto nuevo a nuestro repositorio, uno que se encuentre en nuestro servidordokku
, probemos creando uno con el nombre prueba-dokku
:
1 $git remote add codehero dokku@servidordokkucom:prueba-dokku
Y ahora solo basta con empujar el proyecto a este nuevo repositorio:
$ git push codehero master Counting objects: 12, done. Delta compression using up to 2 threads. Compressing objects: 100% (8/8), done. Writing objects: 100% (12/12), 1.64 KiB | 0 bytes/s, done. Total 12 (delta 0), reused 0 (delta 0) -----> Building prueba-dokku ... Node.js app detected -----> Requested node range: 0.10.x -----> Resolved node version: 0.10.26 -----> Downloading and installing node -----> Writing a custom .npmrc to circumvent npm bugs -----> Installing dependencies npm http GET https://registry.npmjs.org/jade/1.3.0 npm http GET https://registry.npmjs.org/express/3.5.0 npm http 200 https://registry.npmjs.org/express/3.5.0 npm http GET https://registry.npmjs.org/express/-/express-3.5.0.tgz npm http 200 https://registry.npmjs.org/express/-/express-3.5.0.tgz npm http 200 https://registry.npmjs.org/jade/1.3.0 npm http GET https://registry.npmjs.org/jade/-/jade-1.3.0.tgz npm http 200 https://registry.npmjs.org/jade/-/jade-1.3.0.tgz ... ... ... -----> Caching node_modules directory for future builds -----> Cleaning up node-gyp and npm artifacts -----> Building runtime environment -----> Discovering process types Procfile declares types -> web -----> Releasing prueba-dokku ... -----> Deploying prueba-dokku ... -----> Cleaning up ... =====> Application deployed: http://prueba-dokku.servidordokku.com To [email protected]:prueba-dokku * [new branch] master -> master12345678910111213141516171819202122232425262728293031323334353637383940 $git push codehero master Counting objects:12,doneDelta compression using up to2threadsCompressing objects:100%(8/8),doneWriting objects:100%(12/12),1.64KiB|0bytes/s,doneTotal12(delta0),reused0(delta0)----->Building prueba-dokku Nodejs app detected----->Requested node range: 0.10.x----->Resolved node version:0.10.26----->Downloading andinstalling node----->Writingacustomnpmrc tocircumvent npm bugs----->Installing dependencies npm http GET https://registry.npmjs.org/jade/1.3.0 npm http GET https://registry.npmjs.org/express/3.5.0 npm http200https://registry.npmjs.org/express/3.5.0 npm http GET https://registry.npmjs.org/express/-/express-3.5.0.tgz npm http200https://registry.npmjs.org/express/-/express-3.5.0.tgz npm http200https://registry.npmjs.org/jade/1.3.0 npm http GET https://registry.npmjs.org/jade/-/jade-1.3.0.tgz npm http200https://registry.npmjs.org/jade/-/jade-1.3.0.tgz ----->Caching node_modules directory forfuture builds----->Cleaning up node-gyp andnpm artifacts----->Building runtime environment----->Discovering process types Procfile declares types->web----->Releasing prueba-dokku----->Deploying prueba-dokku----->Cleaning up=====>Application deployed: http://prueba-dokku.servidordokku.com Todokku@servidordokkucom:prueba-dokku *[newbranch] master->master
Podremos ver en la salida del terminal como Dokku detecta que tipo de aplicación es la que estamos empujando basándose en la estructura de los archivos y lo especificado en el Procfile
. Actualmente Dokku soporta los siguientes buildpacks.
En el
Procfile
(o archivo de procesos) se especifica que tipo de proceso se debe ejecutar, como por ejemplo uno web o un worker (sin acceso web). Ademas se le indica el comando que debe ejecutar para correr las diferentes piezas de tu aplicación, en este caso por ser una aplicación de node.js basta con ejecutar el archivo principal connode app.js
.
También podremos apreciar como Dokku se encarga de descargar las dependencias del proyecto (según se encuentran indicadas en el package.json
), por lo que el proceso de despliegue de la aplicación es totalmente automatizado.
Si abrimos nuestro navegador y nos dirigimos a prueba-dokku.servidordokku.com
podremos notar nuestra aplicación ejecutandose.
Por ello es que necesitamos el subdominio con comodín. Debido a que en nuestro servidor Dokku cada repositorio o aplicación se encuentra en un subdominio diferente con el nombre del mismo y todos deben apuntar a nuestro mismo servidor PaaS.
Conclusión
Esta semana vimos como montar nuestro propio mini Heroku, ahora podemos desplegar nuestras aplicaciones de manera rápida, segura, fácil y encapsulada, siempre basándonos en grandes herramientas como Docker, Git y Heroku. Recuerda que Dokku se encuentra para el momento de este escrito en etapas de fuerte desarrollo por lo que muy probablemente vaya mejorando y extendiendo su funcionalidad a medida que pase el tiempo y los desarrolladores continúen colaborando con el proyecto.