[Raspberry][Documentación] Y se hizo el self-hosting

B

Este hilo es la actualización de otro creado en el pasado. Aquí encontrarás "recetas" para montar un servidor casero... no encontrarás emuladores ni cosas por el estilo.
La documentación viene para trabajar en local, pero si se quiere acceder a la raspberry desde otros sitios es muy aconsejable disponer de un dominio con su acceso a la zona DNS.

En pro de fomentar el opensource, siempre que sea posible todos los extras referentes a apps de Android serán de los repositorios de F-Droid. En muchos casos se puede encontrar la misma app en los repositorios oficiales de google.

Índice

10
B

RaspiOS (64 bits)

Ver incidencias reportadas: https://github.com/raspberrypi/Raspberry-Pi-OS-64bit/issues

Grabar la imagén a una SD Card

  1. Descargar rpi-imager
  2. Selecciona el sistema operativo Raspberry Pi OS Lite (64-bit)
  3. Graba la imagen en la SD Card

Completar instalación

  1. Poner la SD Card en la rpi e iniciarla.
  2. Cambia la contraseña por defecto (raspberry) del usuario 'pi': passwd

Habilitando SSH

En este paso se habilitará el servicio SSH en la rpi y se configurará para conectar únicamente mediante llave pública.
** Se puede omitir esto si no se va a usar. La conexión SSH sirve para gestionar la rpi sin necesidad de conectar una pantalla, teclado y ratón directamente al cacharro.

En la RPI (1/2)

  1. Lo primero es activar el servicio SSH, para ello abrir el programa de configuración y en servicios marca la casilla para SSH.

En nuestro equipo

  1. Se deben crear un par de claves ssh si es que no se dispone de ellas ya: ssh-keygen
    1.1. No cambiar la ruta de guardado, también es aconsejable poner un 'passphrase' para asegurar el uso de las claves.
  2. Copiar la clave en la rpi: ssh-copy-id pi@rpi_ip
    2.1. Si todo va bien nos pedirá tanto la 'passphrase' como la contraseña del usuario 'pi'

En la RPI (2/2)

  1. Editar el archivo /etc/ssh/sshd_config
    1.1. Descomentar PasswordAuthentication dejando la opción en no.
  2. Reiniciar SSH: service ssh restart

  • INFO 1: Llegados a este punto se pueden desconectar los periféricos de la rpi (teclado, ratón, pantalla) y trabajar desde SSH por red.
  • INFO 2: No olvidar obtener la ip local del cacharro! para ello ejecutar ip address show y fijate en el inet de eth0 si está por cable, o wlan0 si está por wifi. Es muy recomendable tenerlo conectado por cable.
  • INFO 3: Un consejo, configura el router para que asigne siempre la misma ip a la raspberry.

Desactivar WiFi & BT

Editar el archivo /boot/config y añadir:

dtoverlay=disable-wifi
dtoverlay=disable-bt

Formateando discos externos

  1. Identificar el nombre del disco: sudo lsblk
  2. Seleccionar el tipo de particiones del disco:
    2.1. GPT (El más moderno): sudo parted /dev/NOMBRE_DISCO mklabel gpt
    2.2. MBR: sudo parted /dev/NOMBRE_DISCO mklabel msdos
  3. Crear partición:
    3.1. EXT4: sudo parted -a opt /dev/NOMBRE_DISCO mkpart primary ext4 0% 100%
  4. Comprobar que se ha creado correctamente la partición e identificar su nombre: sudo lsblk -f
  5. Crear el sistema de archivos en la nueva partición:
    5.1. EXT4: sudo mkfs -t ext4 /dev/NOMBRE_PARTICION
  6. Opcional: Poner una etiqueta a la partición: sudo e2label /dev/NOMBRE_PARTICION NUEVA_ETIQUETA

Montando discos externos

  1. Crear la carpeta donde se montara el disco: sudo mkdir /media/mydisk
    1.1. Seguramente se quiera cambiar el dueño al usuario 'pi' sobre esa carpeta: sudo chown pi:pi /media/mydisk
  2. Obtener el PARTUUID: sudo blkid
  3. Añadir al archivo 'fstab': sudo nano /etc/fstab
    3.1. Ejemplo linea: PARTUUID=0203-12D /media/mydisk ext4 defaults 0 0
    3.2. Aplicar cambios: sudo mount -a

Auto-Reiniciar cada 15 días a las 09:00

  1. Abrir el editor para CRON: sudo crontab -e
  2. Añadir la tarea programada: 0 9 */15 * * reboot

** Puedes usar https://crontab.guru para definir otros intervalos

Cambiando la shell a Zsh

Con está shell tendremos funciones como autocompletar, resaltado, colores, ...

  1. Básicamente seguir los pasos: https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH
    1.1. Instalar zsh: sudo apt install zsh
    1.2. Ponerla como shell por defecto: chsh -s $(which zsh)
  2. Cerrar la sesión y volver a logear
    2.1. La primera vez nos pedirá configurar ciertos parámetros. Podremos omitirlo si usamos OhMyZSH
  3. Verificar que todo está correcto ejecutando echo $SHELL y ver que devuelve /usr/bin/zsh

Vitaminando nuestra nueva shell con 'Oh My Zsh'

Este es un framework para zsh que nos permite instalar temas y añadir plugins facilmente.

Instalando

  1. Ejecutar: sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Configuración mínima + Instalar plugins

La configuración se hace desde el archivo '.zshrc' que está en el directorio home del usuario 'pi' (~/.zshrc).

  1. Para tener un tema es la opción ZSH_THEME, se pueden ver los disponibles aquí: https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
    1.1. En mi caso para terminales remotas uso amuse (para local blinks)
  2. Para habilitar complementos es la opción plugins. Recomiendo los siguientes:
    • git -> Obtener información de repositorios (viene habilitado por defecto)
    • zsh-dircolors-solarized -> Esquema de colores usado por varios temas: git clone --recursive git://github.com/joel-porquet/zsh-dircolors-solarized $ZSH_CUSTOM/plugins/zsh-dircolors-solarized
    • zsh-syntax-highlighting -> Resaltar la sintaxis al estilo de la shell 'fish': git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
    • zsh-autosuggestions -> Auto-sugestiones al estilo de la shell 'fish': git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
    • zsh-history-substring-search -> Permite buscar comandos en el historico por subcadenas: git clone https://github.com/zsh-users/zsh-history-substring-search ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-history-substring-search
      2.1. Con todo la linea de configuración nos quedará así: plugins=(git zsh-dircolors-solarized zsh-syntax-highlighting zsh-autosuggestions zsh-history-substring-search)
  3. Cerrar la sesión y volver a logear

Byobu

Byobu es un gestor de ventanas en modo texto y un multiplexador de terminal. Esto nos permitira trabajar en varias sesiones al mismo tiempo.

Instalando

  1. Ejecutar: apt install byobu
  2. Ejecutar: byobu-enable
  3. Cerrar la sesión: exit
  4. Volver a conectar

Uso básico

  1. Para crear una nueva ventana pulsa F2
  2. Para moverte entre ventanas pulsa ALT + <tecla de dirección>
    ** Más atajos: https://manpages.ubuntu.com/manpages/jammy/en/man1/byobu.1.html#keybindings

Instalando docker

Docker es un gestor de contenedores.

  1. Usamos el método "Install using the convenience script": https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script
    1.1. Nos traemos el script: curl -fsSL https://get.docker.com -o get-docker.sh
    1.2. Lo ejecutamos: sudo sh get-docker.sh
    1.3. Añadimos el usurio 'pi' al grupo de docker: sudo usermod -aG docker pi

Instalando docker-compose

  1. Método pip: pip3 install docker-compose
    1.1. A mi me hizo falta instalar 'libffi-dev': sudo apt install libffi-dev
  2. Añade la carpeta .local/bin a $PATH
    2.1. Edita el archivo .zshrc (si te has puesto Zsh) o .bashrc y añade: export PATH=/home/pi/.local/bin:$PATH
    2.2. Para aplicar los cambios deslogearse y volver a logear

Traefik

Traefik hará de proxy inverso. Un proxy inverso nos ayuda a controlar el flujo de las peticiones al cacharro.

Levantar contenedor

  1. Crear los archivos necesarios a bindear (lo hacemos como root, pero no es necesario)
    ** Esto se hace para asegurarnos de que docker bindea correctamente, ya que si no encuentra en el host el archivo lo bindeará como una carpeta.
    1.1. mkdir data
    1.2. touch data/access.log
    1.3. touch data/acme.json
    1.4. chmod 600 data/acme.json
  2. Crear la carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  3. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml
  1. Crear el archivo de configuración en la carpeta donde se metió el docker-compose.yaml: mkdir data && nano data\traefik.yaml
    4.1. Editar el archivo y añadir:
traefik.yaml
  1. Crear los archivos de configuración en ./data/conf
    5.1. Aquí se definen unos middleware para rateLimit que tendrás que ajustar los valores a lo que busques, o incluso no quieras usar el middleware, en ese caso comenta/borra la label en los archivos docker-compose.yaml. Este middleware nos ayudará a prevenir posibles abusos y aliviando la carga de nuestra rpi. En este caso los valores son bajos, pero es que, en mi caso, el acceso web a la rpi se va usar por muy pocos usuarios.
    low_ratelimit.yaml
    medium_ratelimit.yaml
    5.2. Aquí se define un middleware para headers que sirve para habilitar HSTS y otras políticas de seguridad como SAMEORIGIN
    secure_headers.yaml
    5.3. Aquí se define un middleware para headers que sirve para denegar el indexado
    norobots_headers.yaml
  2. Levantar el contenedor en modo 'detached': docker-compose up -d
    6.1. Lanzando docker ls se debera ver el contenedor de traefik levantado

Extras

  1. Con esta configuración se tiene acceso a un panel en: http://rpi_ip:8080
2
B

Portainer (Community Edition)

Frontend para docker.

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

3. Levantar el contenedor en modo 'detached': docker-compose up -d
3.1. Lanzando docker ls se debe ver el contenedor de portainer levantado

Configuración mínima

Para acceder al panel será una URL como http://rpi_ip:9000.

  1. La primera vez que arranca pedirá que crear un usuario (por defecto admin).
  2. Una vez dentro lo primero que se tendrá que hacer es crear un 'endpoint' desde el menú "Endpoints".
    2.1. Seleccionar el tipo "Docker"
    2.2. Poner el nombre que queramos
    2.3. Activar el check "Connect via socket"
    2.4. Pulsar "+ Add Endpoint"
    2.5. Ahora en a la sección "Containers" se debe ver que está levantado el propio contenedor de portainer.

Pi-Hole

Pihole es un programa con varios propósitos, pero el que nos atañe es el de hacer de Servidor DNS para cachear y filtrar. Nos proporciona una primera barrera contra trackers en cualquier dispositivo del hogar que tire de DHCP.
Se debe tener en cuenta que con esta configuración si cae la rpi (cae el servidor DNS), quedaremos sin poder resolver dominios y no se podra navegar con normalidad.

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

Aquí no inventamos nada, el archivo anterior lo ofrecen en la propia documentación (ver https://hub.docker.com/r/pihole/pihole). Lo que si, ampliamos/cambiamos alguna cosa:

  • El tema de puertos se maneja por traefik

  • Establecido el 'hostname'. Así podemos referenciar desde otros contenedores fácilmente dentro de la misma red.

  • Establecida una red por defecto a 'rpi-net', para la configuración que usamos no es realmente necesario pero me gusta que este organizado y seguir un estándar en la nomenclatura.

  • Establecidas unas DNS para que apunten al sitio correcto (fallback a 1.1.1.1)

  • Levantar el contenedor en modo 'detached': docker-compose up -d
    3.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de pi-hole levantado

Configuración

Para acceder al panel será una URL como http://rpi_ip:9010.

Aquí existen varios caminos, aquí comentaremos uno apoyándonos en el router:

  1. Vamos al apartado "Settings", allí a la sección "DNS"
    1.1. Desmarcar todos los check del bloque de la izquierda llamado "Upstream DNS Servers"
    1.2. Habilitar "Custom 1 (IPv4)" del bloque de la derecha llamado "Upstream DNS Servers"
    1.2.1. Introducir la ip del router (por lo general 192.168.1.1)
  2. Guardar los cambios
  3. Ir al apartado "Group Management", a la sección "Adlists"
    3.1. Añadir las listas que consideres oportunas... En esta web se pueden consultar listas: https://firebog.net/
    3.2. Ir a al apartado "Tools", a la sección "Update Gravity" y actualizar.

Configurando el router

  1. Abrir la configuración del router y cambiar el DHCP para que los servidores DNS apunten a la rpi
  2. Quizás se necesite habilitar el "DNS Proxy" para que se puedan procesar las peticiones desde la rpi.
  3. Este punto es opcional, pero recuerda que siempre podrás cambiar los servidores DNS del router para usar, por ejemplo, los de Cloudflare (1.1.1.1) o Quad9 (9.9.9.9)
    3.1. ¿Pero no dijimos de poner las DNS apuntando a la rpi? Si, pero en este caso no me refiero a la configuración DHCP, sino a la que usará el router (son diferentes apartados).
  4. Resetear las conexiones de nuestros dispositivos para que obtengan la nueva dirección del servidor DNS.

Deluge

Cliente bittorrent

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

3. Este paso es opcional, se enlaza simbólicamente la carpeta ./data/downloaded a una carpeta que está en un disco externo.
Las rutas aquí usadas dependerán de donde se hayan montado los discos y como se han nombrado las carpetas.
Por ejemplo, un disco montado en /media/e2rpi y una carpeta llamada torrents se queda en /media/e2rpi/torrents.
3.1. Para hacer el enlace simbólico: ln -s /media/e2rpi/torrents ./data/downloaded

4. Levantar el contenedor en modo 'detached': docker-compose up -d
4.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de deluge levantado

Configuración

Para acceder al panel será una URL como http://rpi_ip:8112. La contraseña por defecto es deluge.

  1. Desde la barra de herramientas ir la opción "Preferences", allí se puede cambiar el idioma, limites de velocidad, etc...
    1.1. Sección 'plugins':
    1.1.1. Habilitar blocklist para bloquear ip's
    1.1.1.1. Ir a la configuración de 'blocklist' y usar, por ejemplo, https://github.com/Naunter/BT_BlockLists/raw/master/bt_blocklists.gz
    1.1.1.2. Pulsar el botón Check Download and Import
    1.1.2. Habilitar label
    1.1.3. Habilitar execute
    1.2. Sección 'Deamon'
    1.2.1. Habilitar Allow Remote Connections (Esto es útil si instalamos el plugin indicado en 'extras')

Extras

  1. delugesiphon: https://chrome.google.com/webstore/detail/delugesiphon/gabdloknkpdefdpkkibplcfnkngbidim

PostgreSQL

Motor de base de datos

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

3. Levantar el contenedor en modo 'detached': docker-compose up -d
3.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de postgres levantado o esperando a ser reiniciado.

Configuración

El login a la base de datos dependerá de lo que se haya puesto en POSTGRES_USER y POSTGRES_PASSWORD.

Gotify

Gotify es un servidor de notificaciones en tiempo real.

Levantar contenedor

  1. Se usará 'PostgreSQL' para almacenar las notificaciones.
  2. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  3. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

4. Levantar el contenedor en modo 'detached': docker-compose up -d
4.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de gotify levantado

Configuración

Para acceder al panel será una URL como http://rpi_ip:9050.

Como se está usando "postgres" debemos asegurar que tenemos creado el usuario "gotify" y la base de datos "gotify".
Para empezar a trabajar se necesita crear, al menos, una app:

  1. Ir a la seccion "APPS" y pulsar en "Create Application"
    1.1. Poner un nombre y descripción

Extras

  1. App para Android: https://f-droid.org/es/packages/com.github.gotify/

Notas

Si vas a conectarte a gotify desde fuera de la red local es imperativo el uso de https!!

Watchtower

Watchtower nos ayuda a tener nuestras imagenes actualizadas. Esto no es recomendable en entornos de producción, pero para nuestro servidor casero donde no nos importa que pueda romperse algo por alguna incompatibilidad pues es un gran aliado.

Levantar contenedor

  1. Se usará 'Gotify' como medio para recibir las notificaciones.
  2. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  3. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

4. Levantar el contenedor en modo 'detached': docker-compose up -d
4.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de watchtower levantado

Jellyfin

Jellyfin es una servidor media con capacidades de streaming. Clasifca el contenido, catalogalo usando servicios de internet: Carataluas, fechas, actores, etc...
Usamos la imagen de "linuxserver" en vez de la oficial porque es la que recomiendan en la propia documentación de jellyfin (https://jellyfin.org/docs/general/administration/hardware-acceleration.html#raspberry-pi-3-and-4)

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

Requisitos

  1. Según la documentación se debe aumentar la memoria reservada para la gpu (https://jellyfin.org/docs/general/administration/hardware-acceleration.html#raspberry-pi-3-and-4 y https://www.raspberrypi.org/documentation/configuration/config-txt/memory.md)
    1.1. Editar el archivo /boot/config.txt
    1.1.1. Añadir: gpu_mem=320
    1.1.2. Reiniciar: sudo reboot

Configuración

  1. Habilitar la aceleración por hardware. (Es importante tener la rpi con ventilación activa!!)
    1.1. En Panel de control > Reproducción dejar la aceleración por hardware en Video Aceleration API (VAAPI).
    1.2. Grabar los cambios

Extras

  1. App para Android: https://f-droid.org/es/packages/org.jellyfin.mobile/
  2. Reproductor de música para Android: https://f-droid.org/es/packages/com.dkanada.gramophone/
    ** Más en: https://jellyfin.org/clients/
  3. Canales IPTV (M3U8) + EPG: https://tdtchannels.com/listas

Notas

No he sido capaz de hacer funcionar el descubrimiento del servidor DLNA, pero se puede obtener la url de streaming y usar programas como VLC para reprucidr las películas.

NextCloud

Levantar contenedor

  1. Se usará 'PostgreSQL' para almacenar los datos.
  2. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  3. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

4. Este paso es opcional, enlazar simbólicamente la carpeta ./data/data a una carpeta que está en otro disco externo.
Las rutas aquí usadas dependerán de donde se hayan montado los discos y como se han nombrado las carpetas.
Por ejemplo, un disco montado en /media/e2rpi y una carpeta llamada nextcloud_data queda en /media/e2rpi/nextcloud_data.
4.1. Para hacer el enlace simbólico: ln -s /media/e2rpi/nextcloud_data ./data/data

5. Aplicar permisos a la carpeta ./data/data
5.1. Asignar grupo: sudo chown -R www-data: data/data
5.2. Asignar permisos: sudo chmod 0770 data/data

6. Crear el archivo de configuracion de PHP para nextcloud
6.1. Crear la carpeta: sudo mkdir data/config
6.2. Crear el archivo, ajustar los valores a lo que consideres oportuno: sudo nano data/config/nextcloud.ini

nextcloud.ini

7. Levantar el contenedor en modo 'detached': docker-compose up -d
7.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de nextcloud levantado

Configuración

La primera vez que arrancamos nos pedirá iniciar la instalación, como ya hemos puesto todo lo necesario en las variables de entorno del contenedor solo tendremos que pulsar en el bóton de instalar.

  1. Asegurarse de tener los permisos correctos en la carpeta data (desde la carpeta donde está el archivo docker-compose.yaml):
    chown -R www-data:www-data data/
    find data/ -type d -exec chmod 750 {} \;
    find data/ -type f -exec chmod 640 {} \;
  2. Cambiar los trabajos en segundo plano a cron (Se usa una imagen de apoyo para ejecutar la tarea ya que la imagen de docker no puede ejecutar el cron si no es con permisos de root)
    2.1. Para ello deberemos ir a la configuración al apartado Ajustes básicos.
  3. Es aconsejable darse una vuelta por la configuración para dejarlo a nuestro gusto
  4. Es aconsejable darse una vuelta por las aplicaciones para instalar/desinstalar lo que queramos
    4.1. Por ejemplo, si usamos certificado igual nos interese instalar la autentificación en dos pasos.
  5. Se pueden montar carpetas alojadas en otros discos o rutas fuera de la indicada para nextcloud.
    5.1. Para ello se debe montar la carpeta en el contenedor ampliando docker-compose.yaml.
    5.2. Se tiene que instalar la aplicación de nextcloud para almacenamiento externo (External Storage) que saldrá como recomendada.
    5.3. Una vez instalada se debe configurar el nuevo almacenamiento (en nuestro caso de tipo Local) desde la configuración.

Configuracion Extra

Los cambios se hacen en la configuración de nextcloud data/html/config/config.php añadiendo las lineas necesarias.

  1. Si se va a usar por HTTPS se tiene que habilitar el forzado de protocolo
    1.1. 'overwriteprotocol' => 'https'
  2. Si se usa DynHost (ver siguiente tema)
    2.1. 'overwritehost' => 'subdomain.domain.tld'
    2.1.1. Cambiar subdomain.domain.tld por el que hayas puesto en el archivo docker-compose.yaml
    2.2. 'trusted_domains' => array ( 0 => 'subdomain.domain.tld' )
    2.2.1. Cambiar subdomain.domain.tld por el que hayas puesto en el archivo docker-compose.yaml
    2.3. 'trusted_proxies' => array ( 0 => 'subdomain.domain.tld' )
    2.3.1. Cambiar subdomain.domain.tld por el dominio que uses en DynHost
  3. Si se va a usar el listin telefónico
    3.1. 'default_phone_region' => 'ES'

Notas

  • Si se activa TOTP (se requiere HTTPS para ello) y se quiere conectar con una aplicación externa, seguramente se necesite crear una contraseña de aplicación desde Configuración > Personal > Seguridad > Dispositivos y sesiones

Extras

  1. App para Android, permite auto-sincronizar archivos: https://f-droid.org/es/packages/com.nextcloud.client/
  2. Extensión de navegador para sincronizar marcadores: https://floccus.org/

Syncthing

Syncthing sirve para replicar archivos entre servidores.
Para funcionar con syncthing se debe tener una instancia funcionando en todos los equipos que estén involucrados. En nuestro caso tendremos un syncthing ejecutándose en el equipo de sobremesa y otro syncthing ejecutándose en la raspberry pi.

En este apartado se verá como configurar syncthing para tener: [ PC ] (Solo envía) --> [ RPI ] (Solo recibe y versionado de cambios)

Preparando syncthing en el equipo de sobremesa

Aquí se puede optar por usar docker o instalarlo mediante repositorios de tu distro. Lo más sencillo es usar los repositorios de tu distro. Una vez instalado se tiene acceso al panel en: http://127.0.0.1:8384/

Configuración

  1. Añadir la carpeta que queremos tener replicada
    1.1. Pulsar en Agregar Carpeta
    1.2. En la pestaña General
    1.2.1. Poner la Etiqueta de la Carpeta que se quiera para identificarla
    1.2.1. Poner la Ruta de la carpeta que se quiera replicar, en nuestro ejemplo: /home/test/mi_carpeta_sincronizada
    1.3. En la pestaña Avanzado cambiar el Tipo de carpeta a Solo Enviar
  2. Añadir un dispositivo nuevo
    2.1. Pulsar en Añadir un dispositivo
    2.2. En la pestaña General poner el ID del Dispositivo de la rpi
    2.2.1. Para saber este ID ir al panel de syncthing en la rpi (mirar el siguiente apartado para desplegar) y en el menú superior pulsar en Acciones > Mostrar ID
    2.3. Ir a la pestaña Avanzado y cambiar Direcciones a algo como tcp://IP_RPI:22000 (cambiar IP_RPI por la ip de la raspberry)
    2.4. Guardar

Preparando syncthing en la rpi

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

Configuración mínima

  1. Añadir un dispositivo nuevo
    1.1. Pulsar en Añadir un dispositivo
    1.2. En la pestaña General poner el ID del Dispositivo del equipo de sobremesa
    1.2.1. Para saber este ID ir al panel de syncthing en el equipo de sobremesa y en el menú superior pulsar en Acciones > Mostrar ID
    1.3. Ir a la pestaña Avanzado y cambiar Direcciones a algo como tcp://IP_RPI:22000 (cambiar IP_RPI por la ip de la raspberry)
    1.4. Guardar

  2. Añadir la carpeta donde queremos tener la replica
    2.1. Pulsar en Agregar Carpeta
    2.2. En la pestaña General
    2.2.1. Poner la Etiqueta de la Carpeta, en nuestro ejemplo: replica_sobremesa
    2.2.2. Poner el ID de carpeta que se va a replicar
    2.2.2.1. Para saber este ID vamos al panel de syncthing en el equipo de sobremesa y el apartado Carpetas desplegar la información de la carpeta que se quiere replicar y el primer apartado es el ID de carpeta
    2.3. En la pestaña Compartiendo seleccionar el equipo de sobremesa (debería ser la única opción disponible)
    2.4. En la pestaña Versionado de ficheros
    2.4.1. Cambiar el Versionado de ficheros a Versionado escalonado de fichero
    2.4.2. Puedes cambiar la Edad máxima a lo que quieras, por ejemplo, 60 días
    2.5. En la pestaña Avanzado cambiar el Tipo de carpeta a Solo Recibir

  3. Poner una contraseña al panel
    3.1. En el menú superior pulsar en Acciones > Ajustes
    3.1.1. Cambiar el Password de la Interfaz Gráfica de Usuario (GUI)
    3.1.2. Guardar

B

DynHost (OVH)

Una DNS dinámica nos sirve para tener un dominio apuntando a un host que puede ir variando de ip. Teniendo un DynHost podremos tener un dominio como rpi.mysuperdominio.com que usar para conectar a nuestra RPI sin miedo a que se nos reinicie el router.

En este caso la imagen que se usará lanzará una actualización cada 5 minutos.

  1. Lo primero será configurar el DynHost en OVH: https://docs.ovh.com/es/domains/web_hosting_dynhost/

Levantar contenedor

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

3. Levantar el contenedor en modo 'detached': docker-compose up -d
3.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de dynhost levantado o esperando a ser reiniciado.

Un extra sobre la gestión de dominios y DynHost

Vale, ahora que ya está DynHost funcionando seguramente se quiera usar más subdominios... en contra de registrar más DynHost, lo aconsejable es crear DNS de tipo CNAME apuntando al actual registro de DynHost ... así solo se tiene que actualizar un DNS y el resto se fían.
Por ejemplo tener: rpi.ejemplo.com y después como CNAME: vault.ejemplo.com, cloud.ejemplo.com, ....

Let's Encrypt (OVH)

Háganse los certificados!

Configurando OVH para trabajar con traefik

Información sobre reglas de acceso necesarias: https://certbot-dns-ovh.readthedocs.io/en/stable/#credentials

  1. Lo primero es crear una clave de applicación: https://eu.api.ovh.com/createApp/
  2. Luego se debe darle permisos a dicha applicacion:
    curl -XPOST -H "X-Ovh-Application: APPLICATION_KEY" -H "Content-type: application/json" https://eu.api.ovh.com/1.0/auth/credential -d '{"accessRules":[{"method":"GET","path":"/domain/zone/*"},{"method": "POST","path":"/domain/zone/*"},{"method":"PUT","path":"/domain/zone/*"},{"method":"DELETE","path":"/domain/zone/*"}], "redirection": "https://www.domain.tld"}'
    ** Por ejemplo: curl -XPOST -H "X-Ovh-Application: R3uJWoCPyDki9rHCmBES" -H "Content-type: application/json" https://eu.api.ovh.com/1.0/auth/credential -d '{"accessRules":[{"method":"GET","path":"/domain/zone/*"},{"method": "POST","path":"/domain/zone/*"},{"method":"PUT","path":"/domain/zone/*"},{"method":"DELETE","path":"/domain/zone/*"}], "redirection": "https://www.ejemplo.com"}'
    2.1. Esto devolverá el dato consumerKey que debemos guardar
    2.2. RECUERDAR que se debe validar las nuevas credenciales siguiendo el enlace que indican en la respuesta validationUrl

Verificar que todo está correcto

  1. Acceder al panel de OVH y logearse: https://eu.api.ovh.com/console
  2. Ir a /me/api/application y ejecutar para ver el ID de la aplicación
  3. Ir a /me/api/application/{applicationId} (GET) y ver que se puede consultar la "applicationKey".
  4. Ir a /me/api/credential y usando el "applicationId" que se ha obtenido antes se comprueba que devuelve un id de credenciales
  5. Ir a /me/api/credential/{credentialId} (GET) y se comprueba que los permisos de esas credenciales son los que se han indicado antes y que está con status: "validated"
    *** Se puede borrar la aplicación desde /me/api/application/{applicationId} (DELETE)

Actualizar la configuración de traefik y resto de contenedores

Ahora que ya está habilitado todo en OVH es turno de modificar la configuración de traefik para hacer uso de ello.
Revisar el tema de traefik y fijarse en las partes comentadas tanto en traefik.yaml como en docker-compose.yaml.
No olvidar habilitar también las rutas para que las app sean accesibles usando el certificado generado por let's encrypt. En este caso estarán comentadas a modo de plantilla en los respectivos docker-compose.yaml.

DNS CAA (OVH)

CAA es un tipo de registro de DNS para indicar que autoridades están autorizadas a emitir el certificado SSL/TLS.

Crear registro CAA

  1. Acceder a la zona DNS de tu dominio: https://www.ovh.com/manager/web/#/domain
  2. Pulsa en Añadir un registro
    2.1. Pulsa en CAA
    2.2. En indicador pon 0
    2.3. En etiqueta selecciona issue (Esto es para indicar quien puede emitir para el dominio indicado)
    2.4. En destino pon letsencrypt.org
    2.5. Finalia pulsando Siguiente
  3. Añade otro registro CAA pero está vez en etiqueta selecciona issuewild (Esto es para indicar quien puede emitir para los subdominios)
  4. Añade un tercer registro CAA pero está vez en etiqueta selecciona ideof (Esto es para indicar a que correo se enviará una notificación en caso de que alguien intente generar un certificado por vías no autorizadas)
    4.1. En destino pon mailto:tu@correo

Extras

Si todo ha salido bien hasta este punto, si usas https://www.ssllabs.com/ssltest/ debería darte como resultado un A+

Vaultwarden (Solo si usas certificado)

Con vaultwarden tendremos un baúl donde almacenar nuestros secretos más preciados como claves de acceso, tarjetas de crédito, etc... Se trata de una implementación alternativa (no oficial) en Rust del servidor de bitwarden.
Para poder usar vaultwarden se necesita si o si usar HTTPS!

Levantar contenedor (1/2)

  1. Crear una carpeta donde se meterá el archivo docker-compose.yaml. Yo, por ejemplo, lo meto en un disco externo.
  2. El archivo docker-compose.yaml será muy parecido a este:
docker-compose.yaml

3. Levantr el contenedor en modo 'detached': docker-compose up -d
3.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de vaultwarden levantado o esperando a ser reiniciado.

Configuración básica

Con la configuración de este hilo tendremos acceso a vaultwarden desde https://subdomain.domain.tld

  1. Crear una cuenta de usuario

Levantar contenedor (2/2)

Este paso no es necesario, esto es para que no se puedan crear más usuarios.

  1. Para el contenedor: docker-compose down
  2. Ampliar docker-compose.yaml añadiendo dos nuevas variables de entorno (SIGNUPS_ALLOWED y INVITATIONS_ALLOWED):
docker-compose.yaml

3. Levantar el contenedor en modo 'detached': docker-compose up -d
3.1. Tanto en portainer como lanzando docker ls se debe ver el contenedor de vaultwarden levantado o esperando a ser reiniciado.

Extras

  1. Extensión para Chrome: https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb/related
  2. App para Android: https://play.google.com/store/apps/details?id=com.x8bit.bitwarden&hl=en_US&gl=US

** Se tiene que configurar las aplicaciones para que ataquen contra el servidor casero (En la pantalla de login el icono de engranaje en la esquina superior izquierda).

B

Exponer la RPI a internet

Depende de cada router... mirar información sobre como abrir los puertos 80 y 443 (no se necesitan abrir más) apuntando a la rpi.

Incrementar tamaño archivo SWAP

Por defecto se emplean 100MiB para el archivo swap. Se aumentará a 2GiB (el máximo habilitado, aunque se puede llegar a cambiar):

  1. Parar el uso del archivo swap: sudo dphys-swapfile swapoff
  2. Modificar el tamaño: sudo nano /etc/dphys-swapfile
    2.1. CONF_SWAPSIZE=2048
  3. Aplicar los cambios: sudo dphys-swapfile setup
  4. Iniciar el uso del archivo swap: sudo dphys-swapfile swapon
  5. Reiniciar: sudo reboot

ZRAM SWAP

ZRAM SWAP habilita un espacio comprimido (por defecto usando LZ4) de swap en la memoria. Esto nos provee una partición swap de acceso más rápido.

  1. Clonar el repositorio: git clone https://github.com/foundObjects/zram-swap
  2. Instalar: sudo ./install.sh
    2.1. Verificar Instalación: sudo cat /proc/swaps

Ajustar parámetros del kernel

Ya que usamos ZRam, vamos a indicarle al kernel que trabaje un poco más intensamente con la swap.

  1. Editar el archivo sysctl: sudo nano /etc/sysctl.conf
  2. Añadir:
    vm.vfs_cache_pressure=500
    vm.swappiness=100
    vm.dirty_background_ratio=1
    vm.dirty_ratio=50
  3. Aplicar cambios: sudo sysctl --system

Overclocking

En este apartado se verá como hacer que la rpi rinda más. Para ello es necesario asegurarse de que la rpi está bien ventilada! y que la fuente de alimentación pueda ofrecer toda la energia que requiere tanto la rpi como lo que tengáis conectado a ella.

  • Si la rpi supera los 80º empezará con el 'thermal throttling'
  • Si te pasas de hercios (no llega el voltaje), el procesador entrará a trabajar a 700MHz
  • Lo máximo que aconsejan poner la rpi es a 2.0GHz - 1.3V
  • Con los valores por defecto la rpi funciona a 1.5GHz - 1.2V

Explicando parámetros usados para overclocking

gpu_freq -> Indica la frecuencia de la GPU en MHz (No aconsejan jugar con este valor, las ventajas son residuales)
arm_freq -> Indica la frecuencia de la CPU en MHz
over_voltage -> Indica el voltaje:

  • Los valores posibles son de -16 a 8 (0.8V a 1.4V)
  • Cada paso es 0.025V

Poniendola a 1.75GHz - 1.25V

  1. Editar el archivo sudo nano /boot/config.txt
    1.1. Buscar la linea comentada #arm_freq=800
    1.2. Descomentar y dejarla a arm_freq=1750
    1.3. Añadir la linea over_voltage=2
  2. Reiniciar: sudo reboot

Comprobando que está como queremos

  1. Para ver a que frecuencia está configurado ejecuta vcgencmd measure_clock arm, debería de empezar por 1750...
  2. Para comprobar a que frecuencia está trabajando: cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Costes

Vamos a ver a cuanto nos sale tener la rpi conectada 24/7.
Voy hacer el caso de máximo consumo... pero ten en cuenta que el consumo real de tu rpi dependerá de varios factores, como por ejemplo, la temperatura ambiente.

Datos de la RPI4 (B)

Info: https://www.raspberrypi.org/documentation/hardware/raspberrypi/power/README.md

  • Voltaje: 5.1V
  • Amperios máximo: 3.0A
  • Amperios máximo placa: 1.8A
  • Amperios máximo periféricos: 1.2A
  • Voltaje mínimo: 4.63V (+/- 5%)

Coste energético

En este ejemplo usaré un precio medio de 0.28€/kWh (https://tarifaluzhora.es/info/precio-kwh) y un consumo de 15.3W (el tope que da el adaptador de corriente oficial).

  • Consumo mes: 3.13€
  • Consumo año: 37.53€

Ahora le vamos a añadir un DAS (Terramaster D5-300C), pondré un consumo de 45.6W (el que dice el fabricante que se consume bajo carga):

  • Consumo mes: 9.32€
  • Consumo año: 111.85€

Nos quedan los siguientes totales máximos:

  • Consumo mes: 12.45€
  • Consumo año: 149.38€

** Tengo que medir el consumo real que tengo para ofrecer unos datos realistas. Obviamente la rpi no está funcionando al 100% todo el tiempo.
Calculadora online: https://www.calculat.org/es/energia/consumo-de-electricidad.html

Observaciones

La gestión de la energía es importante, como hemos visto en el tema de 'Costes' la energía que reserva la rpi4b para los periféricos puede resultar un tanto escasa.
Por poner un ejemplo, tener dos discos duros alimentados por usb escribiendo/leyendo puede resultar en que algún disco no reciba todo lo que necesita y se desconecte.
Para solucionar este tipo de "problemas" es mejor usar periféricos auto-alimentados, en el caso de los discos duros sería una buena opción usar un DAS.

B

Buenísima iniciativa.

¿Por qué traefik? Personalmente uso nginx proxy manager y siempre he tenido la tesitura de si cambiar me merecería la pena.

1 respuesta
B

#6 Gracias... a ver si dejo esto presentable.
Uso Traefik por que me resulta fácil y para este tema de pequeños servicios va nikelandrup... Además muchos proyectos de docker vienen con nginx como servidor web... asinque en la variedad está el gusto :P
Si ya lo tienes montado con nginx dejaría nginx... por lo que tengo leído (de usuarios de github) da mejor rendimiento que traefik.

1
B

Hilo actualizado... formateado lo mejor que he podido. Cualquier duda, mejora, reproche amoroso es bien recibido.

B

Actualizada la documentación para limpiar el uso de un middleware para redireccionar que ahora se define directamente en traefik.yaml (además del uso de HSTS que ya 'obliga' al navegador a usar HTTPS si o si) ... también he añadido y corregido comentarios en los docker-compose.yaml acerca de este tema.
También se ha comentado la sección referente a HSTS y añadidos comentarios en el middleware secure_headers.yaml

B

yocreoquesi

No estas solo hombre, lo que pasa es que me va el voyeur y prefiero mirar que participar.

3 1 respuesta
KTd3n

Que currada tio, gracias por la info tengo una raspberry por ahi aparcada e igual me animo a hacer alguna cosilla.

1 1 respuesta
B

#11 xDD vale vale... es que como veo que no se anima nadie a comentar nada en plan... "pues yo creo que mejor levantar una base de datos por servicio", "Yo metería/quitaría la cabecera X", "Me gusta más este otro sistema por esto y esto otro...", ...

#12 Cualquier duda ya sabes... pásate por aquí ;)

Gracias por los comentarios, siempre sienta bien conocer que el mensaje es recibido y no queda perdido haciendo eco por los tiempos de los tiempos en el ciberespacio.... :B

willy_chaos

no le estas metiendo mucha caña a una raspi?

podrias añadir algo pada monitorizar el rendimiento de los dockers

1 respuesta
B

#14 Depende del servicio... por ejemplo Nextcloud no va todo lo fino que uno quisiese pero se puede trabajar sin problemas. Para servidor casero (muy pocos usuarios) va de lujo una raspberry. Por lo números que manejo aún se puede darle más caña...
Aún con lo dicho quiero cambiar syncthing (es lo que más consume con diferencia) por algo con rsync...

Respecto a monotorizar... ¿te refieres a algo como ctop? ¿Conoces alguna herramienta en concreto?

1 respuesta
willy_chaos

#15 yo uso zabbix para monitorizar maquinas , pero creo que sensu tiene un modulo para monitorizar dockers

1
B

Por cierto, seguro que lo conoces ya pero para todo esto te vendría genial bookstack, es una pasada para guardar tutoriales y/o no olvidarse de cosas.

Yo seguramente me anime pronto a crear un hilo del estilo con mis servicios.

1 2 respuestas
B

Muy currado el hilo. Tengo una Raspi 3 dese hace 5 años y la uso para kodi y stream de juegos con Moonlight y Steam.

Lo mismo me animo a ponerle el pi hole pero no la tengo encendida 24/7 así que de momento me lo pensare

willy_chaos

#17 justo vamos a implementarlo en el curro (bookstack)

B

#17 No lo conocía, pero lo meteré ya que me interesa tener algo como eso montado. Gracias.

Subiré cambios esta semana para meter "bookstack", configuración básica de fail2ban y espero cambiar el sistema de syncthing por algo más liviando con rsync. También un par de pautas para asegurar un pelin más el servidor.

Usuarios habituales

Tags