Skip to content

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

Mapa módulo → responsabilidad → ruta

MóduloResponsabilidadRuta
Configuración VitePressLocales ES/EN, nav, sidebar, SEO, sitemap, hreflang, JSON-LD, búsqueda.vitepress/config.mts
TemaExtiende el tema por defecto y carga CSS propia.vitepress/theme/index.ts:1-6, .vitepress/theme/custom.css
Raíz redirectoraRedirige / a /es/ o /en/ según idioma del navegadorindex.md:6-15
Contenido ESPáginas y blog en españoles/ (about, blog/, contact, index, projects)
Contenido ENPáginas y blog en inglés (paridad)en/ (about, blog/, contact, index, projects)
Estáticos públicosfavicon e imagen OpenGraph servidos tal cualpublic/favicon.svg, public/og-cover.png
Imagen de producciónBuild multistage Node → nginxDockerfile:1-20
Servidor webClean URLs, cabeceras, health, gzip, cachénginx.conf:1-34
Despliegue (def.)Pipeline build + push + Cloud Run (no automatizado).github/workflows/deploy.yml
Operación localRecordatorio de expiración de dominioscripts/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.

Cybersecurity · Technology · Leadership