hits counter
Este sitio web utiliza cookies para obtener estadísticas de navegación. Si sigue adelante, consideraremos que acepta su uso. Acepto | Más información

Docker



Docker: instalación y uso

Docker es una herramienta de virtualización muy ligera que permite correr aplicaciones y servicios utilizando contenedores. La virtualización basada en contenedores tiene una gran ventaja con respecto a los sistemas tradicionales como VMWare o VirtualBox: en los contenedores no se crea un sistema huésped completo, sino que las aplicaciones se encapsulan en módulos que comparten el mismo kérnel del sistema anfitrión y se ejecutan como procesos aislados en el espacio de usuario. Esto supone un gran ahorro de recursos: memoria, espacio de disco y uso de CPU. El hecho de que sea tan ligera implica que no requiere de un hardware potente, lo que la hace muy adecuada para su uso en una placa como la Raspberry Pi. Los contenedores son, además, sistemas autocontenidos que ya disponen de todo lo necesario (código, librerías, dependencias y ficheros de configuración) para poder funcionar en cualquier equipo.

Los creadores de esta plataforma mantienen un repositorio público en la nube, llamado Docker Hub, que contiene una enorme cantidad de imágenes de muchas de las aplicaciones y servicios más utilizados por usuarios y empresas de todo el mundo, ordenadas por categorías, sistemas operativos y arquitecturas (entre las que se encuentra ARM). Cualquiera puede crearse una cuenta (gratuita o de pago) e incluir su propio repositorio particular, haciéndolo público o privado.


Instalar Docker

Lo primero que haremos será actualizar el sistema:

sudo apt update
sudo apt upgrade

A continuación ejecutamos el script que llevará a cabo la instalación:

sudo curl -sSL https://get.docker.com | sh

Creamos el grupo docker y añadimos al mismo el usuario actual mediante la variable $USER:

sudo usermod -aG docker $USER

No hace falta reiniciar el equipo; basta con cerrar la sesión:

logout

Una vez hecho login de nuevo, con los siguientes comandos conoceremos la versión de Docker que tenemos instalada y también otra información extendida (su directorio raíz, kérnel, arquitectura de la CPU, sistema operativo, memoria RAM,...):

docker -v
docker info

Instalar Docker Compose

Docker Compose es una extensión que nos permitirá gestionar varios contenedores a la vez, además de poder configurar de una forma más sencilla cómo se comunican entre ellos.

La instalación estándar de Docker ya incluye el plugin para Docker Compose, por lo que no es imprescindible su instalación. No obstante, a continuación vamos a ver cómo hacerlo, por si en algún momento lo necesitamos.

La instalación es muy simple:

sudo apt install docker-compose

Podemos comprobar la versión instalada con este comando:

docker-compose --version

Imágenes

Ya dijimos al principio que existe un gran repositorio donde se encuentra una enorme cantidad de imágenes que están disponibles para Docker, llamado Docker Hub. Aquí podemos entrar y descargar las imágenes que queramos usar en nuestro sistema.

La lista de comandos disponibles para trabajar con imágenes la podemos ver escribiendo esto:

docker image --help

Los más usados seguramente serán los siguientes:

docker image ls                                       Muestra la lista de imágenes
docker image rm nombre | ID                  Borra una imagen
docker image pull nombre                       Descarga una imagen del repositorio
docker image prune                                 Borra todas las imágenes no usadas

Los tres primeros comandos anteriores pueden abreviarse:

docker images
docker rmi nombre | ID
docker pull nombre

Hemos de tener en cuenta que no se puede borrar una imagen si ya existe un contenedor de la misma. Es necesario borrar previamente el contenedor, ya que este no es más que una imagen que se ha lanzado y se encuentra en ejecución.

Parar borrar una imagen podemos usar su nombre o bien su ID. En este último caso no es necesario teclearlo completo (sólo los primeros caracteres, siempre que no existan varios IDs que comiencen por los mismos). Así, si tenemos dos imágenes cuyos IDs son 6567cb064a414 y 639db11237ab2, respectivamente, para eliminar la primera basta con teclear docker rmi 65.


Contenedores

Como dijimos antes, un contenedor no es más que una imagen que se encuentra en ejecución realizando una tarea. Ello implica que para poder lanzar un contenedor, previamente ha de descargarse la imagen correspondiente: primero se comprueba si esta ya existe en la máquina local, y si no es así, se descarga automáticamente del repositorio.

Al igual que con las imágenes, podemos conocer la lista de comandos disponibles para trabajar con contenedores tecleando esto:

docker container --help

He aquí una lista de los más usados:

docker run nombre                              Arranca un contenedor
docker run -d nombre                         Arranca un contenedor en segundo plano
docker run --name wp wordpress       Lo arranca asignándole un nombre (wp)
docker run -it ubuntu bash                  Arranca un nuevo contenedor y ejecuta comandos
docker exec -it nombre | ID bash        Ejecuta comandos en un contenedor ya arrancado
docker container rename nombre | ID nuevo_nombre               Renombra el contenedor
docker ps                                             Muestra la lista de los contenedores activos
docker ps -a                                        Muestra la lista de todos los contenedores
docker stop nombre | ID                      Detiene un contendor
docker start nombre | ID                      Inicia un contendor parado
docker restart nombre | ID                   Reinicia (stop/start) un contendor
docker rm nombre | ID                         Borra un contendor (debe estar parado)
docker pause nombre | ID                    Pausa un contendor
docker unpause nombre | ID                Reinicia un contendor pausado
docker container prune                        Borra todos los contenedores no usados

Como en el caso de las imágenes, para referirse a un contenedor por su ID, no hace falta escribirlo entero: basta con poner sólo los primeros caracteres, siempre que no existan varios IDs que comiencen por los mismos.


Borrar un contenedor

Para borrar un contendor, primero hay que detenerlo y luego ya podemos borrarlo; a continuación eliminaremos también la imagen:

docker ps                                                 [ver la lista de contenedores]
docker stop nombre | ID
docker rm nombre | ID
docker image ls                                        [ver la lista de imágenes]
docker image rm nombre | ID

Actualizar un contenedor

En general, y salvo que en la web del repositorio se indique otro procedimiento, podemos actualizar un contenedor, una vez que está ya instalado y funcionando mediante Docker Compose, ejecutando estos cuatro comandos:

cd /docker/contenedor
docker compose pull
docker compose up -d
docker image prune



Nginx Proxy Manager

Nginx Proxy Manager es un proxy inverso diseñado para funcionar exclusivamente en Docker. Un proxy inverso es un servidor que se sitúa delante de uno o varios servidores web e intercepta las solicitudes de los clientes, enviándolas al servidor de destino o backend y recibiendo la respuesta de este. Se usa para proteger los servidores de destino y optimizar el tráfico de datos de las peticiones procedentes de Internet. Con un proxy inverso se consigue, entre otras cosas, el enmascaramiento del servidor final (ya que las peticiones de los clientes las recoge el proxy) o proporcionar una caché para almacenar y servir de forma rápida el contenido más demandado.

Sirve también para gestionar los servicios que estén detrás del proxy y darles cobertura HTTPS, es decir, nos permitirá tener certificados SSL en el servidor proxy para evitar tener que hacer esta configuración en cada uno de los servicios internos que queremos exponer. Nginx Proxy Manager usa internamente Let's Encrypt para solicitar, gestionar y renovar de forma automática los certificados SSL que se aplicarán en cada host.


Instalación

Como es obvio, es necesario tener instalado previamente Docker en la Raspberry. La instalación estándar de Docker ya incluye el plugin para Docker Compose, que usaremos para configurar y ejecutar el contenedor.

Hecho esto, vamos a crear un directorio en nuestro /home para Docker y un subdirectorio para el proxy que vamos a instalar, situándonos a continuación en el mismo:

cd
mkdir -p docker/proxymanager
cd docker/proxymanager

Ahora creamos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo escribiremos un contenido lo más simplificado posible, de manera que, en lugar de usar un servidor de base de datos (como MaríaDB), usaremos SQLite, que no requiere de un servidor propio. Y por otro lado, hay que advertir que en los ficheros .yml es imprescindible respetar la indentación de las líneas:

services:
   app:
      image: 'jc21/nginx-proxy-manager:latest'
      restart: unless-stopped
      ports:
         - '80:80'
         - '81:81'
         - '443:443'
      volumes:
         - ./data:/data
         - ./letsencrypt:/etc/letsencrypt
         - /var/log:/data/logs

La última línea se ha remarcado en negrita porque es para indicar el path de los ficheros de log necesarios para incluir el proxy en Fail2ban. Si no vamos a usar este, prescindiremos de dicha línea. Los puertos 80 TCP y 443 TCP tendremos que abrirlos en el router y redireccionarlos a la IP local de la Raspberry. El puerto 81 es para acceder a la interfaz web del proxy.

Con el siguiente comando descargamos y ejecutamos el contenedor:

docker compose up -d

Interfaz web

Cuando termine, ya podemos entrar en la interfaz web del proxy inverso usando la IP de la Raspberry y el puerto 81:

http://192.168.1.33:81

Para el login inicial hay que utilizar un email (admin@example.com) y una contraseña (changeme) por defecto:

Inmediatamente después veremos esta ventana para introducir los datos del administrador. Debemos poner un nuevo email y pulsar en Save :

Se nos abrirá otra ventana para que cambiemos la contraseña que hemos usado antes por una nueva:

Entramos por fin en el proxy y en el Dashboard veremos esto:


Añadir hosts

Hacemos clic en Proxy Hosts (o en el menú Hosts - Proxy Host) y luego en Add Proxy Host. Aquí añadiremos nuestro primer host. Tenemos que configurar dos pestañas.

1.) Details. En la pestaña Details rellenamos los datos del mismo:

En este ejemplo hemos puesto un subdominio de un DDNS gratuito de Duck DNS. Debajo escribimos la IP local de la Raspberry que corre Nginx Proxy Manager, el puerto 8888 (que corresponde al servicio RPi-Monitor) y activamos Block Common Exploits. De esta forma, cuando alguien escriba la dirección del DDNS que hemos elegido (monitor.usuario.duckdns.org), entrará en la interfaz web del RPi-Monitor de nuestra Raspberry y lo hará con HTTPS, gracias al certificado SSL de Let's Encript que vamos a añadir en el siguiente punto.

En lugar de la Raspberry en la que corre el servidor proxy, podemos poner la IP de cualquier otra máquina de nuestra LAN que tenga un servicio al queramos dar acceso.

Hay que tener en cuenta que necesitaremos utilizar un dominio diferente para cada host, así que lo mejor es crear distintos subdominios en el mismo DDNS, como hemos hecho antes. Y no debemos olvidar abrir en el router los puertos 80 y 443 TCP, redireccionándolos a la IP local de la Raspbery. En el cortafuegos (si lo tenemos instalado), por el contrario, abriremos sólo los puertos que usa cada host.

2.) SSL. En la pestaña SSL vamos a indicar que deseamos obtener un nuevo SSL Certificate (Request a new SSL Certificate); luego activamos Force SSL y también HTTP/2 Support; ponemos un email válido (esto es importante) y, debajo del todo, aceptamos los términos del servicio de Let's Encript. Nginx Proxy Manager se encargará de la gestión de los certificados, creándolos en el mismo momento en que pulsemos el botón Save y procediendo luego a su renovación, de forma automática, antes de que caduquen.


Redireccionar hosts

También es posible hacer una redirección de un host, es decir, enlazar el DDNS con un sitio web ya existente. En el Dashboard hacemos clic en Redirection Hosts (o en el menú Hosts - Redirection Host) y luego en Add Redirection Host. Como antes, tenemos que configurar dos pestañas.

1.) Details. En la pestaña Details rellenamos los datos del mismo:

En Domain Names ponemos un subdominio de DDNS; en Scheme seleccionamos el protocolo de conexión segura; en Forward Domain escribimos la URL que corresponda a la redirección; en HTTP Code elegimos 308 Permanent redirect y activamos Block Common Exploits.

2.) SSL. Luego pinchamos en la pestaña SSL:

e indicamos que deseamos obtener un nuevo SSL Certificate (Request a new SSL Certificate); debajo activamos Force SSL y también HTTP/2 Support; ponemos un email válido; aceptamos los términos del servicio de Let's Encript y hacemos clic en el botón Save.


Control de acceso a los hosts

Si algún servicio/host no tiene usuario y contraseña de acceso, podemos decirle al proxy que los solicite para poder entrar al mismo. Para ello, pinchamos en el menú Access Lists y luego en el botón Add Access List. En la pestaña Details le ponemos un nombre a esta lista de acceso y activamos Satisfy Any:

Después, en la pestaña Authorization, escribimos el usuario y la contraseña que queramos usar. Finalizamos pulsando en Save:

Para activarla, editamos el host en el que queramos usar la lista de acceso; abajo, en Access List, seleccionamos la lista que acabamos de crear y guardamos la nueva configuración haciendo clic en Save:


Usando Fail2ban

Si tenemos instalado Fail2ban y queremos incluir Nginx Proxy Manager en él, además del cambio en el fichero docker-compose.yml que vimos al principio, tendremos que implementar nosotros mismos las reglas necesarias para poder usarlo. En Internet se pueden encontrar al menos un par de maneras de hacerlo: una primera (como se explica aquí) y luego una segunda, más simple y que parece funcionar mejor.

Este segundo método (extraído de aquí, pero con algunas modificaciones al final) consiste en crear un fichero de configuración específico para el servicio:

sudo nano /etc/fail2ban/filter.d/npm.conf

en el que incluiremos este contenido:

[INCLUDES]

[Definition]

failregex = ^.+ (405|404|403|401|\-) (405|404|403|401) - .+ \[Client <HOST>\] \[Length .+\] ".+" .+$

Luego editamos el fichero de configuración de Fail2ban:

sudo nano /etc/fail2ban/jail.local

y al final del mismo añadimos lo siguiente:

[npm]
enabled = true
datepattern = ^[^\[]*\[(%%d/%%b/%%Y:%%H:%%M:%%S(?: %%z)?)\]
port = https,http
bantime = 15m
findtime = 3m
maxretry = 5
chain = DOCKER-USER
logpath = /var/log/proxy-host-?_access.log

Ya sólo tenemos que reiniciar Fail2ban para que incluya el nuevo servicio que acabamos de configurar:

sudo service fail2ban restart



Servidor VPN WireGuard

Una VPN (Virtual Private Network, Red Privada Virtual) es un sistema que nos permitirá conectarnos a la Raspberry Pi desde cualquier lugar de Internet de una manera segura, mediante una conexión cifrada, y tener acceso a toda nuestra red local igual que si estuviéramos en casa. De hecho, una VPN es como una extensión de nuestra red local, pero realizada a través de una red pública (Internet en este caso). Una vez conectados desde el exterior al servidor VPN, nuestro dispositivo pasará a formar parte de la red doméstica y usará el router de nuestra casa para movernos por Internet, siendo por ello el encargado de asignarnos la IP pública correspondiente. Además, cuando nos conectamos a la VPN, todo el tráfico entre el cliente y el servidor (es decir, los datos generados por cualquier servicio o aplicación que usemos) viajarán con un cifrado de alta seguridad, por lo que nadie podrá ver su contenido aunque estemos usando una wifi pública y haya algún hácker espiando el tráfico de datos que circula por ella.

Vamos a instalar un servidor VPN del tipo WireGuard, ya que actualmente se ha convertido en el más usado debido a que es rápido y poco pesado; además es fácil de configurar y ofrece una seguridad igual o superior a OpenVPN, la otra alternativa disponible. Aunque, como decimos, no es difícil de instalar y configurar manualmente, resulta aún mucho más fácil hacerlo mediante Docker, y en especial si utilizamos la imagen de WireGuard Easy.


Obtener el Hash de la contraseña para WireGuard

Antes de proceder con la instalación, crearemos, mediante el siguiente comando, el hash de la contraseña para WireGuard (conviene anotar esta, ya que la necesitaremos más adelante para acceder a la interfaz web del servidor y crear los usuarios):

docker run -it ghcr.io/wg-easy/wg-easy wgpw contraseña

Una vez que termine, al final del mismo, aparecerá el PASSWORD_HASH de la contraseña que hemos escrito. Por ejemplo::

. . . . . .
Digest: sha256:67a52ccb8b5095992550aa567df5448a5152b6ed39be34b0a8e
Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:latest
PASSWORD_HASH='$2y$10B9rKw21CoykrB95WSzuV4c0fBzOu9sbyVa34GJx'

El resultado obtenido lo usaremos en el pasos siguientes para instalar y configurar el contenedor.


Instalación

En esta ocasión vamos a mostrar dos formas distintas de instalar el contenedor:

1ª) Usando Docker Compose. En este caso, como es habitual, primero crearemos la carpeta donde se guardará el fichero de configuracion y nos situamos en ella:

cd
mkdir -p docker/wg-easy
cd docker/wg-easy

A continuación vamos a crear el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiaremos el siguiente contenido (según se indica en su GitHub), que incluirá los datos del contenedor (es importante, como ya sabemos, respetar la indentación de las líneas):

services:
  wg-easy:
    environment:
      - LANG=es
      - PASSWORD_HASH=$$2y$$10B9rKw21CoykrB95WSzuV4c0fBzOu9sbyVa34GJx
      - PORT=51821
      - WG_PORT=51820
      - WG_HOST=nombre.ddns.net
      - WG_DEFAULT_ADDRESS=10.8.0.x
      - WG_DEFAULT_DNS=8.8.8.8,8.8.4.4
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    volumes:
      - ./config:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

En este fichero sustituiremos PASSWORD_HASH por el hash de la contraseña (sin las comillas simples) que obtuvimos al principio, pero añadiendo un segundo signo de dólar ($) delante de cada uno de los que ya se incluyan en dicho hash, como se explica aquí. Luego, en WG_HOST pondremos un nombre de dominio DDNS para poder acceder al servidor VPN desde el exterior.

Para descargar la imagen y generar el contenedor, tendremos que ejecutar el plugin de Docker Compose:

docker compose up -d

2ª) Mediante Docker CLI. Sólo hemos de ejecutar el contenedor usando el comando docker run:

docker run -d \
  --name=wg-easy \
  -e LANG=es \
  -e WG_HOST=nombre.ddns.net \
  -e PASSWORD_HASH='$2y$10B9rKw21CoykrB95WSzuV4c0fBzOu9sbyVa34GJx' \
  -e PORT=51821 \
  -e WG_PORT=51820 \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

En WG_HOST escribimos un nombre de dominio DDNS para poder acceder al servidor VPN desde el exterior. Y debajo, en PASSWORD_HASH, pondremos el hash de la contraseña que obtuvimos más arriba, incluyendo las comillas simples, tal y como como se indica aquí.

Sea cual sea la opción elegida, no debemos olvidar abrir el puerto 51820 UDP en el router y redireccionarlo a la IP local de la Raspberry. En el cortafuegos ufw, por lo general, no es necesario abrir los puestos, ya que cuando se inicia un contenedor que incluye algún puerto, Docker agrega automáticamente reglas a iptables para permitir las conexiones al puerto publicado.


Interfaz web

Para gestionar los usuarios/clientes usaremos una interfaz web que nos hará muy fácil la tarea. Entramos en ella con la IP local de la Raspberry y el puerto 51821 que indicamos antes en la configuración del contenedor:

http://192.168.1.33:51821

Para el login inicial hay que utilizar la contraseña en claro (no el hash) que escribimos y anotamos al principio:

Y ya podremos añadir un nuevo cliente:

Le damos un nombre:

que nos aparecerá en la siguiente ventana. En ella podremos activar/desactivar el cliente, escanear un código QR para para importarlo a un dispositivo móvil, descargarlo en un fichero (para pasarlo a un PC o un portátil) o eliminarlo:


Instalar los clientes e importar los usuarios

Necesitamos instalar las aplicaciones clientes en todos aquellos dispositivos (PCs, portátiles, smartphones o tabletas digitales) desde los que queramos acceder al servidor. Para el sistema Android podemos usar varias apps, como por ejemplo la oficial o bien esta otra. Para iOS también está disponible la app oficial. Y en el caso de macOS y Windows, podremos descargar los clientes desde la web de WireGuard. Además, disponemos de información sobre cómo instalar y configurar los clientes para los distintos sistemas operativos en este sitio.

Como hemos visto en la última captura correspondiente a la interfaz web, la foma más cómoda de importar los usuarios a un dispositivo móvil es mediante un código QR que luego se puede escanear desde la app móvil (tanto en Android como en iOS), de manera que la importación de los datos de conexión es un proceso completamente automático.

En el caso de hacerlo desde un PC o un portátil, sólo tenemos que descargar el fichero desde la interfaz web y luego importarlo desde el cliente que hemos instalado previamente.


Actualizar el contenedor de Docker CLI

Cuando haya una nueva versión del contenedor WireGuard Easy en su GitHub, podremos actualizar fácilmente realizando estos tres pasos:

1.) Primero entramos en la interfaz web y desactivamos los clientes que hayamos creado.

2.) Luego corremos estos tres comandos:

docker stop wg-easy
docker rm wg-easy
docker pull ghcr.io/wg-easy/wg-easy

3.) Ejecutamos de nuevo el contenedor:

docker run -d \
  --name=wg-easy \
  -e LANG=es \
  -e WG_HOST=nombre.ddns.net \
  -e PASSWORD_HASH='$2y$10B9rKw21CoykrB95WSzuV4c0fBzOHWKu9sbyVa34GJx' \
  -e PORT=51821 \
  -e WG_PORT=51820 \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

4.) Por último, accedemos otra vez a la interfaz web y volvemos a activar los clientes.




Servidor DNS Pi-hole

Pi-hole es un sistema para convertir la Raspberry Pi en un servidor de DNS capaz de filtrar y bloquear la publicidad a nivel de red. Una vez instalado y configurado, sólo tendremos que poner la IP local de la RasPi como servidor de DNS en el router o bien ponerla manualmente en cada dispositivo de nuestra red local.


Instalación

La instalación resulta muy fácil haciéndola mediante Docker, como se muestra en su repositorio oficial de Docker Hub. Pero para ello, primero nos desplazamos a nuestro /home y ahí vamos a crear un subdirectorio para el servicio que vamos instalar, situándonos luego en el mismo:

cd
mkdir -p docker/pihole
cd docker/pihole

A continuación creamos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiaremos el siguiente contenido, que incluirá los datos del contenedor (recordando, una vez más, que en los ficheros .yml es imprescindible respetar la indentación de las líneas):

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "5353:80/tcp"
    environment:
      TZ: 'Europe/Madrid'
      WEBPASSWORD: contraseña
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    restart: unless-stopped

Como vemos, el fichero contiene la opción WEBPASSWORD, en la que debemos poner la contraseña con la que entraremos en la interfaz web. Y puesto que el puerto 80, que utilizaremos para entrar en la interfaz web, es habitual tenerlo ocupado por parte de otra aplicación, es preferible cambiarlo y usar uno distinto (el 5353 en nuestro caso).

Para descargar las imágenes y generar los contenedores, tendremos que ejecutar el plugin de Docker Compose:

docker compose up -d

Interfaz web

Podemos entrar en la interfaz web de Pi-hole escribiendo en el navegador de cualquier dispositivo de nuestra LAN la IP de la Raspberry seguida del puerto 5353 y /admin, así:

http://192.168.1.33:5353/admin

Se nos pedirá la contraseña de acceso que pusimos en el fichero de configuración. Una vez que entremos, vamos al menú Settings -- pestaña DNS y comprobamos que esté marcada la opción Respond only on interface eth0:


Abrir puertos

En el cortafuegos ufw, por lo general, no es necesario abrir los puertos, ya que cuando se inicia un contenedor que incluye uno o varios puertos, Docker agrega automáticamente reglas a iptables para permitir las conexiones a los puertos publicados. Pero si se diera el caso de que dichas reglas no se han añadido por algún motivo, entonces hemos de abrir los siguientes puertos: el puerto 53 TCP/UDP, para que dnsmasq resuelva las peticiones DNS y el puerto 5353 TCP para poder acceder a la interfaz web mediante el servidor lighttpd que se incluye:

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 5353/tcp

Comprobación

Es posible comprobar fácilmente su correcto funcionamiento si visitamos esta web de pruebas desde alguno de los dispositivos de nuestra red local, cuyo resultado debería ser este:




WireGuard + Pi-hole

Si deseamos que WireGuard y Pi-hole trabajen juntos para que, al conectar desde el exterior con el servidor VPN, podamos también eliminar la publicidad de las páginas web que visitemos, las cosas no son tan fáciles como instalar ambos servicios por separado. Afortunadamente existe una forma de conseguirlo y es la que se indica en el propio GitHub de WireGuard Easy. El proceso, con algunos pequeños cambios, se muestra a continuación.


Obtener el Hash de la contraseña para WireGuard

Antes de proceder con la instalación, crearemos, mediante el siguiente comando, el hash de la contraseña para WireGuard (conviene anotar esta, ya que la necesitaremos más adelante para acceder a la interfaz web del servidor y crear los usuarios):

docker run -it ghcr.io/wg-easy/wg-easy wgpw contraseña

Una vez que termine, al final del mismo aparecerá el PASSWORD_HASH de la contraseña que hemos escrito. Por ejemplo::

. . . . . .
Digest: sha256:67a52ccb8b5095992550aa567df5448a5152b6ed39be34b0a8e
Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:latest
PASSWORD_HASH='$2y$10B9rKw21CoykrB95WSzuV4c0fBzOu9sbyVa34GJx'

El resultado obtenido lo usaremos en el paso siguiente, durante la configuración del fichero de Docker Compose.


Instalación

Primero nos desplazamos a nuestro /home y ahí vamos a crear un subdirectorio para los dos servicios que queremos instalar, situándonos a continuación en el mismo:

cd
mkdir -p docker/wg-pihole
cd docker/wg-pihole

Y ahora creamos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiaremos el siguiente contenido, que ahora contendrá los datos de ambos servicios (recordando, una vez más, que en los ficheros .yml es imprescindible respetar la indentación de las líneas):

services:
  wg-easy:
    environment:
      - LANG=es
      - PASSWORD_HASH=$$2y$$10B9rKw21CoykrB95WSzuV4c0fBzOu9sbyVa34GJx
      - PORT=51821
      - WG_PORT=51820
      - WG_HOST=nombre.ddns.net
      - WG_DEFAULT_ADDRESS=10.8.0.x
      - WG_DEFAULT_DNS=10.8.1.3
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg-easy
    volumes:
      - ./config:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      wg-easy:
        ipv4_address: 10.8.1.2

  pihole:
    image: pihole/pihole
    container_name: pihole
    environment:
      - WEBPASSWORD=contraseña
      - TZ=Europe/Madrid
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      - "5353:80/tcp"
    restart: unless-stopped
    networks:
      wg-easy:
        ipv4_address: 10.8.1.3

networks:
  wg-easy:
    ipam:
      config:
        - subnet: 10.8.1.0/24

En este fichero sustituiremos WG_HOST por un nombre de dominio DDNS para poder acceder al servidor VPN desde el exterior. Luego, en PASSWORD_HASH escribiremos el hash de la contraseña (sin las comillas simples) que obtuvimos al principio, pero añadiendo un segundo signo de dólar ($) delante de cada uno de los que ya se incluyan en dicho hash, como se explica aquí. Además, en WEBPASSWORD pondremos una contraseña con la que entrar en la interfaz web de Pi-hole. Y por último, añadir que el puerto del servidor VPN podemos cambiarlo y poner otro diferente, por ejemplo:

ports:
   - "55840:55840/udp"

Para descargar las imágenes y generar los contenedores, tendremos que ejecutar el plugin de Docker Compose:

docker compose up -d

Las interfaces web

Necesitamos entrar en la interfaz web de WireGuard para crear los usuarios, lo que haremos (ya lo vimos antes con detalle cuando explicamos cómo instalar el servidor VPN por separado) mediante la IP de la Raspberry y el puerto 51821:

http://192.168.1.33:51821

En el caso de Pi-hole el acceso lo realizaremos escribiendo la IP de nuestra Raspberry seguida del puerto 5353 y /admin, así:

http://192.168.1.33:5353/admin

Abrir puertos

Hemos de abrir el puerto 51820 UDP en el router y redireccionarlo a la IP local de la Raspberry. En el cortafuegos ufw, por lo general, no es necesario abrir los puertos, ya que cuando se inicia un contenedor que incluye uno o varios puertos, Docker agrega automáticamente reglas a iptables para permitir las conexiones a los puertos publicados. Pero si se diera el caso de que dichas reglas no se han añadido por algún motivo, entonces hemos de abrir los siguientes puertos: el puerto 51820 UDP, el 53 TCP/UDP para que dnsmasq resuelva las peticiones DNS y el puerto 5353 TCP para poder acceder a la interfaz web:

sudo ufw allow 51820/udp
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 5353/tcp

Comprobación

Es posible comprobar fácilmente su correcto funcionamiento si visitamos esta web de prueba desde alguno de los dispositivos de nuestra red local, cuyo resultado debería ser este:




File Browser

File Browser es un gestor de archivos que se puede usar de forma remota como una nube personal y que funciona mediante una interfaz web. Su instalación es simple y su manejo, muy fácil e intuitivo.


Instalación

Lo primero que haremos será crear la carpeta donde guardar el fichero de configuración y a continuación nos situaremos en ella:

cd
mkdir -p docker/filebrowser
cd docker/filebrowser

Vamos a mostrar dos formas ligeramente distintas de instalar el contenedor mediante Docker Compose:

1ª) File Browser original

Aquí, antes de nada, ha de crearse el directorio y el fichero de base de datos que usa la aplicación:

mkdir database
cd database
touch filebrowser.db
cd ..

Luego, mediante el comando id, podremos ver la UID del usuario por defecto (que, si no existe otro, será 1000:1000), que necesitaremos en el siguiente paso.

Ahora creamos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiamos el siguiente contenido:

services:
  filebrowser:
    image: filebrowser/filebrowser:latest
    container_name: filebrowser
    restart: always
    user: 1000:1000
    ports:
      - 8080:80
    volumes:
      - /media/hdusb/files/:/srv
      - ./database/filebrowser.db:/database.db

En user pondremos la ID que obtuvimos en el paso anterior; en ports se suele poner un puerto distinto del 80 porque este es habitual que lo tengamos ya ocupado por otro servicio; y en la primera línea de la sección volumes escribiremos la ruta donde queremos guardar los archivos y carpetas, que en nuestro caso es un HD externo.

Para descargar la imagen y generar el contenedor, ejecutamos el comando habitual:

docker compose up -d

2ª) File Browser fork

Aquí no necesitamos crear manualmente el fichero de base de datos: este se creará automáticamente dentro de la carpeta /config. Así pues, vamos directos al Docker Compose:

nano docker-compose.yml

Que ahora tendrá el siguiente contenido:

services:
  filebrowser:
    image: hurlenko/filebrowser
    user: 0:0
    ports:
      - 8080:8080
    volumes:
      - /media/hdd/files/:/data
      - ./config:/config
    environment:
      - FB_BASEURL=/filebrowser
    restart: always

En user ponemos la ID del usuario root; en ports pondremos un puerto que no tengamos ya ocupado; y en la primera línea de la sección volumes escribimos la ruta donde queremos guardar los archivos y carpetas (como en el caso anterior, hemos optado también por usar un HD externo), pero es posible indicar varias rutas, por ejemplo:

- /media/hdd:/data/hdd
- /media/ssd:/data/ssd
- /home/piuser:/data/home

Descargamos la imagen y generamos el contenedor ejecutando el comando habitual:

docker compose up -d

Interfaz web

Podemos acceder a File Browser desde cualquier equipo de nuestra LAN usando un navegador y escribiendo la IP local de la Raspberry seguida del puerto que hayamos elegido (8085, 8080...):

http://192.168.1.33:8080

Se nos pedirá que escribamos un nombre de usuario y una contraseña para el administrador, que por defecto son admin/admin:

Una vez que entremos, lo primero que debemos hacer es cambiar la contraseña. Después podremos crear nuevos usuarios (otorgándole a cada uno los permisos que deseemos) y realizar además todas las acciones propias de un gestor de archivos.

Si queremos acceder desde fuera de nuestra LAN, podríamos instalar Nginx Proxy Manager para crear un nuevo Proxy Host escribiendo el subdominio DDNS que queramos usar, la IP de la Raspberry, el puerto 8085 y solicitar un certificado SSL de Let's Encript para el mismo. En el cortafuegos (si lo tenemos instalado), tendremos que abrir ese puerto.




PsiTransfer

Con PsiTransfer tendremos un sistema auto alojado para compartir y transferir ficheros con/a otras personas. Tiene la peculiaridad, además, de que permite poner caducidad a los enlaces de descarga y también una contraseña. En su Docker Hub podemos ver todas las características.


Instalación

Para instalarlo, vamos a crear la carpeta donde guardar el contenedor y luego nos situamos en ella:

cd
mkdir -p docker/psitransfer
cd docker/psitransfer

A continuación crearemos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiamos el siguiente contenido:

services:
  psitransfer:
    container_name: psitransfer
    restart: unless-stopped
    image: psitrax/psitransfer
    ports:
      - '3000:3000'
    volumes:
      - ./data:/data
    environment:
      PSITRANSFER_ADMIN_PASS: "contraseña"
      PSITRANSFER_UPLOAD_PASS: "contraseña"

Para dotar a la aplicación de una buena seguridad de acceso, en las dos últimas líneas escribiremos las contraseñas que se indican (que puede ser la misma en ambas): para administrar las descargas y para generar los enlaces de subida de ficheros.

Ahora vamos a descargar la imagen y crear el contenedor:

docker compose up -d

Acto seguido, y para que todo funcione como debe, tenemos que ejecutar el siguiente comando:

sudo chown -R 1000 $PWD/data

Interfaz web

Una vez hecho esto último, ya podemos entrar en la interfaz web con la IP de la Raspberry seguida del puerto 3000:

http://192.168.1.33:3000

Se nos pedirá la contraseña de upload que pusimos antes:

Aparecerán dos ventanas. En la de la izquierda podemos arrastrar el archivo o hacer clic y seleccionarlo desde la carpeta donde se encuentre:

En la ventana de la derecha tenemos la posibilidad de seleccionar el tiempo de retención del fichero (es decir, cuándo expirará) y, si lo deseamos, poner una contraseña para su descarga:

Antes de que transcurra el tiempo de expiración o retención, el fichero puede descargarse todas las veces que se desee; pero una vez transcurrido dicho tiempo, el fichero se borrará automáticamente. Si se elige Descarga única, no habrá tiempo de expiración, pero el fichero sólo se podrá descargar una única vez e inmediatamente después será eliminado.

Cuando hayamos hecho los pasos anteriores, pulsamos en el botón subir para que se genere el enlace de descarga. Este enlace podemos copiarlo al portapapeles, enviarlo por correo o generar un código QR del mismo:

La descarga puede hacerse en formato ZIP o en TAR.GZ.

Si queremos acceder desde fuera de nuestra LAN, podríamos instalar Nginx Proxy Manager para crear un nuevo Proxy Host escribiendo el subdominio DDNS que queramos usar, la IP de la Raspberry, el puerto 3000 y solicitar un certificado SSL de Let's Encript para el mismo. En el cortafuegos (si lo tenemos instalado), tendremos que abrir ese puerto.

Para entrar en la parte de administración, añadiremos /admin a la dirección de la interfaz web:

http://192.168.1.33:3000/admin

Y se nos pedirá la contraseña correspondiente:

Aquí veremos la lista de descargas y la información sobre las mismas: fecha de creación, fecha de expiración, su tamaño y si se ha realizado ya la descarga o no. Si hacemos clic en SID aparecerá el nombre del fichero. En el caso de las descargas sin tiempo de expiración (Descarga única), estas desaparecen del listado una vez que se hayan descargado.




Heimdall

Heimdall es una aplicación para organizar y centralizar en un mismo sitio todo los enlaces a los distintos contenedores que tenemos instalados en nuestra máquina y permitirnos el acceso a los mismos de una forma fácil y rápida.


Instalación

Empezaremos creando la carpeta donde guardarlo y situándonos a continuación en ella:

cd
mkdir -p docker/heimdall
cd docker/heimdall

A continuación vamos a crear el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo tenemos que copiar el siguiente contenido:

services:
  heimdall:
    image: lscr.io/linuxserver/heimdall:latest
    container_name: heimdall
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
    volumes:
      - ./config:/config
    ports:
      - 8080:80
      - 4430:443
    restart: unless-stopped

Mediante el comando id, podremos ver la UID del usuario por defecto (que, si no existe otro, será 1000). Se han cambiado los puertos estándar 80 y 443 del host por otros distintos ya que es muy probable que los tengamos ya ocupados por otro servicio.

La descarga de la imagen y la generación del contenedor la haremos ejecutando el comando habitual:

docker compose up -d

Interfaz web

Terminado el paso anterior, y pasados unos segundos, podremos acceder a Heimdall desde el navegador de cualquier equipo de nuestra LAN escribiendo la IP local de la Raspberry seguida del puerto 8080:

http://192.168.1.33:8080

En la parte inferior derecha encontraremos un pequeño menú con varios iconos. En el último podemos cambiar, entre otra cosas, el idioma y ponerlo en español. Pulsamos Save para que los cambios surtan efecto. En Usuarios podremos añadir nuevo usuarios y cambiar sus contraseñas. La parte más importante de este menú se encuentra en el icono Lista de aplicaciones. Al hacer clic en ella, aparecerá una ventana:

Pinchamos en AÑADIR e incluimos, de uno en uno, los contenedores Docker que tenemos instalados. Para ello rellenamos dos entradas: el Nombre de la aplicación (empezamos a escribir el nombre y lo seleccionamos de la lista desplegable) y luego la URL (incluyendo al final de la misma el puerto correspondiente) que da acceso a su interfaz web. En el caso de Nginx Proxy Manager, por ejemplo, sería así:

Para finalizar, abajo del todo, hacemos clic en GUARDAR.

En la pantalla principal tendremos ahora, de manera centralizada, todos los accesos a los distintos contenedores que hemos añadido. Pinchando en cada uno de ellos accederemos a su interfaz web:




Portainer

Portainer es una herramienta de gestión de contenedores, ligera y fácil de usar. Con ella podremos crear, eliminar y administrar (parar, pausar, reanudar, actualizar,...) todos los contenedores Docker que tengamos instalados en la Raspberry Pi. Y todo ello desde una interfaz gráfica, sin tener que usar la línea de comandos.


Instalación

Vamos a mostrar dos formas distintas de instalar el contenedor:

1ª) Mediante Docker CLI. Empezaremos descargando la última imagen Community Edition (CE) disponible desde su GitHub:

sudo docker pull portainer/portainer-ce:latest

Una vez descargada, ejecutamos el contenedor pasándole algunos parámetros (como el puerto o el nombre) e indicándole que se active automáticamente cada vez que se reincie el sistema:

sudo docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest

Esto es todo. Ya podemos ir al paso siguiente y acceder a través de la interfaz web.

2ª) Usando Docker Compose. En este caso, como es habitual, primero crearemos la carpeta donde se guardará el fichero de configuracion y nos situamos en ella:

cd
mkdir -p docker/portainer
cd docker/portainer

A continuación vamos a crear el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiaremos el siguiente contenido, que incluirá los datos del contenedor (importante respetar la indentación de las líneas):

services:
  portainer:
    image: portainer/portainer-ce:latest
    container_name: portainer
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./portainer-data:/data
    ports:
      - 9000:9000

Para descargar la imagen y generar el contenedor, tendremos que ejecutar el plugin de Docker Compose:

docker compose up -d

Interfaz web

Podemos acceder a Portainer desde cualquier equipo de nuestra LAN usando el navegador y escribiendo la IP local de la Raspberry seguida del puerto 9000:

http://192.168.1.33:9000

y se nos pedirá que escribamos un nombre de usuario y una contraseña, que debe de tener al menos 12 caracteres:

Pinchamos en Create user y aparecerán dos opciones:

Elegiremos Get Started y de esta forma entramos en la interfaz de Portainer:

Si hacemos clic aquí entraremos en el panel (Dashboard), donde se encuentran los diversos elementos que constituyen el entorno, entre ellos los Containers:

En la parte superior derecha tenemos una barra de botones para realizar diversas acciones sobre el contenedor que hayamos seleccionado:


Instalar contenedores

Portainer también nos permite instalar un nuevo contenedor, por lo que no tendremos que salir de la aplicación y usar la línea de comandos. Para ello, en el menú lateral de la izquierda, pinchamos en Stacks y, arriba a la derecha, hacemos clic en el botón + Add stack:

En Name ponemos un nombre para el nuevo contenedor y, más abajo, en el Web editor, pegamos el contenido del fichero de Docker Compose:

Ya sólo falta pinchar en el botón Deploy the stack, que se encuentra abajo del todo, y esperar a que se instale:


Actualización

En la parte inferior izquierda se muestra la versión actual. Cuando exista una nueva versión, se nos indicará justo debajo. Para actualizar, salimos de Portainer y, desde la consola de comandos, eliminamos el contenedor y su imagen, como se explica al final del apartado sobre el uso de Docker. Si lo vamos a hacer mediante Docker Compose, a continuación nos desplazamos a su directorio de instalación:

cd
cd docker/portainer

y generamos de nuevo el contenedor:

docker compose up -d



Watchtower

Watchtower es una utilidad que nos permitirá saber si existen nuevas versiones para actualizar de los contenedores que tenemos funcionando en el sistema. Una vez instalada, recibiremos una notificación por Telegram cuando detecte la existencia de alguna actualización. Y entonces, ya sea manualmente o, mejor aún, desde Portainer, podremos actualizar los contenedores que lo requieran.


Instalación

Empezamos creando la carpeta donde se guardará el fichero de configuracion y nos situamos en ella:

cd
mkdir -p docker/watchtower
cd docker/watchtower

A continuación vamos a crear el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiaremos el siguiente contenido:

services:
   watchtower:
     image: containrrr/watchtower:latest
     container_name: watchtower
     volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - /etc/localtime:/etc/localtime:ro
     environment:
       - TZ=Europe/Madrid
       - WATCHTOWER_POLL_INTERVAL=21600          # 86400 diario | 604800 semanal
       - WATCHTOWER_MONITOR_ONLY=true
       - WATCHTOWER_CLEANUP=true
       - WATCHTOWER_LABEL_ENABLE="true"
       - WATCHTOWER_NOTIFICATIONS=shoutrrr
       - WATCHTOWER_NOTIFICATION_URL=telegram://mi-TOKEN@telegram/?channels=mi-ID
     restart: unless-stopped

El intervalo en que se comprueban las nuevas actualizaciones puede modificarse, poniendo el tiempo deseado, lo que haremos en WATCHTOWER_POLL_INTERVAL. En nuestro caso hemos puesto 6 horas (21600 segundos) y, además, en WATCHTOWER_MONITOR_ONLY=true le decimos que no ejecute las actualizaciones automáticamente, sino que se limite a avisarnos por Telegram, para lo cual tenemos que poner en WATCHTOWER_NOTIFICATION_URL tanto el TOKEN como la ID de esta aplicación de mensajería para recibir en ella las notificaciones. Si no disponemos de estos dos códigos, en este enlace se explica cómo obtenerlos y la manera de crear el bot que necesitamos.

Para descargar la imagen y generar el contenedor, ejecutamos el plugin de Docker Compose:

docker compose up -d

Actualizar desde Portainer

Cuando recibamos en Telegram la notificación de que hay una nueva actualización, nos vamos a Portainer y buscamos el contenedor watchtower. A la derecha del mismo, pinchamos en el icono que se indica con la fecha:

Podremos comprobar que la notificación recibida es correcta, ya que aquí se nos muestra también la lista de actualizaciones pendientes:

En nuestro caso, como se observa, hay disponibles tres actualizaciones. Las podremos ejecutar yendo a la lista de contenedores y pinchando en el Name de cada uno de ellos: primero lo detenemos (botón Stop) y luego hacemos clic en Recreate para actualizarlo:

En la ventana de actualización hemos de activar antes Re-pull image:

Esperamos a que termine la actualiación y luego borramos manualmente la imagen antigua, que debe aparecer como inactiva o no usada. Esto también podemos hacerlo desde la terminal con el comando

docker image prune



Duplicati

Duplicati es una aplicación para realizar copias de seguridad de los ficheros y carpetas que tengamos en nuestra Raspberry. Las copias se pueden hacer tanto de forma local como en la nube, pudiendo utilizar para ello servicios como Dropbox, Google Drive, Mega, etc. Incluso es posible realizarlas usando protocolos como FTP o WebDAV.


Instalación

Siguiendo el sistema que hemoss venido empleando hasta ahora, vamos a comenzar por crear la carpeta donde se guardará el fichero de configuracion y luego nos situamos en ella:

cd
mkdir -p docker/duplicati
cd docker/duplicati

A continuación crearemos el correspondiente fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiamos el siguiente contenido (sacado de su Docker Hub, pero con algunos cambios):

services:
  duplicati:
    image: lscr.io/linuxserver/duplicati:latest
    container_name: duplicati
    environment:
      - PUID=0
      - PGID=0
      - TZ=Europe/Madrid
    volumes:
      - ./config:/config
      - /media/hdusb/backups/duplicati:/backups
      - /home/piuser/docker:/source
    ports:
      - 8200:8200
    restart: unless-stopped

Como ID vamos a usar el del usuario root, que podemos comprobar con id root, para evitar problemas de permisos al copiar determinados contenedores. En volumes hemos decidido utilizar un disco duro externo como destino donde guardar las copias de seguridad, tal y como se muestra en el path de la segunda línea; en la tercera, indicamos el origen o fuente de la copia: en este caso, la carpeta donde se han ido guardando todos los contenedores que tenemos instalados; aunque también podríamos haber optado, para mayor tranquilidad, por incluir el contenido completo de nuestro directorio /home escribiendo sólo - /home/piuser:/source. Naturalmente, el usuario piuser es necesario cambiarlo por el nombre que se esté usando en cada caso. Además, es posible añadir nuevas líneas e incluir más rutas desde las que hacer otros backups, por ejemplo, - /var/log:/source2 para guardar los ficheros de log del sistema.

Los nombres de las carpetas del contenedor (/backups y /source) pueden cambiarse, si así lo deseamos. Pero es MUY IMPORTANTE tener en cuenta que serán estos nombres de directorios los que nos aparecerán (y, por tanto, los que habremos de seleccionar) como destino y origen, respectivamente, cuando entremos en la interfaz web para realizar las copias de seguridad de forma local; y en caso de usar algún servicio en la nube, elegiremos la carpeta /source como origen.

Conocidos estos detalles, ya podemos generar el contenedor:

docker compose up -d

Interfaz web

Para acceder a la interfaz web tan sólo tenemos que escribir la IP de la Raspberry seguida del puerto 8200:

http://192.168.1.33:8200

El proceso para realizar las copias de seguridad es sencillo e intuitvo. No obstante, en este enlace se describe con minuciosidad todo el proceso.




Docker Controller Bot

Se trata de una utilidad similar a Portainer y que, al igual que esta, nos permitirá gestionar nuestros contenedores, pero con la ventaja añadida de que no necesitamos usar un navegador, sino que lo haremos desde Telegram. En el propio GitHub de la aplicación tenemos toda la información necesaria, y además en español. Como podemos comprobar ahí, mediante Telegram nos será posible hacer cosas como las siguientes:

  1. ✅ Listar contenedores
  2. ✅ Arrancarlos, pararlos o eliminarlos
  3. ✅ Actualizar los contenedores
  4. ✅ Recibir notificaciones cuando un contenedor cambie de estado
  5. ✅ Extraer el docker-compose de los contenedores
  6. ✅ Limpiar el sistema, eliminando contenedores, imágenes y otros objetos no utilizados

Instalación

Antes de nada vamos a crear la carpeta donde guardarlo y ejecutarlo, situándonos a continuación en ella:

cd
mkdir -p docker/controller
cd docker/controller

Y ahora creamos el fichero de Docker Compose:

nano docker-compose.yml

Dentro del mismo copiamos el siguiente contenido:

services:
    docker-controller-bot:
        environment:
            - TELEGRAM_TOKEN=mi-TOKEN
            - TELEGRAM_ADMIN=mi-ID
            - CONTAINER_NAME=docker-controller-bot
            - TZ=Europe/Madrid
            #- TELEGRAM_GROUP=
            #- TELEGRAM_THREAD=1
            #- TELEGRAM_NOTIFICATION_CHANNEL=
            - CHECK_UPDATES=1
            - CHECK_UPDATE_EVERY_HOURS=24
            - CHECK_UPDATE_STOPPED_CONTAINERS=1
            - BUTTON_COLUMNS=2
            - LANGUAGE=ES
            #- EXTENDED_MESSAGES=0
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - ./schedule:/app/schedule
        image: dgongut/docker-controller-bot:latest
        container_name: docker-controller-bot
        restart: always
        network_mode: host
        tty: true

Tenemos que poner nuestros datos de Telegram en TELEGRAM_TOKEN y en TELEGRAM_ADMIN. Si no disponemos de ellos, en este enlace se explica cómo obtenerlos y la manera de crear el bot que necesitamos para que este contenedor haga su trabajo, que es controlar los demás contenedores que tengamos instalados y recibir notificaciones sobre los mismos.

Para descargar la imagen y generar el contenedor, tendremos que ejecutar el plugin de Docker Compose:

docker compose up -d

Una vez creado, recibiremos un mensaje en nuestro bot de Telegram en el que se indica que está activo, la última versión con sus novedades y un menú inferior con los comandos disponibles:




CasaOS Home Server

CasaOS es un proyecto para crear un Home Server basado completamente en Docker. Funciona a través de una interfaz web con un aspecto simple, limpio y elegante desde la que pueden realizarse todas la tareas de instalación y gestión de contenedores. Posee una tienda de aplicaciones a la que se pueden añadir otras nuevas y si algún contenedor no se encuentra en ninguna de ellas, se puede instalar desde cualquier repositorio, como Docker Hub.


Instalación

CasaOS está disponible para distintas distribuciones de Linux, incluyendo Raspberry Pi OS, como se indica en su GitHub. La instalación es sumamente sencilla; tan sólo tenemos que ejecutar este script:

curl -fsSL https://get.casaos.io | sudo bash

El proceso de instalación incluye Docker, Docker Compose y todo lo necesario para el posterior uso y gestión de contenedores. Al final se nos indicará la IP local desde la que podemos entrar en su interfaz web y también la manera de desinstalarlo, en caso de que no sea de nuestro agrado:

casaos-uninstall

Copiamos la IP indicada (que es la de la propia Raspberry) en el navegador de cualquier dispositivo de nuestra LAN y lo primero que se nos pedirá es que creemos una cuenta escribiendo un nombre de usuario y su contraseña:

Hecho lo anterior, entraremos en la interfaz web de CasaOS:



Actualización

Cuando queramos actualizar a la última versión, basta con poner lo siguiente:

curl -fsSL https://get.casaos.io/update | sudo bash

Pero si deseamos actualizar a una nueva versión concreta del sistema, podremos hacerlo añadiendo al final el número de versión. Por ejemplo:

curl -fsSL https://get.casaos.io/update/v0.4.11 | sudo bash

Configuración

Arriba, a la izquierda, tenemos varios iconos. El primero es para cerrar la sesión. El segundo nos permite realizar determinados ajustes en el sistema:

Y mediante el tercero podremos iniciar una sesión de SSH en la Raspberry, escribiendo nuestras credenciales, sin necesidad de salir de CasaOS:

Además, en la parte inferior de la primera columna, en Ajustes de los Widgets, podremos seleccionar qué widgets queremos que se muestren en dicha columna.


Aplicaciones

Haciendo clic en el icono de la App Store de la pantalla principal iremos a la tienda de aplicaciones, desde donde podremos instalar una buena cantidad de ellas. Para ello desplegamos la lista de apps y hacemos clic en Más:

Aparecerá el listado de tiendas disponibles. En el enlace GitHub Repo que hay debajo de cada una de ellas, se puede ver la lista de aplicaciones que contiene:

Si nos interesa el contenido, copiamos la URL que incluye el fichero ZIP de la tienda (el Source link que se muestra en la imagen anterior), desplegamos de nuevo la lista de apps. pinchamos en Más aplicaciones, lo pegamos en el cuadro de texto habilitado para ello y hacemos clic en el botón Añadir:

Si aun así necesitamos una aplicación que no se encuentra en ninguna de esas fuentes (o una versión más actualizada), podemos pinchar arriba, en Instalación personalizada, e instalar una imagen Docker manualmente o bien importarla (haciendo clic en el icono de la parte superior), ya sea como Docker Compose o como Docker CLI:


Por último, añadir que los contenedores con las distintas aplicaciones que instalemos se situarán en la ruta /DATA/AppData.