-
Tú
Lo que estás leyendo ahora.
-
Cloudflare
Delante del dominio: oculta la IP de casa y filtra.
-
Traefik
La puerta pública. Es lo único que puede hablar con el contenedor de la web.
-
Mi móvil
Donde me llegan los mensajes del formulario.
-
Repositorio en mi Forgejo
El origen del código, en casa. El código es público en GitHub, pero esa copia solo recibe lo que ya está desplegado y ha pasado el control de fugas.
-
Integración y despliegue continuos
En cada push, en un runner sin secretos: formato, clippy sin avisos, todas las pruebas contra un PostgreSQL de verdad y gitleaks. En verde, otro runner lo despliega.
- Forgejo · Actions
- GitLab CI · GitHub Actions
-
Mi servidor de Matrix
La sala donde llegan los avisos de mensajes nuevos, con un bot propio que solo puede escribir ahí.
-
Servidor Axum
Recibe la petición, busca la página ya renderizada y responde. Si el navegador ya la tiene, responde 304 sin cuerpo.
-
Páginas pre-renderizadas
Plantillas compiladas que se rellenan una vez al arrancar, en los dos idiomas, cada una con su ETag.
-
Cabeceras de seguridad
CSP estricta sin nada en línea, HSTS y el resto. Por eso el JavaScript solo mejora la página: todo funciona sin él.
-
Contenido en TOML
Textos, proyectos, piezas del laboratorio y estas unidades viven en ficheros TOML que se validan al arrancar. Una clave que falte en un idioma impide desplegar.
-
Formulario de contacto
Valida los campos, tiene un campo trampa para bots, trampas para reconocer a una IA y un captcha opcional.
-
Límites de envío
Por IP y globales, calculados con una sola consulta indexada. La IP nunca se guarda: solo un hash con una sal secreta.
-
Bandeja de salida
El mensaje se guarda primero y el aviso queda pendiente. Un trabajo lo reintenta hasta que Matrix confirma con un identificador de evento.
-
Aviso a Matrix
Envía el aviso a la sala con el bot propio de la web. Varios trabajadores no se pisan: cada uno coge una fila distinta.
-
PostgreSQL
Guarda los mensajes y los avisos pendientes. Las consultas se comprueban contra el esquema al compilar.
-
Sin red
PostgreSQL no escucha en ninguna interfaz: solo por el socket local y autenticación del sistema, sin contraseña que robar.
-
Estado del homelab
Cada 5 minutos el hipervisor deja un resumen: servicios en marcha, disponibilidad y el LED de cada pieza del mapa. Solo agregados.
-
Tu navegador
Guarda tus logros, la zona por la que ibas y si quieres sonido. Nada de eso sale de tu navegador.
-
Terraform
Crea el contenedor con sus recursos, su red y su cortafuegos: el único con política de entrada «rechazar».
-
Ansible
Instala PostgreSQL, el binario y su servicio, con los secretos cifrados en el vault.
-
Comprobación antes de reiniciar
El rol ejecuta «landing check» con el binario nuevo: si el contenido no es válido, no se reinicia nada.
-
Servicio endurecido
Sistema de ficheros de solo lectura, sin capacidades, filtro de llamadas al sistema, memoria limitada. Tras reiniciar, espera a que /healthz diga «ok».