Arquitectura
Visión general
navarro-bores.com es un sitio estático: VitePress compila Markdown + Vue a HTML/CSS/JS en tiempo de build, y nginx sirve esos estáticos desde un contenedor en Cloud Run. No hay backend ni base de datos en ejecución (Dockerfile:1-20, nginx.conf:1-34).
Diagrama C4 (Container)
mermaid
flowchart TB
visitante([Visitante<br/>navegador])
subgraph cloudrun["Cloud Run · europe-west1 (.github/workflows/deploy.yml:11)"]
nginx["nginx:alpine<br/>sirve estáticos, /healthz<br/>puerto 8080<br/>(Dockerfile:14-20, nginx.conf)"]
dist["Estáticos VitePress<br/>/usr/share/nginx/html<br/>(Dockerfile:17)"]
nginx --- dist
end
subgraph build["Build time (no en runtime)"]
vp["VitePress 1.6.4 + Vue 3<br/>vitepress build<br/>(package.json:8-14)"]
content["Contenido Markdown<br/>es/ + en/ + index.md"]
cfg["config.mts<br/>locales, SEO, sitemap"]
content --> vp
cfg --> vp
vp --> dist
end
fonts([Google Fonts<br/>fonts.googleapis.com])
dns([Google Cloud DNS])
visitante -->|HTTPS www.navarro-bores.com| nginx
visitante -. carga tipografías .-> fonts
visitante -. resuelve dominio .-> dnsMapa módulo → responsabilidad → ruta
| Módulo | Responsabilidad | Ruta |
|---|---|---|
| Configuración VitePress | Locales ES/EN, nav, sidebar, SEO, sitemap, hreflang, JSON-LD, búsqueda | .vitepress/config.mts |
| Tema | Extiende el tema por defecto y carga CSS propia | .vitepress/theme/index.ts:1-6, .vitepress/theme/custom.css |
| Raíz redirectora | Redirige / a /es/ o /en/ según idioma del navegador | index.md:6-15 |
| Contenido ES | Páginas y blog en español | es/ (about, blog/, contact, index, projects) |
| Contenido EN | Páginas y blog en inglés (paridad) | en/ (about, blog/, contact, index, projects) |
| Estáticos públicos | favicon e imagen OpenGraph servidos tal cual | public/favicon.svg, public/og-cover.png |
| Imagen de producción | Build multistage Node → nginx | Dockerfile:1-20 |
| Servidor web | Clean URLs, cabeceras, health, gzip, caché | nginx.conf:1-34 |
| Despliegue (def.) | Pipeline build + push + Cloud Run (no automatizado) | .github/workflows/deploy.yml |
| Operación local | Recordatorio de expiración de dominio | scripts/domain-reminder.sh, scripts/com.navarro-bores.domain-reminder.plist |
Decisiones de arquitectura relevantes
- Estático sobre Cloud Run: contenedor nginx mínimo (256Mi, escala a cero,
.github/workflows/deploy.yml:47-49), sin estado. - Bilingüe por locales nativos de VitePress en lugar de dos sitios separados (
.vitepress/config.mts:90-171). - Redirección de idioma en cliente (JS en
index.md), no en servidor, para mantener el sitio 100% estático.