Intro
Esta es la historia de como tener tu propio server de apps web,
de la manera más barata, sencilla y funcional.
Supongamos que por el motivo que fuera uno tiene algunas apps que
quiere usar. En mi caso, digamos que son dos:
Gitea: algo como tu propio GitHub. ¿Por qué?
Porque está bien ser dueño de tus propios datos, me parece. Entonces
quiero tener la POSIBILIDAD de tener mi propio server. También
permite clonar el repo a GitHub así que no perdés nada.
Mi sitio: Porque, de nuevo, lo que yo escribo
es mío, y por qué no lo voy a tener yo en vez de ponerlo en Medium
o algún otro sitio maligno. Aparte, lo tengo hace más de 20 años,
no voy a parar ahora.
Pero podría ser cualquier cosa! Una app que estás haciendo, algo que querés probar, OwnCloud o lo que se te cante,
si sos el tipo de nerd que quiere tener su propia app/sitio ... se puede.
Así que vamos a construir, desde cero, todo lo necesario para poder
acceder a esos sitios/apps.
Level 1: self hosting
Si querés tener tus propias apps, entonces vas a necesitar hardware
en el cual ejecutarlas. Cuál es la computadora de uso general más barata
a la cual se puede acceder que tiene algún tipo de red?
Una Raspberry Pi Zero W ... sale 10 dólares, si se pudiese conseguir, claro. Pero bueno, yo tengo una. O seis. la que voy a usar se llama pinky.
Si no tenés, o no querés una de esas, podés usar cualquier cosa que tenga Linux. O Windows. O MacOS, pero yo lo hice con Linux, así que
mejor si usás Linux por ahora. Puede ser literalmente cualquier compu
no hay compu muy lenta para esto.
O sí, dependiendo de lo que quieras poner ahí, pero probablemente
cualquier compu sirva.
No voy a entrar en detalles, pero instalá lo que sea que querés hacer
andar, y hacelo andar. En mi caso la definición de "anda" es:
Así que buscá las instrucciones para lo que querés y hacélo andar, che.
Si podés acceder y usarlo desde la misma red en la que está tu server? Listo. Level UP.
Level 2: remote access
¿Pero que pasa si querés acceder a ese sitio y no estás en la misma red?
Bueno, no anda. Obvio que http://pinky.local:3000 solo anda en la red local así que vamos a solucionarlo.
Hay varias maneras, pero voy a mostrar la que quiero mostrar: tailscale, en particular, la versión gratis, para una persona.
¿Qué es tailscale? Es una VPN.
En particular, es una VPN "personal". Si te registrás y lo instalás en un par de máquinas crea una red que conecta ambas máquinas entre sí, aunque esas máquinas no estén en la misma red física.
Así que si uno instala tailscale en el server (en mi caso sería pinky) y en la máquina que uso todo el tiempo (en mi caso salma) ... entonces
esas máquinas siempre pueden verse usando nombres especiales que te da tailscale.
Si hago click en una de las máquinas me da información sobre ella.
Y ahí podemos ver que pinky también tiene otro nombre, que le da
tailscale: pinky.ralsina.github.beta.tailscale.net
No intenten accederla porque no funciona a menos que ustedes estén en mi VPN y no lo están ni lo van a estar :-)
¡Pero yo sí!
Tal vez esto sea suficiente. En este momento podés acceder a tus servers
desde cualquier lado mientras tengas conexión a la VPN de tailscale. Nice!
Pero ... y si quiero que acceda más gente? Entonces LEVEL UP.
Level 3: Ingress Rules
Nuevamente hay varias maneras de darle a terceros acceso a tu server.
Pero yo te voy a mostrar una que me gusta a mí: fly.io
Fly.io es una empresa que te da la posibilidad de ejecutar "cosas" en
máquinas virtuales "gratis" dentro de ciertos límites. En particular,
no más de 160GB al mes, después te cobran.
Así que ... imaginemos que una de esas VMs estuviera conectada a nuestra
VPN de tailscale.
Y que está ejecutando un proxy inverso de manera que cualquiera puede conectarse a esa máquina
virtual que haría de intermediario y expondría nuestro server para que
se pueda acceder desde afuera? Eh?
Bueno. Acá está la documentación necesaria para conectar una VM de fly.io a nuestra VPN.
Y acá está mi versión, que instala un Nginx
Modificá el nginx.conf para que mande las cosas adonde vos querés que vayan.
Por ahora no sería posible usar dos hostnames distintos (después vemos)
y el server_name
debería ser el hostname público que te da fly.io, por ejemplo en mi caso eso era
white-wave-7409.fly.dev
Una vez hecho eso deberías poder acceder a uno de tus servicios usando ese hostname:
Nótese que está conectado via HTTPS, porque fly.io en realidad tiene
un proxy "mas afuera" que hace la terminación HTTPS, así que no necesitamos crear certificados ni nada.
Y con eso tenemos un sitio web, accesible desde cualquier dispositivo
conectado a Internet, y es gratis por los primeros 160GB! Misión cumplida!
Pero que pasa si queremos una URL más bonita? Por ejemplo, yo quiero que
Gitea esté en git.ralsina.me y mi sitio en home.ralsina.me ...
Bueno, si querés eso, LEVEL UP.
Level 4: Custom DNS
Como siempre, hay muchas maneras de resolverlo. Pero esta es la que yo uso. Cloudflare da DNS gratis. Si tenés
un dominio, lo configurás para que use cloudflare de DNS y listo.
Si no tenés un dominio, comprá o conseguí uno, que se yo.
Una vez que lo tenés, y lo configuraste en Cloudflare o en el server de DNS que más te guste ... configurá todos los CNAME que quieras.
Yo en particular hice dos:
Tanto git.ralsina.me como home.ralsina.me apuntan al nombre que me dió
fly.io (white-wave-7409.fly.dev), así que ahora "resuelven" así:
> host git.ralsina.me
git.ralsina.me is an alias for white-wave-7409.fly.dev.
white-wave-7409.fly.dev has address 37.16.0.181
white-wave-7409.fly.dev has IPv6 address 2a09:8280:1::6:3716
Si usás cloudflare, tienen que estar como "DNS Only"
El siguiente paso es informar a fly.io que vamos a manejar esos nombres a través nuestra app con estos comandos (cambiar como corresponda) en la máquina donde manejamos nuestra app de fly.io
> flyctl certs create git.ralsina.me
> flyctl certs create home.ralsina.me
Cambiamos nuevamente la configuración de nginx para que envíe cada servicio donde corresponda en base al server name y ya está. Con esto tenemos todo funcionando.
¿Qué logramos?
- Servers accesibles desde cualquier lado: Gitea y Mi sitio
- Servicios corriendo en la compu más barata del mundo
- Con URLs lindas
- Gratis
- Sin configurar/agujerear firewalls
Creo que nadie tiene publicada una guía para lograr todo esto, ojalá le sirva a alguien.