Docker
- Docker: instalación y uso
- Nginx Proxy Manager
- Servidor VPN WireGuard
- Servidor DNS Pi-hole
- WireGuard + Pi-hole
- File Browser
- PsiTransfer
- Heimdall
- Portainer
- Watchtower
- Duplicati
- Docker Controller Bot
- CasaOS Home Server
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.
![](images/docker_logo.png)
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:
![](images/nginx-proxy1.png)
Inmediatamente después veremos esta ventana para introducir los datos del administrador. Debemos poner un nuevo email y pulsar en Save :
![](images/nginx-proxy2.png)
Se nos abrirá otra ventana para que cambiemos la contraseña que hemos usado antes por una nueva:
![](images/nginx-proxy3.png)
Entramos por fin en el proxy y en el Dashboard veremos esto:
![](images/nginx-proxy4.png)
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:
![](images/nginx-proxy5.png)
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.
![](images/nginx-proxy6.png)
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:
![](images/nginx-proxy11.png)
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:
![](images/nginx-proxy10.png)
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:
![](images/nginx-proxy7.png)
Después, en la pestaña Authorization, escribimos el usuario y la contraseña que queramos usar. Finalizamos pulsando en Save:
![](images/nginx-proxy8.png)
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:
![](images/nginx-proxy9.png)
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.
![](images/wireguard.jpg)
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:
![](images/wireguard-1.png)
Y ya podremos añadir un nuevo cliente:
![](images/wireguard-2.png)
Le damos un nombre:
![](images/wireguard-3.png)
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:
![](images/wireguard-4.png)
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:
![](images/pihole_dns2.png)
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:
![](images/block-pihole.png)
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:
![](images/block-pihole.png)
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:
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
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:
![](images/filebrowser.png)
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:
![](images/psitransfer1.png)
Aparecerán dos ventanas. En la de la izquierda podemos arrastrar el archivo o hacer clic y seleccionarlo desde la carpeta donde se encuentre:
![](images/psitransfer2.png)
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:
![](images/psitransfer3.png)
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:
![](images/psitransfer4.png)
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:
![](images/psitransfer5.png)
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:
![](images/heimdall1.png)
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í:
![](images/heimdall2.png)
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:
![](images/heimdall3.png)
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:
![](images/portainer1.png)
Pinchamos en Create user y aparecerán dos opciones:
![](images/portainer2.png)
Elegiremos Get Started y de esta forma entramos en la interfaz de Portainer:
![](images/portainer3.png)
Si hacemos clic aquí entraremos en el panel (Dashboard), donde se encuentran los diversos elementos que constituyen el entorno, entre ellos los Containers:
![](images/portainer4.png)
En la parte superior derecha tenemos una barra de botones para realizar diversas acciones sobre el contenedor que hayamos seleccionado:
![](images/portainer12.png)
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:
![](images/portainer6.png)
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:
![](images/portainer7.png)
Ya sólo falta pinchar en el botón Deploy the stack, que se encuentra abajo del todo, y esperar a que se instale:
![](images/portainer8.png)
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:
![](images/portainer10.png)
Podremos comprobar que la notificación recibida es correcta, ya que aquí se nos muestra también la lista de actualizaciones pendientes:
![](images/portainer11.png)
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:
![](images/portainer5.png)
En la ventana de actualización hemos de activar antes Re-pull image:
![](images/portainer9.png)
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:
- ✅ Listar contenedores
- ✅ Arrancarlos, pararlos o eliminarlos
- ✅ Actualizar los contenedores
- ✅ Recibir notificaciones cuando un contenedor cambie de estado
- ✅ Extraer el docker-compose de los contenedores
- ✅ 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:
![](images/controller.png)
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.
![](images/casaos_banner.png)
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:
![](images/casaos_01.png)
Hecho lo anterior, entraremos en la interfaz web de CasaOS:
![](images/casaos_02.png)
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:
![](images/casaos_05.png)
Y mediante el tercero podremos iniciar una sesión de SSH en la Raspberry, escribiendo nuestras credenciales, sin necesidad de salir de CasaOS:
![](images/casaos_06.png)
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:
![](images/casaos_04.png)
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:
![](images/casaos_03.png)
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:
![](images/casaos_08.png)
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:
![](images/casaos_07.png)
Por último, añadir que los contenedores con las distintas aplicaciones que instalemos se situarán en la ruta /DATA/AppData.