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$.
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.
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.
Para interactuar con dokku tenemos varios sistemas:
dokku
ssh -t [email protected]
.bashrc
, por ejemplo: dokku() { ssh -t [email protected] $* }
. Esto último te permitirá escribir dokku
directamente en la consola.Hasta la fecha dokku_client.sh es el que me ha dado mejor resultado, otros clientes me han dado diversos problemas.
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
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
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
En el futuro veremos también:
Genial tuto.
Te seguire de cerquita.