Instalando Portainer en la Raspberry Pi

Uno de los temas que me tenía preocupado al cual le quería dar una solución, es la administración de contenedores Docker a través de una interfaz gráfica la cual a la vez me permitiera actualizarlos fácilmente en vez de hacerlo a través de la Terminal.

Los puristas del Terminal probablemente dirán que es mejor administrar los contenedores a través de la línea de comandos, y quizás tienen razón, pero en mi opinión para alguien a quien el tiempo le es esquivo y escaso, es mejor disponer de una interfaz gráfica.

No es mi primera aproximación a Portainer, lo había probado antes sin el éxito que esperaba, pero decidí darle una segunda oportunidad antes de lo cual me documenté adecuadamente leyendo otros blogs y viendo algunos videos de YouTube.

En mi caso instalé Portainer CE (Community Edition) el cual es de uso gratuito. Lo primero que debemos hacer es crear un volumen en el cual Portainer guardará su base de datos.

docker volume create portainer_data

Una vez hecho esto basta crear el contenedor Docker de Portainer usando el siguiente comando.

docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data cr.portainer.io/portainer/portainer-ce:latest

Una vez terminado el proceso, es necesario terminar la configuración de Portainer ingresando a la página web del servicio, reemplazando localhost por la dirección IP de la Raspebbry Pi.

https://localhost:9443

En este último paso, debemos crear el usuario y password con que administraremos Portainer.

En los próximos posts comentaré como instalar Homebridge vía Portainer, así como otros servicios con los que he estado jugando últimamente.

Por emontes, hace

[Docker] Cómo actualizar Homebridge

Habiendo comentado en una entrada previa respecto de la instalación de Homebridge, quedó pendiente comentar cómo es que se actualiza Homebridge ya que aunque se trata de un proceso sencillo y está dentro de la documentación, habitualmente lo pasamos por alto.

Después de tener corriendo Homebridge por casi 10 meses, me di cuenta que tanto los paquetes nodejs como npm estaban desactualizados.

Mi primera aproximación fue a través del Terminal interno que tiene la instalación de Homebridge gracias al plugin reinstalado «Homebridge UI», de hecho pude actualizar npm pero no tuvo ningún efecto en el sistema a pesar de reiniciar homebridge.

Después de buscar bastante tiempo por internet, finalmente encontré la respuesta en la página de Github del proyecto oznu/docker-homebridge.

La solución para actualizar Homebridge es conectarse por ssh a la Raspberry Pi, cambiar al directorio en que está el archivo «docker-compose.yml» de nuestra instalación de Homebridge, actualizar el docker y finalmente correr el «docker-compose.yml» con lo cual el sistema queda actualizado.

Los comandos para dicha gestión, una vez conectados por ssh, son los siguientes.

cd /home/pi/homebridge
docker-compose pull homebridge
docker-compose up -d

Con eso queda actualizada la instalación de Homebridge y los paquetes nodejs y npm que estaban desactualizados.

Por emontes, hace

[Docker] Montando un servidor MariaDB en una Raspberry Pi

Para continuar con la instalación de un sistema LEMP en la Raspberry Pi, ahora le toca el turno a la instalación de una base de datos. Elegí MariaDB ya que se trata de un sistema de base de datos liviano pero a la vez con la potencia suficiente. Para esto utilicé una imagen de Docker creada por uGeek.

Para descargar la imagen, crear el contenedor y ejecutarlo basta una sola línea de comando de Terminal, al igual que lo hicimos con la instalación de Nginx.

docker run --name mariadb --restart always -p 3306:3306 -v $HOME/docker/mariadb/config:/var/lib/mysql -v $HOME/docker/mariadb/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d ugeek/mariadb:arm

Veamos qué significa cada uno de los modificadores. —name corresponde al nombre que tendrá el contenedor que estamos creando, —restart always indica al sistema que cada vez que el sistema se reinicie, dicho contenedor debe ser ejecutado nuevamente, -p corresponde a los puertos que utilizará, -v corresponde a los directorios a los que tendrá acceso fuera del contenedor, en -e MYSQL_ROOT_PASSWORD es necesario reemplazar my-secret-pw por el password del usuario root en MariaDB, y finalmente -d corresponde a la imagen del contenedor que se descargará.

Una vez que el sistema haya descargado la imagen, creado y ejecutado el contenedor, es necesario crear una base de datos cualquiera, para lo cual primero es ingresar al contenedor de MariaDB por sh.

docker exec -i -t mariadb sh

Ahora ejecutamos MariaDB con el usuario root, para lo cual nos solicitará el password my-secret-pw que utilizamos en el comando de creación del contenedor.

mysql -u root -p

Ahora creamos una base de datos la cual llamaremos db1, y modificamos sus privilegios.

CREATE DATABASE IF NOT EXISTS db1;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
FLUSH PRIVILEGES;

Finalmente salimos de MariaDB y salimos del contenedor.

\q
exit

Con esto ya queda creado el contenedor de MariaDB. Más adelante veremos cómo integrarlo con el servidor de Nginx para, por ejemplo, instalar WordPress.

Por emontes, hace

[Docker] Montando un servidor Nginx en una Raspberry Pi

Poco a poco le voy dando más utilidad a mi Raspberry Pi 2B, la cual aunque está lejos del rendimiento de una Raspberry Pi 4, creo que es suficiente para el trabajo que pretendo pedirle. Como uno de mis objetivos es verificar si tiene la capacidad de correr un servidor LEMP (Linux, Nginx, MySQL y Php), o primero que hay que hacer es montar un servidor Nginx a través de Docker.

Aunque pueda parecer una tarea compleja o complicada, la verdad es que se puede hacer en una sola línea de comando de terminal.

docker run --name nginx --restart always -d -p 80:80 -v $HOME/docker/nginx:/usr/share/nginx/html:ro nginx:alpine

Veamos qué significa cada uno de los modificadores. –name corresponde al nombre que tendrá el contenedor que estamos creando, –restart always indica al sistema que cada vez que el sistema se reinicie, dicho contenedor debe ser ejecutado nuevamente, -p corresponde a los puertos que utilizará, y -v corresponde a los directorios a los que tendrá acceso fuera del contenedor.

Esto descargará la imagen de Docker desde su repositorio original, y luego creará el contenedor y lo ejecutará.

En mi caso tengo conectado un SSD externo de Western Digital, el cual fue diseñado específicamente para la Raspberry Pi, llamado PiDrive de 314 Gb, por lo tanto la carpeta donde estarán ubicados los archivos del servidor web tienen otra localización, y es necesario hacer algunos ajustes al comando.

docker run --name nginx --restart always -d -p 80:80 -v /media/pi/WD_PiDrive_314GB/html:/usr/share/nginx/html:ro nginx

Ahora hay que agregar el directorio /media/pi/WD_PiDrive_314GB/html install al usuario pi y al grupo www-data, cambiar los permisos de escritura de dicho directorio y finalmente agregar el usuario pi al grupo www-data, con lo cual ya todo debiera funcionar. En el caso de ustedes reemplacen /media/pi/WD_PiDrive_314GB/html por $HOME/docker/nginx.

sudo chown pi:www-data -R /media/pi/WD_PiDrive_314GB/html
sudo chmod 0755 -R /media/pi/WD_PiDrive_314GB/html
sudo adduser pi www-data

Con esto queda montado el servidor Nginx en la Raspberry Pi a través de Docker. Sólo nos falta crear un archivo index.html en el directorio /media/pi/WD_PiDrive_314GB/html y listo. El ejemplo que sigue es el index por defecto de Nginx.

<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
<link href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYA$
<style>
body {
  margin: 0px;
  font: 20px 'RobotoRegular', Arial, sans-serif;
  font-weight: 100;
  height: 100%;
  color: #0f1419;
}
div.info {
  display: table;
  background: #e8eaec;
  padding: 20px 20px 20px 20px;
  border: 1px dashed black;
  border-radius: 10px;
  margin: 0px auto auto auto;
}
div.info p {
    display: table-row;
    margin: 5px auto auto auto;
}
div.info p span {
    display: table-cell;
    padding: 10px;
}
img {
    width: 176px;
    margin: 36px auto 36px auto;
    display:block;
}
div.smaller p span {
    color: #3D5266;
}
h1, h2 {
  font-weight: 100;
}
div.check {
    padding: 0px 0px 0px 0px;
    display: table;
    margin: 36px auto auto auto;
    font: 12px 'RobotoRegular', Arial, sans-serif;
}
#footer {
    position: fixed;
    bottom: 36px;
    width: 100%;
}
#center {
    width: 400px;
    margin: 0 auto;
    font: 12px Courier;
}
</style>
<script>
var ref;
function checkRefresh(){
    if (document.cookie == "refresh=1") {
        document.getElementById("check").checked = true;
        ref = setTimeout(function(){location.reload();}, 1000);
    } else {
    }
}
function changeCookie() {
    if (document.getElementById("check").checked) {
        document.cookie = "refresh=1";
        ref = setTimeout(function(){location.reload();}, 1000);
    } else {
        document.cookie = "refresh=0";
        clearTimeout(ref);
    }
}
</script>
</head>
<body onload="checkRefresh();">
<img alt="NGINX Logo" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEU$
<div class="info">
<p><span>Server&nbsp;address:</span> <span>server_address</span></p>
<p><span>Server&nbsp;name:</span> <span>server_hostname</span></p>
<p class="smaller"><span>Date:</span> <span>server_date</span></p>
<p class="smaller"><span>URI:</span> <span>server_url</span></p>
</div>
<div class="check"><input type="checkbox" id="check" onchange="changeC$
    <div id="footer">
        <div id="center" align="center">
            Request ID: request_id<br/>
            &copy; NGINX, Inc. 2018
        </div>
    </div>
</body>
</html>

Para verificar que está corriendo basta abrir una ventana de navegador, y escribir la dirección IP de la Raspberry Pi seguido del puerto 80, en mi caso 192.168.1.30:80, y debiera mostrar una imagen como la siguiente.

Más adelante veremos cómo crear vhosts para cada uno de los sitios que alojemos dentro de nuestro propio servidor web.

Por emontes, hace

[Docker] Instalando Homebridge en una Raspberry Pi

Desde hace un tiempo que vengo domotizando mi casa, hasta ahora he agregado varias ampolletas Phillips Hue y algunos sensores de Aqara (2 hubs, 2 sensores de presencia, 2 sensores de puerta y 2 sensores de vibración) lo cual me ha permitido automatizar en cierta forma la casa. Aún hay trabajo pendiente ya que faltan más ampolletas Phillips Hue, más sensores, cámaras, cerraduras inteligentes, etc, todo esto de la mano de Home, Siri y Alexa gracias a un parlante Echo Dot.

Leyendo por aquí y por allá encontré una plataforma llamada Homebridge la cual permite integrar a Home dispositivos que no tienen una compatibilidad nativa con este framework.

La forma más sencilla de instalar Homebridge es a través de Docker, el cual ya expliqué con anterioridad cómo se instala, así que en este post nos centraremos en la instalación de Homebridge.

Instalando Homebridge

Para la instalación de Homebridge utilizaremos un docker desarrollado por Oznu disponible en GitHub.

La forma más sencilla es utilizando para ello docker compose, el cual se trata simplemente de un manifiesto donde se encuentran registradas todas las configuraciones para descargar, crear y ejecutar el contenedor en un sólo paso, sin tener que escribir manualmente el comando docker run con todos sus parámetros.

sudo apt-get install docker-compose

Una vez instalado docker compose, tenemos que crear un directorio para homebridge, dentro del cual crearemos el manifiesto que permitirá la descarga, creación y ejecución del contenedor.

sudo mkdir /home/pi/homebridge
cd /home/pi/homebridge

Una vez que estemos dentro del directorio de homebridge, creamos un archivo llamado docker-compose.yml.

sudo nano docker-compose.yml

Dentro de este archivo copiamos lo siguiente

version: '2'
services:
  homebridge:
    image: oznu/homebridge:raspberry-pi
    restart: always
    network_mode: host
    volumes:
      - ./config:/homebridge
    environment:
      - PGID=1000
      - PUID=1000
      - HOMEBRIDGE_CONFIG_UI=1
      - HOMEBRIDGE_CONFIG_UI_PORT=8080

Grabamos con Ctrl-O y salimos con Ctrl-X.

Ahora basta que ejecutemos el manifiesto con docker compose

sudo docker-compose up -d

Con esto el sistema comenzará a descargar la imagen del docker, creará el contenedor y lo ejecutará, con lo cual ya tendremos corriendo Homebridge en nuestra Raspberry Pi.

Para ingresar al panel de control de Homebridge basta con abrir una ventana de navegador, y escribir la dirección IP de la Raspberry Pi, utilizando el puerto 8080, por ejemplo 192.168.1.30:8080. El usuario por defecto es admin, y la password de dicho usuario es admin.

Más adelante nos adentraremos en cómo agregar Homebridge a Home, y cómo agregar plugins de Homebridge para poder conectar a Home otros dispositivos domésticos que no tienen compatibilidad nativa con este framework.

Por emontes, hace