Ayer les contaba que pude exponer un servicio de mi home server a internet, y algunos (absolutamente nadie) me estuvieron preguntando cómo hacerlo, especialmente sin usar ngrok o cloudflare tunnel.
La realidad es que fue muy sencillo 🧵
Primero que nada, les cuento que este servicio es @jellyfin , es como un "netflix" self hosted, ahí tengo un montón de anime viejito que quería compartir con mi familia y amigos, por lo que usar un servicio como cloudflare tunnel haría que me bannearan por streaming de contenido
Ahora sí, lo interesante, los requisitos primero:
- Home server con linux, preferiblemente
- VPS (puede ser un droplet de $5 USD en digitalocean o hetzner o donde quieran)
- Conexiones por SSH entre tu computadora y el VPS | tu home server y el VPS
Lo publicado aquí será con Ubuntu, pero realmente puede ser fácilmente adaptado a cualquier distro de linux.
Y no me enfocaré en cosas de seguridad como firewalls y esas cosas, que cualquier VPS sirviendo cosas debería contar como canasta básica.
El truco se divide en dos partes súper lógicas:
Un Túnel Mágico ✨: Desde tu home server, crearemos un reverse tunnel SSH hacia el VPS. Esto expone el puerto de Jellyfin de forma segura, pero solo dentro del VPS.
Un Portero Inteligente 👮♂️: En el VPS, usaremos Caddy como proxy reverso. Él recibirá el tráfico de internet y lo dirigirá hacia nuestro túnel.
El flujo se ve así: Internet ➡️ VPS (Caddy) ➡️ Túnel SSH ➡️ Home Server (Jellyfin)
El Tunnel SSH (Desde tu Home Server)
Este comando le dice a tu VPS: "Oye, cualquier cosa que llegue a tu puerto 8097, mándamela a mi puerto 8096 (el de Jellyfin)".
Ejecuta esto en tu HS: $ ssh -R 8097:localhost:8096 usuario@ip_de_tu_vps
Pero, ¿qué pasa si se cae la conexión? 🤔

Para que el túnel sea robusto y se reconecte solo, usamos autossh. Es una maravilla.
Primero, lo instalamos en el home server:
$ sudo apt update && sudo apt install autossh

Y ahora, el comando es casi el mismo, pero eterno:
$ autossh -M 0 -N -R 8097:localhost:8096 usuario@ip_de_tu_vps

Y para que sea una solución de verdad y sobreviva reinicios de tu home server, lo convertimos en un servicio de systemd.
Crea el archivo /etc/systemd/system/jellyfin-tunnel.service con este contenido (cambia el User y el comando ExecStart):

Luego: $ sudo systemctl enable --now jellyfin-tunnel.service 🚀

Parte 2: El Proxy Reverso con Caddy (En tu VPS)
Ya tenemos el puerto de Jellyfin "disponible" en el localhost:8097 de nuestro VPS. Ahora hay que exponerlo al mundo con un dominio y SSL.
Aquí es donde @caddyserver brilla. HTTPS automático, configuración mínima. Una joya.
Instálalo en tu VPS (sigue los pasos para tu distro en https://caddyserver.com/docs/install).
La configuración de Caddy es famosa por ser ridículamente simple.
Crea un archivo en tu VPS llamado Caddyfile con solo esto (¡cambia el dominio!):
http://jellyfin.tudominio.com {
reverse_proxy localhost:8097
}

Y ya está. Inicia Caddy (sudo caddy start) y se encargará de todo.
¡Y listo! 🎉
Caddy ahora escucha en https://jellyfin.tudominio.com (con candadito y todo 🔒), y cuando llega una visita, se la pasa al puerto 8097, donde el túnel de autossh la está esperando para llevársela de forma segura hasta tu home server.