De adolescente, en Perú, tuve un servidor multimedia en casa. Plex, un disco duro y un montón de archivos de cuyo origen prefiero no hablar. Fui muy amigo de sitios de torrents de dudosa procedencia. No es mi setup más digno. Pero un presupuesto familiar peruano y una lista de precios extranjeros no dejaban muchas opciones, y a mi alrededor nadie lo pensaba dos veces. En Lima conseguías casi cualquier película en DVD en el mercado, a veces antes de que llegara al cine, por unos cuantos soles.
Después llegó Netflix. Un precio justo, casi todo en un solo lugar y en cualquier pantalla. Borré todo y pagué, feliz, durante años. Resulta que la mayoría no quería piratear. Quería un servicio decente a un precio que pudiera pagar.
Y después se fue malogrando, un correo a la vez
Esa fue la parte buena. Desde entonces:
- El precio no para de subir. Todos los servicios, más o menos cada año, con un correo muy amable sobre todo el valor que agregaron.
- El catálogo se partió. Cada estudio quiso su propia app, y lo que antes estaba en un lugar ahora está repartido en cinco suscripciones.
- Volvieron los anuncios. Primero en un plan más barato. Después en el plan que ya estaba pagando, salvo que pague un poco más para quitarlos.
- Las cosas desaparecen. Las series se van con un mes de aviso, o sin aviso. Algunas las borraron del servicio por completo, unas cuantas por el ahorro de impuestos.
- Compartir se volvió sospechoso. Mi cuenta ahora está muy interesada en saber a qué Wi-Fi me conecto.
El trato por el que me cambié ya no existe. Pago más, por menos, para ver anuncios. Ya hay una palabra para eso: enshittification. En español le dicen mierdificación, que no se queda atrás.
Así que volví a tener un servidor en casa. La diferencia es lo que tiene adentro: Blu-rays que compré, cosas que son gratis y los audiolibros que ya pagué en Audible. La misma idea que en ese entonces, pero del lado correcto de la ley.
El empujón vino de Brandon Hopkins y TechHut, un canal de YouTube sobre Linux, self-hosting y homelabs. Buena parte de mi stack empezó como algo que vi ahí, y el repo de homelab de TechHut es adonde volvía por los detalles. Míralo. Contenido muy interesante, y peligroso para tus fines de semana.
Fueron tres días, a ratos, desde una mini PC usada hasta una caja que hace streaming, encuentra los episodios nuevos, se vigila sola y saca sus propios backups. Claude Code escribía, por SSH desde mi Mac. Yo tomaba las decisiones y hacía todo lo que necesitaba manos, que resultó ser lo difícil.
La caja
Una Dell OptiPlex 7070 Micro usada, de Kleinanzeigen (el eBay alemán), por 130€: un i5-9500T, 8 GB de RAM y un SSD de 256 GB (bastante modesto aún). El anuncio decía 7060 con un i5-9500. No lo era. Misma gráfica y un ventilador más silencioso, así que lo dejé pasar. Los anuncios de PCs usadas mienten, pero a veces a tu favor.
La gráfica es lo importante. Quick Sync, de Intel, convierte el video al vuelo para la pantalla que lo pida, así que un smart TV viejo no tiene que entender todos los formatos. En esta caja pasa video 1080p de HEVC a H.264 a unos 200 cuadros por segundo, ocho veces más rápido de lo que alguien puede verlo. Lo que no puede decodificar es AV1, así que la biblioteca prefiere otros formatos y solo acepta AV1 cuando no hay nada más.
Este es el modelo, en la foto de marketing de Dell. El mío tiene menos lápices.
Casi todo el tiempo, se aburre:
Qué corre adentro
Proxmox abajo y dos contenedores encima:
- DNS. Pi-hole y Unbound, en un contenedor aparte. Los anuncios se bloquean en todos los dispositivos de la casa, y puedo romper la parte multimedia sin que nadie me pregunte por qué no hay internet.
- Todo lo demás. Un solo archivo de Docker Compose. Jellyfin para ver. Seerr para pedir cosas. Radarr, Sonarr, Prowlarr y Bazarr para encontrarlas, ordenarlas y conseguir subtítulos en inglés, español y alemán. qBittorrent para las descargas. BookOrbit para ebooks y audiolibros, con Libation trayendo mis compras de Audible de tres tiendas distintas. Caddy para HTTPS, y Beszel y Uptime Kuma vigilando todo.
Seerr es lo que va a ver mi familia: un catálogo donde pueden buscar y pedir algo, y yo me encargo del resto.
Quién entra
Cada app tiene su propio nombre, como media.hchome.stream, con un certificado de verdad. El registro DNS apunta a una dirección privada y el certificado sale por un challenge de DNS, así que no hay ni un puerto abierto en mi router. Desde internet, la caja no existe.
Fuera de casa está Tailscale. Pone mi celular, mi laptop y, pronto, los televisores de mi familia en una red privada propia, cifrada de punta a punta con WireGuard. Para entrar, cada dispositivo tiene que iniciar sesión, y una política de acceso decide quién llega a qué. (La política es un archivo en el repo, como todo lo demás.) Además funciona detrás del DS-Lite de mi proveedor, que no me da una IPv4 pública donde abrir un puerto aunque quisiera. Lo probé desde el celular con datos móviles y funcionó a la primera, cosa que nunca pasa.
Las descargas salen por NordVPN. En peer-to-peer, todos con los que te conectas ven tu dirección IP, y prefiero que vean la de NordVPN. Gluetun maneja el túnel, y qBittorrent no tiene red propia: usa la de Gluetun. Si el túnel se cae, qBittorrent se queda sin red, así que la dirección de mi casa no se escapa por accidente. El agente lo probó apagando el túnel y viendo morir todas las conexiones.
Cómo nos repartimos la chamba
- Un plan antes que el hardware. La primera sesión, antes de que llegara la caja, escribió
docs/PLAN.md: arquitectura, decisiones, red, almacenamiento y fases con checkboxes. Se actualizaba cada vez que la realidad no estaba de acuerdo, o sea, seguido. Entre sesiones, era la memoria compartida. - Scripts, no clics. Cada opción de cada interfaz web se volvió una llamada a la API dentro de un script que se puede volver a correr. Unos 45 commits en tres días, y el
git logsirve de diario de la instalación. Reconstruir la caja es correr los scripts. - Los secretos nunca pasaron por el chat. Las llaves de la VPN, los tokens y las contraseñas entraron por un script chiquito que los pide en el servidor y los escribe directo en su
.env. El agente nunca los vio. En algún momento le propuse subirlos al repo privado y ya. El agente me convenció de que no. Justo. - Lo irreversible pasaba por mí. Cambios en el router, configuraciones de cuentas, borrar archivos. Cada uno esperó un sí explícito.
- Romper cosas a propósito. El agente apagó la VPN, tumbó apps y esperó las alertas. Así apareció el primer bug real antes de que mordiera.
Arrancar una PC sin teclado
La PC llegó un día antes que el teclado. Esperar un día, por lo visto, no era opción.
El plan era arrancar el instalador de Proxmox desde un USB. El BIOS estaba en el modo de arranque más rápido, que se salta los dispositivos USB, así que el USB nunca aparecía. Windows puede pedirle a la PC que arranque en la configuración del BIOS, pero sin teclado conectado el BIOS también lo ignoraba. El inicio avanzado de Windows estaba deshabilitado, y encima en alemán.
Lo que funcionó fue la herramienta de BIOS de la propia Dell para Windows, Dell Command | Configure. Antes pedía un runtime de Visual C++ que faltaba, cómo no. Después, una línea:
cctk --Fastboot=ThoroughTras reiniciar, Windows ofreció arrancar desde el USB. El agente ya había armado un instalador con un archivo de respuestas, así que Proxmox se instaló solo, sin tocar una tecla. (Ese USB borra cualquier PC que arranque desde él. Ya tiene etiqueta.)
El teclado llegó al día siguiente. Lo usé para cambiar tres opciones del BIOS, confirmé que la caja arranca sin él y lo volví a desconectar.
Que corra no significa que funcione
Al final del primer día, todo estaba levantado. El segundo día fue para descubrir qué significa “levantado”.
- Descargas que nunca empezaban. Después de un reinicio, qBittorrent arrancó un segundo antes que el túnel de la VPN. Estaba corriendo, con cero peers y sin ningún error. La solución es un contenedor watchdog chiquito: cada cinco minutos revisa si qBittorrent es más antiguo que el túnel y si ve algún peer, lo reinicia si no, y me manda un mensaje al celular por ntfy. Lo probé reiniciando la VPN a propósito. Se recuperó en menos de cinco minutos.
- Una miniserie de 51 GB. Los perfiles de calidad por defecto asumen que tienes un NAS enorme. Yo tengo 141 GB. Ahora prefieren x265, que pesa más o menos la mitad, ponen un tope de tamaño por minuto (unos 1.6 GB por episodio y 6 GB por película) y se saltan los remux. La misma miniserie ahora ocupa 6.5 GB.
- “Temperatura sobre 85 °C.” No era el CPU, que llegó a 58 °C como máximo. Era el controlador del SSD, que siempre corre caliente cuando escribe mucho. El disco en sí estaba bien. Ese sensor ya no manda alertas.
- Audiolibros. 53, unas 1270 horas y un cuarto del disco. Revisé la lista ordenada por tamaño y me quedé con siete. El disco pasó de estar al límite a tener 74 GB libres.
Uptime Kuma revisa cada una de las 14 apps y me manda un mensaje al celular cuando una se cae y otro cuando vuelve. El 95.15 % de FlareSolverr es la prueba en la que la apagué a propósito.
Y así se ve en mi celular: el susto de los 85 °C del controlador del SSD, y FlareSolverr cayéndose y volviendo durante la prueba.
Y BookOrbit, después de la poda. Los siete sobrevivientes, más Orgullo y prejuicio para probar los ebooks:
Los backups cubren los contenedores, no el contenido: apps, configuración y bases de datos, todas las noches a las tres de la mañana, guardando los últimos cuatro. Unos 6 GB por noche. Las películas las puedo volver a conseguir. Mi historial de lo que vi, no.
El primer backup falló. Los contenedores corren sin privilegios, así que no podían escribir en la carpeta de backups, que está bien cerrada, y la solución fue una línea para que Proxmox prepare el backup en /var/tmp. El siguiente pasó:
Lo que falta
- Un router nuevo. El router de mi proveedor reparte su propio DNS por IPv6, así que media casa se salta Pi-hole sin que nadie se entere. Ya viene en camino una FRITZ!Box reacondicionada. El agente lo descubrió leyendo la página de administración del router desde Chrome. El que la va a tener que conectar soy yo.
- Un SSD más grande. Usado, de 2 TB y PCIe 3.0, porque la ranura no da para más y no pienso pagar por una velocidad que no va a usar.
- Llevarlo a la familia. Tres personas a diez minutos que, en sus propias palabras, son “no tan tech”. Un TV box con Tailscale y Jellyfin, y una guía de una página.
- Un chequeo desde afuera. Todo lo que vigila la caja corre en la caja. Si se muere, se muere calladita.
Con qué me quedo
Tres días es rápido para algo de este tamaño, y es gracias al agente. Escribió cada configuración, cada script y cada commit, y probó cosas que yo habría dado por hechas. Las decisiones siguieron siendo mías: qué va en la caja, qué se borra y cuándo se toca el router. También el USB, el BIOS y el teclado que no tenía.
De adolescente tenía un servidor multimedia porque no podía pagar. Ahora tengo uno porque pagar dejó de alcanzar. Los servicios de streaming siguen teniendo catálogos más grandes. El mío no tiene anuncios ni correos de subida de precio, y tiene un soporte que responde al toque. Soy yo.