Variables de entorno y docker

Después de un tiempo definiendo distintos contenedores docker y coordinando despliegues con docker compose me he encontrado con circunstancias que me obligaban a modificar los archivos de definición cada vez que necesitaba hacer un nuevo despliegue o paso a producción y eso, bueno, eso es un poco molesto. Así que sabiendo que la gente que ha desarrollado todo esto era más lista que yo me puse a buscar cómo proponen que lo hagamos.

Y la respuesta es… Mediante varibles de entorno (al menos una de ellas), así que vamos a ver cómo podemos, como ejercicio, poner el número de versión de nuestro despliegue como varible de entorno..

Uno de mis docker-composes tenía este aspecto:

    web-php:
        container_name: web-php
        build: .
        image: nexus.biblioetech.com/biblioeteca/nomorepass:1.0.0
        ports:
            - "80:80"
        environment: 
            DBHOST: "db"
        links:
            - "web-mysql:db"

Como véis el número de versión acompañaba al nombre de la imagen y esto es así para que al construirla ya llevase la etiqueta adecuada para subirla al repositorio privado. El problema era que cada vez que hacíamos una release nueva teníamos que tocar este archivo a mano… Si queremos no tener que tocar el archivo tenemos que poner algo así:

    web-php:
        container_name: web-php
        build: .
        image: nexus.biblioetech.com/biblioeteca/nomorepass:${VERSION}
        ports:
            - "80:80"
        environment: 
            DBHOST: "db"
        links:
            - "web-mysql:db"

De esta forma solo hay que definir la varible de entorno VERSION al valor que acabamos de generar. Ahora bien, es fácil que nos olvidemos de asignar esta variable de entorno si no está en ningún sitio del repositorio, así que lo más sencillo es incluirla en un archivo .env que será el que docker-compose cargue antes de ejectuar el build… Y quedaría así:

VERSION=1.0.0

En este archivo podemos incluir todas las variables que necesitemos y, lo que es más, podremos pasarselas al Dockerfile si lo necesitamos, eso si, el método es un poco más rebuscado (eso lo veremos un poco más adelante).

Mover el directorio docker en ubuntu

Usar docker es sencillo y rápido, pero, como todo, tienes que tener cuidado con todo lo que ocupa espacio ya que los discos y las particiones son finitas… Y los contendores docker ocupan espacio (bastante), así que aquí dejo el método para mover el directorio de datos de la partición por defecto a otra cualquiera que queramos y para la que tengamos espacio de sobra.

Docker y ubuntu

Lo primero que hay que saber es que el directorio por defecto donde docker guarda sus imágenes, contenedores y demás cosas que ocupan espacio es:

/var/lib/docker

Que, generalmente, está en la partición raiz (o la que tengamos para var) que no suele ser muy grande. Supongamos que queremos moverla a un disco de datos con capacidad suficiente como este:

/mnt/disks/data/docker

Para ello lo que tendremos que hacer es: parar el servicio docker

sudo service docker stop

Crear un archivo llamado daemon.json en el directorio /etc/docker con este contenido:

{ 
   "graph": "/path/to/your/docker" 
}

Copiamos el directorio original al nuevo y lo renombramos por seguridad (ya lo borraremos después)

sudo rsync -aP /var/lib/docker/ /path/to/your/docker
sudo mv /var/lib/docker /var/lib/docker.old

Reiniciamos el servicio docker y todo debería estar como antes del cambio (podéis comprobar con un docker ps si se ha levantado todo lo que teníais funcionando antes).

sudo service docker start

Después de comprobar que todo está ok, ya podemos borrar el original y habremos terminado con la operación del todo:

sudo rm -rf /var/lib/docker.old

Instalar un servidor de correo con docker

Hace tiempo que vengo mirando la tecnología de contenedores con interés, la verdad es que desde hace mucho tiempo el trabajo más ingrato, después de haber terminado un desarrollo, era configurar el servidor donde se iba a ejecutar finalmente. No basta con saber el sistema operativo, necesitas instalar una miriada de dependecias y de versiones de software que no siempre se encuentra en la versión que usaste para el desarrollo. Docker promete poder replicar entornos completos mediante una virtualización parcial y eso me parece muy, muy interesante.

Aunque no entraré al análisis profundo de cómo funciona docker, por el momento, si que veremos un ejemplo práctico de una tarea muy habitual como administrador de sistemas, configurar un servidor de correo con todos los servicios habituales. Para ello vamos a utilizar una máquina virtual (no sirve cualquiera, hay sistemas de virtualización que no se llevan bien con docker, en mi caso usé un VPS de OVH después de desechar otros dos de strato y webserver4you). Nuestra máquina virtual tiene un ubuntu 14.04… Al lío.

Lo primero que hay que hacer es instalar docker. Por suerte esto es bastante sencillo:

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
sudo apt-get install docker-engine

Con esto ya tendremos docker en la máquina. Podemos probarlo:

sudo service docker start
sudo docker run hello-world

Si no queremos andar usando sudo para cada comando, añadiremos nuestro usuario al grupo de docker:

sudo groupadd docker
sudo usermod -aG docker $USER

Ahora usaremos Poste.io como contenedor de nuestro servidor de correo. Es una solución simplemente completa y muy sencilla de instalar y configurar. En nuestro caso lo único que hay que hacer para ponerlo a funcionar es crear un directorio (en mi caso /home/mail/data) y ejecutar lo siguiente:

docker run \
-p 25:25 \
-p 81:80 \
-p 110:110 \
-p 143:143 \
-p 8443:443 \
-p 465:465 \
-p 587:587 \
-p 993:993 \
-p 995:995 \
-v /etc/localtime:/etc/localtime:ro \
-v /home/mail/data:/data \
-e "HTTPS=OFF" \
--name "mailserver" \
--restart=always \
-t analogic/poste.io

Lo más relevante en este caso es que NO queremos las redirecciones https porque vamos a configurar el servidor apache que ya tenemos para que actúe de proxy y será él quien tenga el https y los certificados y que el puerto que exponemos para la administración es el puerto 81 (redirigido al puerto 80 del contenedor).

Para que sea accesible desde el exterior por https lo que hicimos fue configurar un virtualhost en apache de esta manera:

<VirtualHost *:80>
        ServerName mail.midominio.es
        AssignUserId mailuser mailuser

        ServerAdmin [email protected]
        DocumentRoot /home/mailuser/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/mailuser/www>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

ProxyPass / http://localhost:81/

RewriteEngine on
RewriteCond %{SERVER_NAME} =mail.midominio.es
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
</VirtualHost>

La configuración del https es similar, aunque yo dejé que el certbot de let’s encrypt me lo configurase automáticamente al generar los certificados, quedó una cosa como esta:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName mail.midominio.es
        AssignUserId mailuser mailuser

        ServerAdmin [email protected]
        DocumentRoot /home/mailuser/www

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory /home/mailuser/www>
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
        </Directory>

ProxyPass / http://localhost:81/

SSLCertificateFile /etc/letsencrypt/live/mail.midominio.es/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mail.midominio.es/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/mail.midominio.es/chain.pem
</VirtualHost>
</IfModule>

Si todo ha ido bien (seguro que algún detalle se nos pasa), tendremos el contenedor funcionando y podremos acceder al administrador de esta manera:

https://mail.midominio.es/admin/

Y, después de verificar la identidad y hacer los primeros ajustes de dominio, cuentas y demás podremos disfrutar de nuestro servidor de correo…

 

Utilizando el DNIe desde ubuntu

Hace ni se sabe que tengo un lector de DNI electrónico, bueno, si lo se, me lo regalaron por asistir a un FICOD cuando eso todavía significaba algo… El lector es el que podéis ver en la imagen y, obviamente, bajo todos esos logotipos debería haber algo que funcionase, ¿no?

DNIeY la oportunidad para usarlo me vino por un despiste, vamos, lo normal… Dejé que caducase mi certificado de la FNMT, una pena, llevaba con él como 15 años y no lo había dejado caducar nunca, y me sirvió fielmente para todas mis gestiones desde el primer día… Pero en estos tiempos uno tiene la cabez donde no debe y se olvida de cosas como estas. En cualquier caso, y dado que salir a la delegación de hacienda para identificarme me parecía muy del siglo pasado, me busqué la forma de hacerlo totalmente por internet. Y, por increible que parezca, esa forma existe, se puede solicitar un certificado de la FNMT utilizando el DNI electrónico, ¿fácil no?

Pues no… En la página de la FNMT nos explican con todo lujo de detalles cómo configurar los navegadores y las limitaciones que tenía el proceso (en principio solo soportaban Internet Explorer con Windows XP y Firefox – con versiones inferiores a la 33 – en el resto). Bueno, todo es intentarlo.

Lo primero es hacer que funcione el DNIe en mi Ubuntu 14.04, dado que hay una guía fantástica guia ubuntu al respecto y mi lector estaba soportado, pues nada, simplemente la seguí al pié de la letra y, aparentemente, funcionó. Desde firefox (la versión que descargué ad-hoc para el proceso) se reconocía el dispositivo de seguridad y pedía el pin para ver los certificados… Vamos bien.

Lo siguiente no fué tan bien… El proceso de solicitud del certificado se paraba diciendo que «su navegador no ha generado una firma válida». Round 1 para FNMT.

Bueno, no pasa nada, lo intentaremos en MAC… Nada que hacer, ni siquiera consigo que me reconozca la tarjete. Round 2 también para FNMT.

Da igual, probamos en una máquina virtual con Windows 7, seguro que hay un procedimiento sencillo… Instalo los drivers y todos los exe que me aparecen en la sección de descargas y… Nada, Firefox no reconoce la tarjeta y Explorer (si, la desesperación nos puede) si que la reconoce pero da un error detrás de otro (ni siquiera llego al error que me sale en Ubuntu).

Llegados a este punto me pregunto, ¿alguien ha conseguido ejecutar este procedimiento alguna vez? y lo dejo pasar hasta hoy… Donde decido que ya es suficiente y que tengo que conseguirlo… Me pongo serio, me remango y me siento ante mi Ubunto 14.04, reviso que el DNI se lee correctamente y después de mucho trastear me encuentro con que el problema por el que no se genera la firma adecuada no es de los certificados de la FNMT, sino de la tarjeta, en concreto de este:

Captura de pantalla de 2014-12-05 22:50:22Que solo salió por casualidad cuando estaba repasando TODOS los certificados de autoridades que tenía en el Firefox (y son cientos), el caso es que este certificado hay que permitir que firme también editando la confianza:

Captura de pantalla de 2014-12-05 22:51:59Después de esto ya pasabamos del paso de generar la firma, peeeeeero nos quedaba otro error que nos saltaba justo después de ese paso y es que nos daba un error así:

Un módulo PKCS #11 ha devuelto CKR_GENERAL_ERROR, indicando que ha sucedido un error no recuperable.

(Código de error: sec_error_pkcs11_general_error)

Y esto no pintaba bien… Por suerte google salió al rescate y encontré este hilo en cenatic que hablaba del problema. La solución fue buscar la librería libpcsclite.so.1 y poner la ruta completa en el archivo /etc/opensc/opensc.conf en la línea:

provider_library = /lib/x86_64-linux-gnu/libpcsclite.so.1

Con eso y un poquitín más de tiempo ¡Lo conseguí! pude por fin solicitar mi certificado (y ya lo tengo de hecho)… Lo que no se es lo que hará la gente con windows.

Usar el mando remoto de la PS3 en XBMC

BDRemote
Como ya he comentado, recientemente le compré una Playstation 3 a mi hijo (y a mi, claro está) y aproveché para comprarme el mando BDRemote para poder manejar las (pocas) películas bluray que tengo en casa. Además de sufrir el atraco a mano armada de pagar sus 30 Euros por él (si, ya se que ahora están más baratos) descubrí que la mayoría de las operaciones que se hacen con el BDRemote se pueden hacer desde el mando sixaxis. Además, dio la fatal casualidad que a los pocos días de tener la PS3 mi mediacenter empezó a fallar (cosas del hardware), así que me decidí a montarme otro mediacenter cambiando placa y micro (y caja) y qué mejor que usar el completisimo mando a distancia de la PS3 para controlarlo.

Y alguno dirá ¿pero la PS3 no es ya un media center?… Si, pero no. Es decir, yo necesito ver las películas en alta definición con MKV y este formato no lo soporta la PS3, además, es tal el calor que desprende la bestia que cualquier media center que quiera montar será un congelador a su lado.

Antes de montar del todo el mediacenter (que irá con ubuntu + xbmc) he probado la configuración del mando en otro ordenador que tenía de prueba y ha funcionado. Aqui os explico como:
Sigue leyendo