Skip to content

Preparando el sistema tu HomeLab

Servidor doméstico local y/o virtual con Linux Debian

Si cuentas una buena máquina, que tenga alta capacidad de memoria, puedes plantearte tener disponible tu propio servidor doméstico.

Abordaremos ciertas pautas y pasos para lograr un HomeLab de base a partir de Linux Debian. Para ello, iremos directo a la configuración teniendo como prerrequisito el sistema previamente instalado.

Puedes verificar otros artículos que he publicado sobre el sistema operativo y otras tecnologías que usaremos para comenzar con el HomeLab:

Sobre uso de máquina Virtual

Si tienes Windows, es posible usar máquinas virtuales con sowftware como VMWare Workstation Pro o VirtualBox. De este modo puedes configurar el sistema Linux Debian y seguir los pasos. De hecho, al usar tu máquina virtual con estas herramientas, puedes considerar una distribución con un entorno gráfico ligero como Q4OS, la cual ocupa una base de memoria de tan solo 580 MB en RAM y es derivada de Linux Debian.

También podrías adquirir un servicio privado virtual (VPS) o instancias de compunto a través de proveedores como AWS y otros.

Si usas una máquina virtual con software como VMWare Workstation Pro, asegurate que el adaptador de red este cofigurado como puente (Bridge). Además, allí mismo se recomienda habilitar opción Replicar el estado de la conexión de red física (Replicate physical network connection state). Puedes obtener y verificar la IP ejecutando:

bash
ip addr show

Normlamente identificas la IP con el daptador de red ens33

En cualquier escenario, para seguir la configuración de esta guía será necesario tener disponible una máquina aprovisonada con Linux Debian o deriviados y habiliar la red.

Comenzando la configuración en Linux

Una vez instalada tu máquina con Linux Debian, verifiquemos instalación de paquetes esenciales ejecutando las siguientes líneas:

bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl wget git neovim -y

Para preparar el acceso a la máquina, debemos configurar el hostname, por ejemplo, ejecutando:

bash
sudo hostnamectl set-hostname homelab
sudo systemctl restart systemd-hostnamed

Podemo habilitar mDNS, con el demonio avahi, para resolver el dominio localmente, ejecutando:

bash
sudo apt install avahi-daemon avahi-utils -y
sudo systemctl start avahi-daemon

Si estas usando máquina virtual desde Windows, debes editar C:\Windows\System32\drivers\etc\hosts agregando la dirección IP y el domino, por ejemplo: 192.168.1.2 homelab.lan (prueba leugo con ping)

Servicios y utilidades a instalar

Para mejorar las prestaciones o capacidades podemos instalar otros servicios, Además, continuaremos incluyendo paquetes inciales para certificados, GnuPG, docker, y alguno otro.

SSH

bash
sudo apt install openssh-server -y
sudo systemctl status ssh

Si es necesario activar el servicio ejecuta: sudo systemctl start ssh && sudo systemctl enable ssh
Pudes configurar

dnsmasq

bash
sudo apt install dnsmasq -y
dnsmasq --version

Para los subdominios que se definan, debes editar el archivo /etc/dnsmasq.conf, por ejemplo, teniendo un contenido como el siguiente:

bash
domain-needed
bogus-priv
expand-hosts
domain=homelab.lan                          # Domain
local=/homelab.lan/
address=/homelab.lan/192.168.1.2            # IP for VM
address=/portainer.homelab.lan/192.168.1.2  # Subddomain
address=/copyparty.homelab.lan/192.168.1.2  # Subddomain
address=/n8n.homelab.lan/192.168.1.2        # Subddomain
listen-address=192.168.1.2                  # IP for Listening
bind-interfaces

Agrega subdominios según necesites mediante address=/.../...
Recuerda cambiar la IP por la obtenida con: ip addr show

Luego ejecutamos:

bash
sudo systemctl restart dnsmasq

Docker

Utiliza las siguientes sentencias para instalar Docker:

bash
sudo apt install apt-transport-https ca-certificates  software-properties-common -y

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

sudo usermod -aG docker $USER
newgrp docker

Portainer

Utiliza las siguientes sentencias para instalar Portainer:

bash
docker network create homelab
docker volume create portainer_data

docker run -d -p 9000:9000 -p 9444:9443 \
    --name portainer \
    --network homelab --restart always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v portainer_data:/data portainer/portainer-ce:latest \

Caddy con certificados locales

Primero, creamos la estructura de directorios:

bash
mkdir -p ~/wsconf

Creamos un archivo ~/wsconf/Caddyfile con configuración para certificados locales:

groovy
{
    # Configuración global para CA local
    local_certs
    admin off
}

# Sitio principal
homelab.lan {
    respond "Welcome to HomeLab" 200
    tls internal
}

# Portainer
portainer.homelab.lan {
    reverse_proxy portainer:9000
    tls internal
}

# Copyparty
copyparty.homelab.lan {
    reverse_proxy copyparty:3923
    tls internal
}

# n8n
n8n.homelab.lan {
    reverse_proxy n8n:5678
    tls internal
}

Nótese que usamos una configuración global, luego se define el sitio principal de bienvenida y después los bloques por cada servicio que se incluya.

Para establecer el contenedor ejecutamos:

bash
docker volume create caddy_data

docker run -d -p 80:80 -p 443:443 \
    --name caddy \
    --network homelab --restart always \
    -v $PWD/wsconf:/etc/caddy \
    -v caddy_data:/data \
    caddy

Instalar certificado CA local

Para que el navegador confíe en los certificados, debemos instalar la CA de Caddy, usando los siguientes comandos:

bash
docker cp caddy:/data/caddy/pki/authorities/local/root.crt /tmp/caddy-root.crt
sudo cp /tmp/caddy-root.crt /usr/local/share/ca-certificates/caddy-root.crt
sudo update-ca-certificates

Se extrae certificado CA de Caddy, se copia al sistema y se actualizan certificados

Copyparty

Primero se define archivo de configuració de Copyparty en la ruta ~/wsconf/copyparty.conf con el siguiente contenido:

ini
[/]
  ./
  accs:
    rw: *

Utiliza las siguientes sentencias para instalar Copyparty:

bash
mkdir -p ~/wsroot

docker run -d -p 3923:3923 \
    --name copyparty \
    --network homelab --restart always \
    -v $PWD/wsroot:/w \
    -v $PWD/wsconf:/cfg \
    copyparty/ac:latest

wsroot representa la carpeta compartida

n8n

Utiliza las siguientes sentencias para instalar n8n:

bash
docker volume create n8n

docker run -d \
    --name n8n \
    --network homelab --restart always \
    -p 5678:5678 \
    -v n8n:/home/node/.n8n \
    n8nio/n8n

Configuración del cliente (Windows)

Para acceder desde Windows con certificados válidos:

1. Configurar DNS

Editar C:\Windows\System32\drivers\etc\hosts como administrador para incluir un bloque como el siguiente:

192.168.1.2 homelab.lan
192.168.1.2 portainer.homelab.lan
192.168.1.2 copyparty.homelab.lan
192.168.1.2 n8n.homelab.lan

De modo semejante, al interior del sistema Linux se ussaría el archivo /etc/hosts

2. Instalar certificado CA

Requerda que en la máquina virtual Linux, se debe haber obtenido el certificado: docker cp caddy:/data/caddy/pki/authorities/local/root.crt /tmp/caddy-root.crt

Puedes transferir a Windows (via SCP, compartir carpeta, etc.), y desde el sistema anfitrión hacer lo siguiente:

  1. Doble clic en caddy-root.crt
  2. Clic en botón "Instalar certificado..."
  3. Para ubicación del almacén elegir "Equipo local"
  4. Luego "Colocar todos los certificados en el siguiente almacén"
  5. "Examinar" y seleccionar "Entidades de certificación raíz de confianza"
  6. "Siguiente" y "Finalizar"

3. Verificar funcionamiento

Si necesitas reiniciar la configuración, recuerda usar los siguientes comandos:

bash
docker restart caddy
sudo systemctl restart dnsmasq
docker logs caddy

Prueba acceder con HTTPS válido desde el navegador consultando:

  • https://homelab.lan
  • https://portainer.homelab.lan
  • https://copyparty.homelab.lan
  • https://n8n.homelab.lan

4. Alternativa para cliente macOS

Si tienes un equipo con macOS en la red, prueba lo siguiente:

  • Configura la IP y nombres de dominio/subdominios en archivo /etc/hosts
  • Transfiere el archivo del certificado caddy-root.crt. Puedes usar la conexion insergura primero y con Copyparty descargar ese archivo si esta disponible en su ruta de archivos)
  • Importa el certificado en macOS. Para ello, se puede dar doble clic en el archivo caddy-root.crt.
  • En la ventana de "Acceso a Llaveros" se debe seleccionar el llavero "Sistema" y agregarlo.
  • Se solicitará la contraseña de "admin" para que la ingreses.
  • Revisa que se indique "Confiar siempre" en el certificado agregado.
  • Prueba el dominio/subdominios desde un navegador.

Diferencias al usar VPS con proveedor de nube

Si implementas esta configuración en un VPS con proveedores como AWS, Vultr o servicios de hosting, los cambios principales serían:

Certificados SSL reales

En lugar de certificados locales, usar Let's Encrypt para certificados válidos públicamente en archivo de configuración Caddyfile. Veamos:

groovy
yourdomain.com {
    reverse_proxy localhost:3000
}

portainer.yourdomain.com {
    reverse_proxy localhost:9000
}

copyparty.yourdomain.com {
    reverse_proxy localhost:3923
}

n8n.yourdomain.com {
    reverse_proxy localhost:5678
}

yourdomain.com representa el dominio respectivo

DNS público

  • No usar dnsmasq: Los subdominios se configuran en el proveedor DNS (Cloudflare, Route53, etc.)
  • Registros A: Apuntar subdominios a la IP pública del VPS
  • Firewall: Configurar reglas para puertos 80, 443, 22

Seguridad adicional

Verificar o instalar UFW:

bash
sudo apt update
sudo apt install ufw -y
sudo ufw status

Configurar firewall UFW:

bash
sudo ufw allow ssh
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

Evitar que Docker use iptables, editando archivo /etc/docker/daemon.json y agregando el siguiente contenido json:

json
{
  "iptables": false
}

Para que el cambio tenga efecto, reinicia Docker así: sudo systemctl restart docker

Cambiar puerto SSH por seguridad y deshabilitar autenticación por contraseña:

bash
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo systemctl restart ssh

sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config

Backup y monitoreo

Incorpora un backup automático de volúmenes Docker.

bash
docker run --rm -v portainer_data:/data -v $PWD:/backup alpine tar czf /backup/portainer-backup.tar.gz /data

Para monitoreo considera Uptime Kuma:

bash
docker run -d -p 3001:3001 -v uptime-kuma:/app/data --name uptime-kuma louislam/uptime-kuma:1

Ventajas del VPS

  • Acceso global: Disponible desde cualquier lugar
  • Certificados válidos: Sin configuración manual de CA
  • IP estática: No cambia como en redes domésticas
  • Ancho de banda: Mejor conectividad que conexiones domésticas
  • Uptime: Mayor disponibilidad que equipos domésticos

La elección entre HomeLab local y VPS depende de tus necesidades de acceso, presupuesto y preferencias de control sobre la infraestructura.

Consideraciones adicionales para tu HomeLab

  • Energía: Considera un UPS para evitar cortes de energía
  • Red: Usa un router para tu propia red, o bien, una red cableada para mejor estabilidad
  • Seguridad: Mantén el sistema actualizado considerando prácticas de seguridad
  • Backup: Implementa estrategias de respaldo para datos importantes
  • Monitoreo: Considera herramientas para monitorear el estado del sistema y servicios
  • Experimentación: Usa el HomeLab para probar nuevas tecnologías y configuraciones

De hecho, puedes agregar, por ejemplo, servicio para Supabase, Redis, servicio de IA local con Ollama y tecnologías de tu preferencia.

En el caso de Supabase, con Docker Compose se crea una red propia y el contenedor del Dashboard sería supabase-kong. Para ello recuerda agregar /etc/dnsmasq.conf un subdominio supabase.homelab.lan y configura en Caddyfile lo siguiente:

groovy
supabase.homelab.lan {
    reverse_proxy supabase-kong:8000
    tls internal
}