Quien no conoce Selfhostear, a cualquier proveedor Cloud le reza

Una relato, un poco técnico, de como moví todos mis servicios fuera de la nube y las ventajas que trae, lo bien que me lo he pasado y lo mucho que he aprendido

Quien no conoce Selfhostear, a cualquier proveedor Cloud le reza
💀

TL;DR
Migro todos mis servicios, con algunas complicaciones, de una VPS de Ionos a dos ordenadores en mi casa: GLaDOS, un antiguo portatil, y Gonk, una torre de segunda mano. Explico los pasos que he seguido y  la intención principal, que es divertirme, aprender, controlar mis datos y tener donde hostear mi media stack y un server de Minecraft.

Hace cosa de un mes me harté un poco de los 25 € que le pagaba a Ionos, que es la empresa con la que tenía contratada mi VPS. En ella tenía todo; tenía mi servidor de mail, mi Nextcloud, todas mis páginas webs, mi bot de Discord, un panel para manejar y desplegar servidores de Juegos llamado Pufferpanel y alguna otra utilidad del tipo.

¿Cuáles son mis motivaciones?

Las dos principales son el dinero, el rendimiento y algunas limitaciones de los servicios VPS.

En cuanto al dinero, sí es verdad que Ionos es uno de los mejores proveedores calidad-precio que conozco. Pero 25 € todos los meses jodían un poco. Además de eso, el servicio no tenía un rendimiento increíble, las VPS suelen estar pensadas para tener poca potencia en muchos núcleos porque "normalmente" el tipo de cosas que hosteas en un servidor sacan provecho del multithreading. Sin embargo, junto a lo que mencione en la introducción, yo tenía planeado hostear 2 cosas más:

Un servidor de Minecraft muy moddeado (+200 mods) que requería mucha potencia mononucleo, que no es fácil o barato conseguir en servicios cloud.

Y un Media Stack o Media Server, que básicamente es un conjunto de servicios que te permiten tener accesible, desde internet o tu red local, una biblioteca de películas, series y prácticamente cualquier medio digital que se autoadministra según tus necesidades

GitHub - navilg/media-stack: A stack of self-hosted tools to manage and stream media. Sonarr + Radarr + qBitTorrent + Prowlarr + Jellyfin + Jellyseerr + VPN
A stack of self-hosted tools to manage and stream media. Sonarr + Radarr + qBitTorrent + Prowlarr + Jellyfin + Jellyseerr + VPN - navilg/media-stack

¿Qué significa esto? Pues que si por ejemplo quiero ver una peli, puedo simplemente meterla en mi watchlist y mi media server, de forma totalmente automática, se la descargará en mi servidor a través de un cliente Torrent (de un medio totalmente legal y por el que definitivamente he pagado ¿Quién te crees que soy? ¿Una pirata?) la película en la máxima calidad posible y con mis preferencias de idioma y subtitulación. Lo mismo con una serie. Y según vaya consumiendo este contenido, si lo configuro, puede ir eliminando el contenido antiguo para poder seguir creciendo. A efectos prácticos, esto significa tener en mi servidor mi propio Netflix, Prime Video, Hulu, HBO, Disney+, Sky y todas las 100 plataformas de series y películas que sangran mi cartera con sus subscripciones todos los meses.

El problema es que para hostear esto necesito una tarjeta gráfica para el trabajo de "Transcoding" que requiere emitir video por internet. Y esto en un servicio Cloud es absurdamente caro de conseguir.

Otras de mis motivaciones eran tener más control sobre mis servicios y mis datos, poder acceder mucho más rápido desde mi red local a mis servicios, darle uso a hardware viejo que tenía por ahí y sobre todo lo mucho que mola tener un home lab en tu puta casa. No os voy a engañar, soy una gooner por esta mierda.

Ojalá esto fuera real

Mis planes iniciales y qué esperaba conseguir

Lo primero necesitaba 2 cosas muy importantes: planificar la migración de todas mis cosas y conseguir hardware donde hostearlas.

Empecemos con el hardware. En casa ya tenía un portátil Asus por ahí que llevaba apagado años, que era más que suficiente para todos mis servicios, menos el servidor de Minecraft y el Media Stack. Para eso necesitaba comprar hardware, así que rebusqué durante varias semanas en Wallapop (no se lo recomiendo a nadie), y acabé encontrando a mi nuevo homeserver, un pc "Gamer" con un Ryzen 5 2300, 16 GB de RAM y un disco duro SSD y otro HHD. Y lo más importante, un 1650, la gráfica que necesitaba para mis malévolos planes. Con esto ya tenía el hardware listo.

La migración 💀

Esta es la parte difícil. Elegí un día, y me hice una lista de todo lo que necesitaba:

  1. Migrar todos mis servicios a las nuevas máquinas sin perder datos
  2. Preparar la zona DNS de mis dominios para que usando un servicio DDNS los dominios apuntaran a la IP dinámica de mi casa
  3. Preparar mi router para la migración, abrir los puertos necesarios y procurar que sea lo más seguro posible
  4. Preparar mis nuevas máquinas con Linux y Docker para que puedan correr los servicios
  5. Cambiar de reverse proxy de Nginx a Traefik para tener SSL manejado automáticamente y controlar de forma más sencilla la redirección de peticiones web a mis servicios en Docker
  6. Ver como podía hacer funcionar mi servidor de mail
  7. Relajarme porque todo esto es muy estresante.
Yo literalmente

Migrar todos mis servicios a las nuevas máquinas sin perder datos.

Todos mis servicios estaban en contenedores Docker a única excepción de mi servidor de mail, que lo manejaba Plesk. Esto facilitaba la migración, solo tenía que copiar todos los directorios que contenían mis proyectos con sus respectivos archivos de Docker a la nueva máquina. Esto lo hice con el comando sftp después de comprimir todo lo que quería migrar. Y después hice un truco, un poco sucio que no recomendaría hacer, pero que me facilito muchísimo la migración, básicamente copie el directorio de Docker en

/var/lib/docker

para mover de forma sencilla todos los volúmenes no bindeados a la nueva máquina.

Preparar la zona DNS de mis dominios para que usando un servicio DDNS los dominios apuntaran a la IP dinámica de mi casa

Los routers domésticos de los típicos proveedores de internet o te tienen detrás de una CGNAT, lo cual te jode muchísimo la vida si quieres hostear cosas (afortunadamente no era mi caso), o no te ofrecen una IP estática. Esto significa que tienes que ingeniarte para hacer que los dominios que quieres que apunten a tus servicios se actualicen frecuentemente, para apuntar a la IP de tu router si cambia. Por suerte para mí, tengo mis dominios en Cloudflare, que tiene una API, lo cual me permitía actualizar los dominios automáticamente. Podría haberme hecho yo un script, pero afortunadamente alguien ya lo había hecho por mí

GitHub - timothymiller/cloudflare-ddns: 🎉🌩️ Dynamic DNS (DDNS) service based on Cloudflare! Access your home network remotely via a custom domain name without a static IP!
🎉🌩️ Dynamic DNS (DDNS) service based on Cloudflare! Access your home network remotely via a custom domain name without a static IP! - timothymiller/cloudflare-ddns

Metí este script en un cronjob para que se ejecutara cada 15 m y listo.

Preparar mi router para la migración, abrir los puertos necesarios y procurar que sea lo más seguro posible

Esto es sencillo, simplemente tenía que entrar en mi router, abrir los puertos 80 y 443 (los puertos estándar de HTTP y HTTPS) y redirigirlos a la IP local de mi máquina de entrada. Podría haber configurado que mi servidor de entrada fuese una DMZ para no tener que preocuparme de la redirección de puertos, pero eso significaría también que tendría que segurizar muy bien mi servidor, y no voy a mentir, soy una perezosa.

Preparar mis nuevas máquinas con Linux y Docker para que puedan correr los servicios

Otro paso fácil, instalar Ubuntu Server (sí, no será la mejor distro de server, pero es fácil), zsh y oh-my-zsh con mis configuraciones, importar en ambas máquinas el autorized_keys de mi antiguo servidor para poder acceder usando mis claves SSH y desactivar el login del usuario root y con contraseña. Ahora solo quedaba instalar Docker, lo cual es superfácil gracias a su script de instalación.  

curl -fsSL https://get.docker.com -o install-docker.sh
sudo sh install-docker.sh
sudo usermod -aG docker $USER

También instalé algunas herramientas de utilidad como btop, Lazydocker y Brew.

Mi máquina de entrada se llama GLaDOS y mi servidor con gráfica Gonk.

Mi pequeño "rack" con mis amados Gonk y GLaDOS (son novias)

Cambiar de reverse proxy de Nginx a Traefik para tener SSL manejado automáticamente y controlar de forma más sencilla la redirección de peticiones web a mis servicios en Docker

Uno de los motivos por los que elegí Traefik es que la mascota de GO es monísima

Traefik es un reverse proxy diseñado especialmente para Docker: toda su configuración se hace mediante flags que incluyes en los archivos docker-compose.yml. Así que cree un docker-compose para Traefik, que contenía sus configuraciones básicas para el manejo de certificados, y una network para después importarla en mis otros archivos docker-compose; y que de esa forma Traefik pudiera hacer llegar a todos los contenedores la peticiones.

services:
  traefik:
    image: "traefik:v3.1"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.network=traefic_proxy"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      - "--certificatesresolvers.myresolver.acme.email=nerea@nereacassian.com"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      - "--serverstransport.insecureskipverify=true"
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./letsencrypt:/letsencrypt"
    networks:
      - "proxy"
networks:
  proxy:
La configuración de Traefik
services:
  yuweb:
    container_name: yuweb
    image: yuweb
    build: .
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.yuweb.rule=Host(`yellowumbrella.dev`)"
      - "traefik.http.routers.yuweb.entrypoints=websecure"
      - "traefik.http.routers.yuweb.tls.certresolver=myresolver"
    networks:
      - proxy
networks:
  proxy:
    external:
      name: "traefic_proxy"
Un ejemplo de un servicio habilitado para Traefik

Ver como podía hacer funcionara mi servidor de mail

En esto Cloudflare me volvió a salvar la vida. Antes tenía mi mail hosteado en mi VPS usando Plesk para gestionarlo. Lo que más me importaba a la hora de migrar este servicio era poder recibir mails enviados a cualquier dirección de mis dominios y hacer que estos mails se redireccionaran a mis bandejas principales. Esto era importante porque yo suelo registrarme en páginas web usando mails distintos para cada una, por ejemplo si me registrara en nana.city el mail que usaría es nana@nereacassian.com.

El problema es tener servidores de mail en IP dinámica, ya que esto puede causar problemas en la entrega de correos. Por suerte Cloudflare de forma gratuita ofrece exactamente este servicio y es superfácil de configurar.

Email Routing | Easily create addresses and route emails
With Cloudflare Email Routing, simplify the way you create and manage custom email addresses for your domain, without needing to keep an eye on additional mailboxes.

Relajarme porque todo esto es muy estresante

Pues me estoy leyendo un montón de mangas yuri últimamente, I love women so much

Beauty and the Beast Girl

¿Vale la pena? Y algunas conclusiones

A ver, tiene sus desventajas. Sin ir más lejos, en un servidor cloud tienes mucha más disponibilidad que un ordenador en tu casa. Pero las ventajas son abrumadoras también: upgradear tu hardware es mucho más fácil, tienes control sobre tus datos, aprendes muchas cosas sobre Linux y el self hosting, y a la larga es mucho más barato que un servicio VPS, por ejemplo. Puedes acceder a tus servicios incluso sin internet en tu red local y es absurdamente divertido, me lo he pasado genial, incluso haciendo la migración, que ha sido estresante en muchos puntos, pero man... Se siente como un superpoder tener ahí al lado tuyo un servidor donde puedes hacer lo que te dé la gana, supongo que tengo "ese tipo de autismo"

En fin, como siempre espero que hayáis disfrutado del artículo y nos vemos en la red <3