Despliegue autoalojado en Azure

Contexto y motivación

Podía subir esta web a Vercel y olvidarme, pero un administrador de sistemas que externaliza su propio servidor no dice mucho de sí mismo. Así que la serví desde una VM de Azure que administro yo, y el despliegue acabó siendo un proyecto más del portfolio.

Detrás del dominio hay una máquina AlmaLinux con Nginx sirviendo el export estático de Next, HTTPS de Let's Encrypt que se renueva solo y Cloudflare de proxy por delante. El resto, DNS, firewall, SELinux, accesos, lo configuré pieza a pieza, así que cuando algo falla sé dónde mirar.

Hubo pegas por el camino. La cuenta nueva tenía restringida la familia de VMs baratas en casi todas las regiones, lo diagnostiqué con `az vm list-skus` y acabé en Spain Central por eso. Y con 1 GB de RAM las instalaciones morían por falta de memoria, así que añadí 2 GB de swap.

Tecnologías

SELinuxfirewalldfail2ban

Características principales

  • VM AlmaLinux 9 (familia RHEL) aprovisionada en Azure dentro de la capa gratuita
  • Acceso solo por SSH con clave y el puerto 22 restringido a una única IP, con fail2ban y firewalld como segunda capa
  • Nginx sirviendo el export estático de Next, con SELinux en enforcing y los contextos ajustados
  • Dominio propio con el DNS delegado en Cloudflare, la web tras el proxy y el correo en DNS only
  • HTTPS con Let's Encrypt y renovación automática, verificada a través del proxy
  • SSL Full (strict), HTTP/3 y el origen oculto, la VM solo acepta tráfico web que venga de Cloudflare
  • Presupuesto y alerta de gasto en Azure, lo único que pago de verdad es la IP pública

Galería

Conclusión

El resultado es una web en producción sobre una máquina que controlo entera. El SSH solo admite mi IP, el origen no responde a nadie que no sea Cloudflare y la factura ronda los 4 euros al mes.

Si mañana hace falta más máquina, es cambiar el tamaño de la VM en el portal. De momento, para el tráfico de un portfolio, el free tier va sobrado.