# HomeLab Cómo tengo montados mis servicios # Hardware Documentación sobre el hardware instalado. # Dell Precision Tower 5810 (Proxmox) El objetivo de esta estación de trabajo es la de albergar el Proxmox procedente de un servidor Dell PowerEdge T330 para conseguir igual o mayor potencia. ## Estación de trabajo Lo consigo por 215€ en eBay en un proveedor profesional español con la siguiente configuración:
CPUIntel Xeon E5-1620 v4 @ 3.50 GHz
RAMDDR4 16GB 2400MHz RDIMM ECC
HD480GB SSD
T. gráficaNVIDIA QUADRO K620 2GB
A falta de un poco de limpieza (aunque el interior está muy bien), esta es la estación de trabajo, podemos ver el frontal: [![Dell Precision Tower 5810 Frontal](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8295.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8295.png) También la parte trasera: [![Dell Precision Tower 5810 Trasera](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8296.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8296.png) El esquema interior de la placa base: [![Dell Precision Tower 5810 Tapa interior](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8298.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8298.png) El interior con las guías de ventilación: [![Dell Precision Tower 5810 Interior A](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8299.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8299.png) Y sin las guías de ventilación: [![Dell Precision Tower 5810 Interior B](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8301.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8301.png) En este punto, lo que más me interesa es la versión de CPU (v4), para asegurarme de que la estación de trabajo ya viene probada con esta configuración y, si tengo la suerte de que salió así de fábrica, la memoria ya sería a 2400MHz (los que tenían configuración v3 salía de fábrica la RAM con módulos a 2133MHz). Sobre la memoria, me hubiese gustado que tuviera más, pero todas las configuraciones que he encontrado en tiendas de la Comunidad Europea suelen variar entre 16GB y 32GB. Teniendo en cuenta que se puede poner un máximo de 128GB, no entiendo cómo no he encontrado más variación. ## CPU Toca cambiar la CPU para asemejarla lo máximo al servidor que tengo actualmente el Proxmox que irá aquí: Intel Xeon E3-1270 v6 @ 3.80GHz (4 núcleos y 8 hilos). Así que busco una vez más en eBay y encuentro en un proveedor profesional un Intel Xeon E5-1650 v4 @ 3.60 GHz con un coste de 28,30 libras con portes y aduanas incluidas (35,54€), que si bien funciona un poco más lento en modo monohilo, en multihilo es un 22% mejor. Así que mejora la virtualización de máquinas. Aquí se puede ver la comparativa de las CPUs: [https://www.cpubenchmark.net/compare/3014vs2777vs2838/Intel-Xeon-E3-1270-v6-vs-Intel-Xeon-E5-1620-v4-vs-Intel-Xeon-E5-1650-v4](https://www.cpubenchmark.net/compare/3014vs2777vs2838/Intel-Xeon-E3-1270-v6-vs-Intel-Xeon-E5-1620-v4-vs-Intel-Xeon-E5-1650-v4) [![image.png](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/image.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/image.png) Aquí podemos ver la "nueva" CPU instalada: [![Dell Precision Tower 5810 Intel Xeon E5-1650 v4](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8309.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8309.png) ## Memoria RAM Para la memoria también estaba claro que necesitaba la misma cantidad que la que disponía en el servidor de origen, por lo que necesitaba 64GB a 2400MHz. Como la estación de trabajo ya trae 16GB, una opción hubiera sido comprar 48GB (6 módulos de 8GB), pero era una opción más cara que comprar dos módulos de 32GB y así conseguía, de rebote, una nada despreciable cantidad de 80GB en total (2x8GB + 2x32GB). Una vez más, encontré en eBay un proveedor profesional que me arregló un poco el precio (5€ menos por módulo) y se quedó en 67,90€ con gastos incluidos. [![Dell Precision Tower 5810 memoria RAM.png](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8318.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8318.png) ## Adaptador SSD 3,5" a 2,5" La estación de trabajo ya viene con un SSD de 480GB con Windows 10 instalado, pero como no lo voy a utilizar (de momento), lo guardaré por si lo puedo reaprovechar. Por tanto el sistema dispone de 2 *caddies* para discos de 3,5". En el primero ya tiene un adaptador de 3,5" a 2,5", pero necesito otro para el otro *caddy*, ya que moveré los dos discos SSD desde el servidor actual a éste. Mirando adaptadores en eBay (*again*), veo que los que hay originales (y no tan originales) de Dell no son muy económicos, por lo que lo compro en Amazon: un adaptador que además (esto no lo sabía) soporta 2 SSDs a la vez por 6,64€. Así que esta vez considero que no es necesario ser "originales" al 100%. [![Dell Precision Tower 5810 adaptador 3.5](https://docs.lynze.net/uploads/images/gallery/2025-01/scaled-1680-/img-8300.png)](https://docs.lynze.net/uploads/images/gallery/2025-01/img-8300.png) ## Total costes Bueno, pues teniendo en cuenta que la mayoría de ofertas que encontraba en eBay era de 300€ para arriba con configuraciones muy inferiores a esta, creo que no está mal si rebuscas bien y encuentras buenas ofertas.
**Concepto****Precio**
Estación de trabajo`215,--€`
CPU`35,54€`
Memoria RAM`67,90€`
Adaptador SSD 3,5" a 2,5"`6,64€`
**TOTAL**`325,08€`
# Docker Documentación relativa a los containers creados. # Índice Para todos estos servicios que aquí se muestran, se da por supuesto que ya está instalado en el servidor, [Docker](https://www.docker.com/). Si no lo está, se pueden seguir las instrucciones que se encuentran en su web: - [Get Docker](https://docs.docker.com/get-docker/) - [Install Docker Engine](https://docs.docker.com/engine/install/)
HerramientaDescripción
[Portainer](https://docs.lynze.net/books/homelab/page/portainer "Portainer")Gestor gráfico para contenedores Docker
[Cloudflare Tunnel](https://docs.lynze.net/books/homelab/page/cloudflare-tunnel "Cloudflare Tunnel")Acceso a tus servicios desde Internet
[Excalidraw](https://docs.lynze.net/books/homelab/page/excalidraw "Excalidraw")Pizarra virtual
[MariaDB](https://docs.lynze.net/books/homelab/page/mariadb "MariaDB")Base de datos MariaDB
[PostgreSQL](https://docs.lynze.net/books/homelab/page/postgresql "PostgreSQL")Base de datos PostgreSQL
# Portainer

Más información en [Portainer](https://www.portainer.io/).

Este es el script que uso para generar y actualizar Portainer (aunque últimamente se puede actualizar desde la interfaz): ```bash #!/bin/bash container="portainer-ee" echo "Actualizamos la imagen de $container" docker pull portainer/portainer-ee echo "Paramos $container" docker stop $container echo "Borramos el dock de $container" docker rm $container echo "Creamos el dock de $container" docker run -d -p 9000:9000 -p 9001:9001 \ --restart always \ --name="$container" \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ./portainer-ee:/data \ portainer/portainer-ee:latest echo "Hecho." ``` De esta manera siempre que ejecutemos este archivo nos bajará la última versión estable por defecto, parará el contenedor de **Portainer**, lo borrará (no perderemos datos) y lo volverá a levantar. El directorio donde se guardan los datos persistentemente y que se ha de hacer copia de seguridad, en este caso es el directorio donde se ejecute el script dentro de `portainer-ee`. El archivo generado se le ha de dar permisos de ejecución. Por ejemplo: ```bash chmod 700 portainer-ee.sh ``` Recordar que si queremos eliminar las imágenes antiguas para liberar espacio en disco, podemos ejecutar: ```bash docker image prune -a ```

En el caso que aquí se expone, se llama a la versión *Enterprise* que permite tener hasta 5 licencias gratuitamente. Para la versión *Community* se puede utilizar `docker pull portainer/portainer-ce`.

[Vover a HomeLab](https://docs.lynze.net/books/homelab "HomeLab") 🏘 # Cloudflare Tunnel

Más información: [Cloudflare Tunnel](https://www.cloudflare.com/es-es/products/tunnel/).

Cloudflare Tunnel es un servicio completamente gratuito y seguro que permite acceder a los servicios de nuestra red sin importar que estemos detrás de un CG-NAT, sin tener que abrir ningún puerto de nuestro router, instalar un proxy inverso como [Traefik](https://traefik.io/traefik/), [Caddy](https://caddyserver.com/), [NPM](https://nginxproxymanager.com/)... o montar una VPN, con el añadido de la generación automática de certificado [Let's Encrypt](https://letsencrypt.org/). Podemos incluso *securizar* más el acceso añadiendo credenciales para que sólo puedan acceder aquellos usuarios que estén validados. Se puede crear facilmente el Stack en [Portainer](https://docs.lynze.net/books/homelab/page/portainer "Portainer") con el siguiente YAML: ```yaml --- services: cloudflaretunnel: container_name: cloudflaretunnel image: cloudflare/cloudflared:latest restart: unless-stopped environment: - TUNNEL_TOKEN=$TUNNEL_TOKEN command: tunnel --no-autoupdate run ``` #### Variables - `TUNNEL_TOKEN`: corresponde al token que nos generará Cloudflare. [Vover a HomeLab](https://docs.lynze.net/books/homelab "HomeLab") 🏘 # Excalidraw

Código fuente: [https://github.com/excalidraw/excalidraw](https://github.com/excalidraw/excalidraw).

Cuando tienes que realizar diagramas esquemáticos, representaciones gráficas de tus ideas, fluxogramas (diagramas de flujo)... Excalidraw te ayuda a plasmar todas tus ideas o representaciones con facilidad. [![image.png](https://docs.lynze.net/uploads/images/gallery/2024-10/scaled-1680-/image.png)](https://docs.lynze.net/uploads/images/gallery/2024-10/image.png) Inicialmente las herramientas básicas son las típicas: cuadrados, círculos, líneas... Con todo esto puedes llegar a dibujar todo lo que necesitas, pero si no tienes tiempo, puedes explorar la biblioteca donde la gente ya se ha tomado la molestia de dibujar desde cualquier tipo de hardware a todo tipo de símbolos variopintos. Se puede crear fácilmente el Stack en [Portainer](https://docs.lynze.net/books/homelab/page/portainer "Portainer") con el siguiente YAML: ```yaml --- services: excalidraw: container_name: excalidraw image: excalidraw/excalidraw:latest restart: always ports: - 80:80 ``` [Volver a HomeLab](https://docs.lynze.net/books/homelab "HomeLab") 🏘 # MariaDB

Fuente: [MariaDB](https://mariadb.org) y [phpMyAdmin](https://www.phpmyadmin.net)

Uno de los elementos importantes de un entorno son las bases de datos (BBDD). Es donde se almacenan los datos necesarios para que las aplicaciones puedan guardar y gestionar persistentemente en el disco. Habitualmente, cuando creo un Docker de motor de BBDD, añado también un gestor gráfico o tipo web para agilizar la gestión de la misma. Así que en este caso he añadido [phpMyAdmin](https://www.phpmyadmin.net). También prefiero centralizarlo todo en un contenedor y que el resto se conecte a este, para así no duplicar las instalaciones de motores de BBDD y ser más conservador en los recursos de memoria, centralizar copias de seguridad... ```yaml --- services: mariadb: container_name: mariadb image: mariadb restart: always networks: - mariadbnet volumes: - ./mariadb:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: ${DATABASE_PWD} phpmyadmin: container_name: phpmyadmin image: phpmyadmin restart: always depends_on: - mariadb networks: - mariadbnet ports: - "80:80" environment: - PMA_HOST=mariadb networks: mariadbnet: external: true ``` #### Variables - `DATABASE_PWD`: Contraseña del usuario `root` de la BD. #### Notas - `image`: Al no indicar nada, siempre escogerá la etiqueta `latest`. - `networks`: Todos los contenedores que creemos a partir de ahora que necesiten conectarse a MariaDB, se han de añadir a la red `mariadbnet`. #### Copias de seguridad Hacer copias de seguridad es una obligación si no quieres perder tus datos. Con este script puedes hacer copias separadas por BD. ```bash #!/bin/bash # Eliminamos los archivos más antiguos de 20 días find -L ./mariadb_bck -mtime +20 -type f -delete # Realizamos copia de seguridad individual de cada BD docker exec mariadb mariadb -u root --password="ContraseñaMolonaDeroot" --batch --skip-column-names -e 'show databases;' | grep -E -v 'information_schema|performance_schema|mysql' | while read db; do docker exec mariadb mariadb-dump -u root --password="ContraseñaMolonaDeroot" --comments --dump-date --extended-insert --routines --system=user "$db" | gzip -c --best > "./mariadb_bck/$(date +%Y%m%d%H%M%S).$db.sql.gz"; done ``` Para ejecutarlo hay que recordar hacerlo ejecutable (`chmod u+x backup.sh`) y muy recomendable añadirlo a [`cron`](https://docs.lynze.net/books/linux/page/cron "cron") para que se haga periódicamente. # PostgreSQL

Fuente: [PostgreSQL](https://www.postgresql.org) y [pgAdmin](https://www.pgadmin.org)

Al igual que en [MariaDB](https://docs.lynze.net/books/homelab/page/mariadb "MariaDB"), uno de los elementos importantes de un entorno son las bases de datos (BBDD). Es donde se almacenan los datos necesarios para que las aplicaciones puedan guardar y gestionar persistentemente en el disco. Habitualmente, cuando creo un Docker de motor de BBDD, añado también un gestor gráfico o tipo web para agilizar la gestión de la misma. Así que en este caso he añadido [pgAdmin](https://www.pgadmin.org). También prefiero centralizarlo todo en un contenedor y que el resto se conecte a este, para así no duplicar las instalaciones de motores de BBDD y ser más conservador en los recursos de memoria, centralizar copias de seguridad... ```yaml --- services: postgres: container_name: postgresql image: postgres:15 restart: always environment: POSTGRES_PASSWORD: ${POSTGRESQL_PWD} volumes: - ./postgresql:/var/lib/postgresql/data networks: - postgresqlnet pgadmin: container_name: pgadmin image: dpage/pgadmin4 restart: always environment: PGADMIN_DEFAULT_EMAIL: ${PGADMIN_USR} PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_PWD} ports: - 8181:80 volumes: - ./pgadmin:/var/lib/pgadmin networks: - postgresqlnet depends_on: - postgres networks: postgresqlnet: external: true ``` #### Variables - `POSTGRESQL_PWD`: Contraseña del usuario administrador de PostgreSQL. - `PGADMIN_USR`: Usuario de pgAdmin. - `PGADMIN_PWD`: Contraseña del usuario pgAdmin. #### Notas - Importante: el directorio `./pgadmin` se le han de otorgar permisos para usuario y grupo `5050` (`sudo chown -R 5050:5050 ./pgadmin`), ya que de lo contrario el servicio `pgadmin` no arrancará el servicio web de inicio. - `image`: Escogeremos una versión concreta como la `15`, `16`, `17`... ya que si le ponemos `latest` (o nada), la imagen se actualizará en algún momento a la última versión y tendremos problemas para levantar las BBDD. Actualmente no hay retro/post/compatibilidad entre versiones. Si quieres pasar de una versión a otra la única opción es hacer una copia de seguridad en una versión y restaurarla en la otra. - En mi caso particular, tengo varias versiones en marcha, según las necesidades de cada aplicación. Pero procuro tener las menos posibles. - Otra opción es tener sólo una versión y centralizar todas las aplicaciones ahí y en algún momento, migrar todas las BBDD a otra versión de PostgreSQL, apuntar las aplicaciones al nuevo y eliminar el más antiguo. - `networks`: Todos los contenedores que creemos a partir de ahora que necesiten conectarse a MariaDB, se han de añadir a la red `postgresqlnet`. #### Copias de seguridad Hacer copias de seguridad es una obligación si no quieres perder tus datos. En este caso se hace una copia de seguridad de todas las BBDD y objetos. Tengo en mente hacer como en la copia de seguridad de [MariaDB](https://docs.lynze.net/books/homelab/page/mariadb#bkmrk-copias-de-seguridad) que se haga por separado, pero de momento es esto lo que tengo. ```bash #!/bin/bash # Eliminamos los archivos más antiguos de 20 días find -L ./postgresql_bck -mtime +20 -type f -delete # Hacemos copia de todas las BBDD y objetos docker exec postgresql /usr/bin/pg_dumpall -U postgres > ./postgresql_bck/postgresql_bck_$(date +%Y%m%d%H%M%S).sql ## # Para restaurar todas las BBDD: cat ./postgresql_bck/postgresql_bck_XXXXXXXXX.sql | docker exec -i postgresql psql -U postgres # Ojo con restaurarlo todo, ya que también afetaría a los esquemas de sistema y no es válido si es de una versión a otra. # La restauración habría que hacerla BD por BD si queremos pasar de una a otra versión. ## ``` Para ejecutarlo hay que recordar hacerlo ejecutable (`chmod u+x backup.sh`) y muy recomendable añadirlo a [`cron`](https://docs.lynze.net/books/linux/page/cron "cron") para que se haga periódicamente.