Exponer un home server con SSH y Caddy

Exponer un home server con SSH y Caddy

Omar Cruz
5 de julio de 2025
3 min read

Ver publicación original ↗

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 🧵

Ver publicación original ↗

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

Ver publicación original ↗

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

Ver publicación original ↗

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.

Ver publicación original ↗

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.

Ver publicación original ↗

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)

Ver publicación original ↗

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? 🤔

Imagen de la publicación original

Ver publicación original ↗

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

Imagen de la publicación original

Ver publicación original ↗

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

Imagen de la publicación original

Ver publicación original ↗

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):

Imagen de la publicación original

Ver publicación original ↗

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

Imagen de la publicación original

Ver publicación original ↗

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.

Ver publicación original ↗

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).

Ver publicación original ↗

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
}

Imagen de la publicación original

Ver publicación original ↗

Y ya está. Inicia Caddy (sudo caddy start) y se encargará de todo.

Ver publicación original ↗

¡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.