Como programadores curiosos siempre queremos saber más sobre el entorno en el que trabajamos ya que en nuestro sector, el conocimiento lo es todo y en muchas ocasiones por simple curiosidad. Me imagino que no habré sido el único que estando en el trabajo, ejecutando una job en jenkins pensó en ¿cómo funciona esto realmente? ¿cómo puedo replicar esto en mi casa? y sobre todo “me vendría bien para mis proyectos personales”.
Con esta idea en mente me puse a investigar y me decidí a montar mi propio homelab como si de un entorno empresarial se tratase.
Hardware
Para nuestro hardware evidentemente necesitamos, mínimo, un equipo con ciertas características:
- 8 núcleos
- 16 GB de RAM
- 256 GB de SSD
Sabiendo esto decidí ir por una opción que llevaba tiempo escuchando de varios youtubers de IT, usar placas chinas con procesadores Xeon de segunda mano. En Aliexpress se encuentra algunos “combos” con la RAM y el procesador y están bien de precio.
En mi caso opté por comprar placas huananzhi que parece ser que son las que tienen mejor calidad. En concreto el modelo x99 en un pack con 16GB de RAM y un procesador Xeon E5 v3 de 8 núcleos.
También desempolvé mi viejo ordenador con procesador AMD de 8 núcleos y 32GB de RAM y lo agregue al homelab.
Sistema operativo
Como contamos con hardware con cierta potencia no es recomendable usar un solo equipo por servicio, pues nos saldría muy caro. Es por esto que incluso en entornos empresariales se usan servidores virtualizados. Es decir, se crean varias máquinas virtuales en un solo equipo y cada maquina se ejecuta el servicio correspondiente.
En mi caso opté por usar Proxmox, que es un sistema operativo que permite crear máquinas virtuales y contenedores en un solo equipo, y gestionado desde el navegador (Web Admin).
La ISO la podemos encontrar en la web oficial de Proxmox [https://www.proxmox.com/en/products/proxmox-virtual-environment/overview]. Es un Debian enfocado en virtualización tanto con contenedores (LXC) como con máquinas virtuales (KVM).
Servicios
En nuestro caso vamos a montar un entorno completo para poder disponer de un CI el CD lo dejaremos más adelante con kubernetes. Por lo tanto tendremos:
- Gitlab: para tener nuestros repositorios de código.
- Jenkins: para la automatización de tareas.
- Nexus Repository: para almacenar artefactos.
- Nextcloud: para almacenamiento en la nube.
- Pi-hole: para DNS y DHCP.
- WireGuard + WireGuard Web UI: para VPN.
- Samba Active Directory: para tener un directorio centralizado.
Active Directory con Samba AD/DC
Instalación y Rol del Dominio
Samba permite implementar un controlador de dominio compatible con Active Directory. Nosotros crearemos una máquina virtual en proxmox para samba, esta no necesita muchos recursos, con 2 núcleos y 4 GB de RAM es suficiente.
Una vez creada la maquina virtual podemos acceder a la consola mediante la web de proxmox o mediante ssh. (más cómodo es ssh).
En la maquina virtual ejecutamos:
apt install samba krb5-config winbind smbclient
samba-tool domain provision --use-rfc2307 --interactive
Aquín nos realiza una serie de preguntas:
- Dominio:
lab.localo el que queráis - Realm:
LAB.LOCALo el que queráis (siempre en mayúsculas) - Rol: DC
- DNS backend: SAMBA_INTERNAL
- DNS forwarder: la IP de nuestro router o de google
8.8.8.8 - Password del administrador: la que queráis
Nota: En caso de usar pi-hole como DNS interno, este debe ser el
DNS forwarder.
Posteriormente:
systemctl disable smbd nmbd winbind
systemctl enable samba-ad-dc
systemctl start samba-ad-dc
Con esto ya tendríamos nuestro samba funcionando. Más adelante veremos como crear usuarios y grupos para poder gestionar nuestros servicios.
Beneficios en el Homelab
- Autenticación centralizada
- Gestión de usuarios y grupos
- Preparación para integración LDAP futura
- Simulación de entorno corporativo real
DNS Interno y DHCP con Pi-hole
Si somos personas normales estaremos acostumbrados a acceder a las webs mediante su dominio y no por su dirección IP, por lo que en nuestro homelab necesitaremos un servidor DNS interno que se encargue de resolver los dominios de nuestros servicios.
Para está función hemos elegido Pi-hole, que es un servidor DNS que permite bloquear anuncios y dominios maliciosos, además de permitirnos crear registros DNS personalizados.
En nuestro caso le hemos asignado doble tarea:
- DNS interno
- DHCP: porque queremos crear una red de tipo A y el router del proveedor no nos lo permite.
Instalación
Crearemos una máquina virtual en proxmox para pi-hole, esta no necesita muchos recursos, con 2 núcleos y 2/4 GB de RAM es suficiente. En la maquina virtual podremos instalar Debian como sistema operativo base.
Para la instalación de pi-hole podemos seguir la guía oficial [https://docs.pi-hole.net/main/basic-install/].
Una vez instalado pi-hole, nos deja acceder a la interfaz web desde el navegador.
La dirección será: http://[IP_ADDRESS]/admin. Se nos cargará la pantalla de inicio de sesión y nos indicará donde buscar la contraseña de administrador.

Configuración DNS Interno
Una vez accedido al panel de administración de pi-hole, podemos configurar los registros DNS internos para poder asignar nombres FQDN a nuestros servicios.
Para hacer esto deberemos irnos a Settings -> Local DNS Records en el panel lateral izquierdo:
Se nos mostrará una lista de registros DNS vacía, donde podremos añadir los registros DNS de nuestros servicios en el formulario inferior.
En este formulario pondremos sel dominio y la IP correspondiente, por ejemplo:
| Servicio | IP Interna | Registro DNS |
|---|---|---|
| AD | 10.10.10.10 | ad.lab.local |
| GitLab | 10.10.10.20 | git.lab.local |
| Jenkins | 10.10.10.21 | jenkins.lab.local |
| Nexus | 10.10.10.22 | nexus.lab.local |
| Nextcloud | 10.10.10.23 | cloud.lab.local |
| WireGuard | 10.10.10.30 | vpn.lab.local |
DHCP desde Pi-hole
En Pi-hole tenemos la opción de iniciar un servidor DCHP que se encargue de asignar la configuración de red a los nuevos dispositivos que se conecten a nuestra red. Para qué nos resulta útil, vamos a verlo.
Tenemos levantada una red local, la cual la gestiona el router del proveedor, esto significa que se encarga de:
- Dar acceso a la WAN (“internet”)
- Asignar IPs a los dispositivos
- Configurar los DNS de los nuevos dispositivos
La configuración de los dns de los dispositivos se asigna en la petición que se realiza al DHCP del router, este tiene configuradas las IPs de los servidores DNS del proveedor. Nosotros acabamos crear nuestro propio DNS y con bloqueo de anuncios, por lo que nos interesa que los dispositivos utilicen nuestro DNS. Para esto podemos asignar dispositivo a dispositivo un DNS estático pero en cuanto salgamos a otra red nos quedaremos sin servidor DNS (que es casi como quedarse sin Internet). Por esto levantaremos el servicio DHCP en Pi-hole y apagaremos el del router del proveedor para que en el aprovisionamiento de IP se mande el DNS a usar, la dirección de nuestro Pi-hole.
Para activarlo, en el panel izquierdo, en Settings -> DHCP podremos acceder a la configuración, solo deberemos indicarle que rango de IPs queremos usar, la dirección del router y activar el DHCP:

Esto garantiza que todos los dispositivos utilicen el DNS del homelab.
GitLab: Control de Código y DevOps
Gitlab es una herramienta muy usada en el entorno de desarrollo, es muy útil para controlar el código fuente de los proyectos y para gestionar pipelines de integración y despliegue. Gracias a su organización de grupos nos permite trabajar en proyectos multirepositorio de forma más cómoda (Uno de los principales motivos por los que se usa en entornos empresariales).
Instalación
GitLab puede desplegarse mediante paquete Omnibus en una VM dedicada. Los requisitos de gitlab son más elevados:
- 2 núcleos
- Más de 4GB de RAM
- El espacio en disco limitará la cantidad de repositorios que podremos tener.
Gitlab nos permite conectarnos a una base de datos postgresql y una redis para el caché, lo cual, dependiendo de la carga que le demos a gitlab no permitirá tener más replicas de gitlab en nuestro homelab. En nuestro caso lo desplegaremos todo en la misma máquina virtual.
Para la instalación usaremos el paquete omnibus de gitlab:
apt install curl openssh-server ca-certificates
curl --location "https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh" | sudo bash
sudo apt install gitlab-ce
Nota: Le podemos pasar la variable de entorno
EXTERNAL_URLpara indicarle la URL externa de gitlab:sudo EXTERNAL_URL="http://git.lab.local" apt install gitlab-ce.
En caso que no hayamos usado la variable de entorno, podemos editar el archivo de configuración de gitlab, cuya ruta es /etc/gitlab/gitlab.rb.
# file: /etc/gitlab/gitlab.rb
# Cambiamos la url
external_url "http://git.lab.local"
Para que los cambios surtan efecto, debemos ejecutar:
gitlab-ctl reconfigure
Jenkins: CI/CD Interno
Jenkins es un servidor de integración y despliegue continuo que nos permite automatizar el proceso de integración y despliegue de nuestros proyectos. Esto nos reduce el tiempo de integración y despliegue de nuestros proyectos.
Para jenkins necesitaremos al menos 4GB de RAM y más de 50GB de espacio en disco.
Instalación
Jenkins se despliega en una VM independiente, por lo que debemos crear una máquina virtual en proxmox para jenkins. Aparte, también necesitamos instalar java para que jenkins pueda funcionar. En la web oficial de jenkins encontraremos las guías de instalación para diferentes sistemas operativos, en nuestro caso usaremos ubuntu/debian.
Web oficial: https://www.jenkins.io/download/
# Instalamos java, puede ser la version 21 o la última
apt install openjdk-21-jre
# Añadimos el repositorio de jenkins
sudo wget -O /etc/apt/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key
echo "deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update
sudo apt install jenkins
Podemos acceder a través de la url:
http://jenkins.lab.local:8080
Nexus Repository
Nexus es un servidor de repositorios que nos permite gestionar:
- Artefactos Maven
- Imágenes Docker
- NPM
- Repositorios de python (pip)
- Repositorios de nuget
Es muy útil para tener un control centralizado de las dependencias de nuestros proyectos, sobre todo cuando son dependencias internas.
Instalación
Para nexus crearemos otra maquina virutal debian, con 2 núcleos y 4GB de RAM. Una vez creada descargaremos el comprimido de nexus que encontraremos en la web oficial.
Web oficial: https://help.sonatype.com/en/download.html?ref=devopscube.com
Copiaremos la url descarga y la terminal de nuestro Debian pondremos:
wget -O nexus.tar.gz <URL>
tar -xvf nexus.tar.gz
./nexus/bin/nexus start
Podemos crear un
service unitpara que se inicie automáticamente al arrancar el sistema:
[Unit]
Description=Nexus Repository Manager
After=network.target
[Service]
Type=forking
# ruta de la carpeta donde se encuentra nexus
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Group=nexus
Restart=on-failure
[Install]
WantedBy=multi-user.target
Podremos acceder a nuestro nexus en la siguiente url:
nexus.lab.local:8081
Nextcloud: Almacenamiento Privado
Nextcloud es una suite de productividad personal que permite tener control total sobre tus datos, no solo para archivos, sino también para calendarios, contactos, tareas, etc. Junto con su sistema de aplicaciones permite añadir funcionalidades como:
- Videoconferencias
- Gestión de proyectos
- Gestión de contraseñas
- Integración con LDAP
Instalación
Par nextcloud crearemos otra vm, los recursos le asignaremos según el uso que le demos. Tendremos que poner en marcha un servidor MariaDB/MySQL para poder conectar nextcloud y un servicio HTTP, podemos elegir entre Apache (la vieja confiable), o Nginx, esto os dejo a vuestra elección.
Nota: en Nginx hay que instalar y configurar algunas cosas más para poder usar php, en apache viene preconfigurado por defecto
Nextcloud nos proporciona varias formas de instalación:

- Web Installer: nos descargamos un archivo PHP que colocamos en nuestro servidor Apache/Nginx y lo ejecutamos desde el navegador, nos da indicaciones para su instalación.
- Archive: nos ofrece un zip con los archivos que tendremos que descomprimir en nuestra carpeta del servidor.
- Snap Package: podemos instalar nextcloud server mediante el gestor snap.
- Docker Image: nos permite levantar un contenedor con nextcloud.
Depende de cada uno que opción tomar, en mi caso opté por el instalador web, donde nos pregunta por las credenciales de acceso a MariaDB y descarga los archivos necesarios.
Una vez instalado podremos acceder a través de la ruta del DNS:
http://cloud.lab.local
Exposición Segura con DuckDNS y WireGuard
No tendría sentido todo el entorno si no podemos acceder desde fuera de la red, podemos crear una red VPN como las empresas de forma gratuita y de forma muy rápida.
DuckDNS (DDNS)
El primer problema que tenemos es que la IP pública que nos asigna el proveedor suele ser dinámica, lo que significa que cada cierto tiempo, normalmente cuando se apaga el router, se cambia de IP. Por lo que no podremos usar nuestra IP pública directamente, es por esto que existen servicio de DDNS (Dynamic DNS) que nos permiten tener un subdominio apuntando a nuestra IP pública y mediante una API podremos refrescar dicha IP.
DuckDNS[https://duckdns.org]
es un servicio de DDNS que nos ofrece subdominios del tipo mydomain.duckdns.org.
Esto junto con una crontab o la herramienta dux-updater (herramienta de desarrollo propio: https://github.com/Marck-G/dux-updater) podemos mantener actualizado nuestro registro DDNS.
Script de actualización:
echo url="https://www.duckdns.org/update?domains=mihomelab&token=TOKEN&ip=" | curl -k -o ~/duck.log -K -
Port Forwarding en el Router
Para que pueda pasar tráfico a nuestra red local debemos implementar una regla de port forwarding en nuestro router, en concreto a la maquina que tendrá el servidor Wireguard.
- Puerto UDP 51820 → VM WireGuard
Nunca exponer directamente GitLab, Jenkins o AD.
WireGuard: Acceso Seguro a la Red Interna
WireGuard proporciona VPN ligera y segura, a diferencia de otros como Tailscale(https://tailscale.com/) que nos limitan los equipos a los que accedemos y los usuarios, con wireguard podemos exponer toda la red local.
Instalación de WireGuard
Podemos reutilizar alguna maquina virtual creada o crear una nueva, lo más seguro será crear una nueva desde 0, en mi caso con Debian, por lo que la instalación de Wireguard la haremos mediante aptitude:
apt install wireguard
Generar claves para el servidor:
wg genkey | tee privatekey | wg pubkey > publickey
Y crearemos un archivo de configuración para la nueva interfaz.
Archivo /etc/wireguard/wg0.conf:
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.10.0.2/32
Habilitamos el forwarding en nuestro servidor:
sysctl -w net.ipv4.ip_forward=1
WireGuard Web UI
Para manejar de forma más fácil nuestro wireguard podemos instalar Wireguard UI https://github.com/ngoduykhanh/wireguard-ui que nos expone un servicio web de administración (Web Admin).
Para su instalación seguimos los pasos que nos dice en el repositorio de GitHub:
- Descargamos el binario del repositorio
- Creamos un System Unit siguiendo las instrucciones
- Activamos el nuevo servicio y lo ejecutamos
Esto nos expone un Web admin en el puerto 5000

Una vez que hayamos accedido deberemos establecer el endpoint para que lo configure con los clientes nuevos, así como el DNS:

En los DNS hay que poner el local y uno global para poder tener acceso a internet
Flujo de Acceso Remoto
- Cliente se conecta a
mihomelab.duckdns.org - Router redirige puerto 51820 → VM WireGuard
- WireGuard asigna IP 10.10.0.x
- Cliente usa DNS interno (Pi-hole)
-
Acceso a:
- git.lab.local
- jenkins.lab.local
- cloud.lab.local
- nexus.lab.local
El acceso es equivalente a estar físicamente en la red local.
Próximos pasos
Tras todo esto tenemos montado nuestro propio homelab, en otra ocasión veremos como conectar todo al Active Directory mediante LDAP para disponer de autenticación centralizada