navarro-bores.com (blog personal de Arturo Navarro)
Blog personal bilingüe (ES/EN) de Arturo Navarro de la Cruz, centrado en ciberseguridad, CISO, cumplimiento y liderazgo tecnológico. Sitio estático generado con VitePress y desplegado en Google Cloud Run.
Stack
- VitePress 1.6.4 (sitio estático, Vue 3).
- Bilingüe: locales
es(por defecto) yen. - Despliegue: Docker (build Node 20 + serve Nginx) sobre Cloud Run (
europe-west1). - CI/CD:
.github/workflows/deploy.yml(formato GitHub Actions) para Gitea Actions; ⚠ HOY ningún host lo ejecuta: Actions desactivado en la Gitea local (has_actions=false, medido 2026-09-06) y sin remotogithub. Decisión pendiente: issue #2.
Estructura
.vitepress/config.mts: configuración central (locales, nav, sidebar, SEO, sitemap, JSON-LD, búsqueda local)..vitepress/theme/: tema personalizado (custom.css,index.ts).es/yen/: contenido por idioma (about,contact,projects,blog/). Cada artículo existe en ambos idiomas.index.md: raíz que redirige a/es/o/en/segúnnavigator.language.public/: estáticos servidos tal cual (favicon.svg,og-cover.png).scripts/: recordatorio de expiración de dominio (domain-reminder.sh+ plist de LaunchAgent).Dockerfile,nginx.conf: imagen de producción y servidor (puerto 8080,/healthz).docs/yREADME.md: documentación del repo (vistasfuncional/tecnico), no salida de build.
Comandos clave
npm install: instalar dependencias.npm run dev: servidor de desarrollo (VitePress).npm run build: build a.vitepress/dist.npm run preview: previsualizar el build.- Deploy: el workflow (build Docker, push a Artifact Registry,
gcloud run deploy) se dispararía con un push amain, pero HOY no corre en ningún host (Actions desactivado en la Gitea local, sin remoto GitHub; medido 2026-09-06, issue #2): el único camino de deploy vivo es ungcloud run deploymanual, y ese comando está enaskdel settings global (2026-09-06): es el gate efectivo. Cuando se rehabilite Actions, el gate real pasa a ser la verificación ANTES de commitear (npm run builden verde) porque el push desplegaría sin entorno intermedio; el workflow no tienepaths-ignore(cada commit amaindesplegaría) y el repo no tiene hooks versionados: ambos van en el mismo acto que la rehabilitación (issue #2). Unworkflow_dispatchcorrería en el runner y NO pasaría por el permiso de la sesión.
Reglas y gotchas
- No hay lint ni tests definidos; solo
dev/build/preview. - Contenido bilingüe: al añadir o editar un artículo, mantener la paridad ES/EN y actualizar el
sidebarcorrespondiente enconfig.mts. cleanUrls: true: enlazar sin.html. Nginx resuelve URLs limpias víatry_files.- El despliegue espera puerto 8080 y la imagen
personal-blogeneurope-southwest1-docker.pkg.dev; requiere el secretGCP_SA_KEY. - Split de región (fácil de confundir): el Artifact Registry está en
europe-southwest1, pero Cloud Run corre eneurope-west1. Son regiones distintas a propósito; no las unifiques. - El deploy usa la service account
blueup-docs-deployer@homelab-466309.iam.gserviceaccount.com(útil para depurar permisos del despliegue). domain-reminder.shlleva la fecha de expiración del dominio hardcodeada (EXPIRY_DATE); actualizarla tras renovar.node_modules/,.vitepress/cache/y.vitepress/dist/están en.gitignore.