Introducción a Dokku

Dokku se autodefine y con razón como:

Docker powered mini-Heroku. The smallest PaaS implementation you've ever seen.

En un servidor de apenas 5$ o 10$ puedes montarte un pequeño mini heroku, la única pega es que si necesitas escalar necesitarás una maquina más grande, no puedes añadir más nodos como podrías hacer con otros sistemas mas complejos.

Para probarlo puedes crear un droplet en Digital Oean ya que viene como 1-Click app o seguir las instrucciones de instalación.

Si usas DigitalOcean no olvides añadir tu clave publica al droplet.

Por cierto si te registras con este enlace en Digital Ocean tu ganas 10$ y yo 25$.

Aviso

Este tutorial no pretende documentar todas las opciones de dokku si no servir como guía para desplegar una aplicación Rails sencilla, cada opción nueva que descubras tendrá comandos relacionados que te aconsejo que busques en la documentación oficial.

Configurar dokku

Una vez instalado dokku tendremos que configurarlo, visita la ip del servidor con el navegador.

Tendrás que poner tu clave publica, posiblemente ya venga rellena y decidir como vas a exponers las aplicaciones.

El sistema que menos problemas me ha dado ha sido el de exponer por hostname, si no tienes ningún dominio disponible puedes usar xip.io de tal manera que si la ip del servidor es 55.55.55.55 el hostname será 55.55.55.55.xip.io.

Prueba a cargar en el navegador esa dirección antes de guardar.

Interactuar con dokku

Para interactuar con dokku tenemos varios sistemas:

Hasta la fecha dokku_client.sh es el que me ha dado mejor resultado, otros clientes me han dado diversos problemas.

Desplegar tu primera app

Puedes desplegar cualquier app en cualquier lenguaje o framework soportado por heroku, pero es mejor que empieces por algo sencillo, en este tutorial voy a desplegar esta app de ejemplo: tutoronrails/demo-commentable

Podemos crear la aplicación en dokku con:

$ ssh -t [email protected] apps:create demo-commentable

Luego tendremos que añadir dokku como remote a nuestro repo:

$ git remote add dokku [email protected]:demo-commentable

Y desplegamos

$ git push dokku master

Dokku detectará que es una aplicación Rails y empezará a descargarse los recursos que necesite y lanzar los procesos necesarios.

Tratando de instalar ruby es muy posible que te de un error como este:

       !     Debug InformationCommand: 'set -o pipefail; curl -L --fail --retry 5 --retry-delay 1 --connect-timeout 5 --max-time 30 https://s3-external-1.amazonaws.com/heroku-buildpack-ruby/cedar-14/ruby-2.3.2.tgz -s -o - | tar zxf - ' failed unexpectedly:
       !

Este error viene recogido en la documentación

Se soluciona con:

$ ssh -t [email protected] config:set --global CURL_TIMEOUT=600
$ ssh -t [email protected] config:set --global CURL_CONNECT_TIMEOUT=30

Si intentamos desplegar de nuevo debería funcionar sin problemas.

$ git push dokku master

Al rato la aplicación se habrá desplegado sin problemas y te monstrará los dominios en los que está accesible. Pero si tratas de entrar dará error, lógico, intenta conectarse a una base de datos y no hay ninguna disponible.

Lo puedes comprobar en los logs:

$ ssh -t [email protected] logs demo-commentable

Bases de datos

Dokku tiene disponible a través de plugins una gran variedad de bases de datos: Postgres, Mysql, Redis, Memcache, Mongo, Elasticsearch...

En este caso necesitamos una instancia de Postgres, así que instalamos el plugin dokku-postgres.

Para instalar plugins necesitamos sudo por lo que tendremos que acceder al servidor por ssh y ejecutamos:

$[server]> $ sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres

Y ya desde nuestra máquina local creamos una instancia de postgres y la vinculamos a nuestra app.

$ ssh -t [email protected] postgres:create demo-commentable
$ ssh -t [email protected] postgres:link demo-commentable demo-commentable

Yo le suelo dar el mismo nombre a la instancia de la base de datos y a la app pero no tiene que ser así.

Podemos comprobar que se ha añadido una nueva variable de entorno a nuestra aplicación.

$ ssh -t [email protected] config demo-commentable

Ahora tenemos que cargar el schema o correr migraciones y cargar los seeds.

$  ssh -t [email protected] run demo-commentable rake db:schema:load db:seed

Ejecutar comandos y variables de entorno

Y ya tenemos nuestra aplicación funcionando.

A partir de ahora desplegar nuevas versiones solo requiere de git push dokku y eventualmente ejecutar alguna migración con run

Para acceder a la consola o ejecutar cualquier otro comando también usaremos run:

$  ssh -t [email protected] run rails console

Heroku cuando detecta una aplicación ruby configura las variables de entorno RACK_ENV y RAILS_ENV con el valor production y algunas aplicaciones ruby dependen de estas variables por lo que también suelo ponerlas.

$ ssh -t [email protected] config:set demo-commentable RACK_ENV=production RAILS_ENV=production

Proximos pasos

En el futuro veremos también:


Comentarios

hace over 2 years

Genial tuto.
Te seguire de cerquita.