Compare commits

..
Author SHA1 Message Date
devopsandClaude Sonnet 5 d98ec9a488 Merge branch 'docs/adr-0013-iniciativas-clientes-2026-09-21'
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 31s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 8m48s
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QMP7ULbxbsB5g1vELNAT3D
2026-09-21 14:01:30 +00:00
devopsandClaude Sonnet 5 03cfb203eb docs(adr-0013): iniciativas de clientes (Apps Script + AppSheet), fase prioritaria
Nueva fase, separada y con prioridad sobre las Fases 2-4 del ADR 0012:
practica de Apps Script (via clasp, sin MCP -- se verifico que no existe
uno oficial de Google) y AppSheet (documentado desde afuera, sin export
de codigo posible, verificado contra la documentacion oficial) para
iniciativas reales de la empresa con cuenta personal, sin datos ni
credenciales de cliente en ningun repo/doc. Deja explicito lo que queda
en pausa mientras esta fase este activa: swap de tmux-host, Fase 4 del
ADR 0012 (GKE), prueba del skill frontend-design.

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QMP7ULbxbsB5g1vELNAT3D
2026-09-21 14:01:17 +00:00
gitea-actions 4553967bec chore(gitops): deploy Docs Portal v1.0.279 [skip ci] 2026-09-21 04:26:38 +00:00
devopsandClaude Sonnet 5 059597346d docs(adr-0012): documentar pivot de Fase 1 a Connectors nativos de claude.ai
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 36s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 9m20s
El MCP self-hosted (taylorwilsdon/google_workspace_mcp) quedo abandonado:
limite real en FastMCP's OAuthProxy, no error de configuracion -
redirect_uri se arma desde base_url (no desde GOOGLE_OAUTH_REDIRECT_URI),
y base_url tambien alimenta issuer_url, que mcp/server/auth/routes.py
exige HTTPS-o-localhost sin bypass. Documenta la causa raiz confirmada
leyendo el codigo fuente instalado, la decision del usuario de usar
Connectors nativos en su lugar, y la verificacion en vivo (3 calendarios
reales, razonamiento de fechas correcto).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QMP7ULbxbsB5g1vELNAT3D
2026-09-21 04:16:19 +00:00
gitea-actions b55766847f chore(gitops): deploy Docs Portal v1.0.278 [skip ci] 2026-09-20 23:17:55 +00:00
devops 848bac0b2d Merge branch 'docs/plugins-y-subagentes-2026-09-20'
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 57s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 11m58s
2026-09-20 23:04:41 +00:00
devops 8107f9b6c7 docs(arquitectura): documentar plugins y subagentes instalados en sesion lab 2026-09-20 23:04:20 +00:00
gitea-actions d82f4df83a chore(gitops): deploy Docs Portal v1.0.277 [skip ci] 2026-09-20 21:11:43 +00:00
devops 55eb9d8051 Merge branch 'docs/adr-0012-practica-multicloud-2026-09-20'
Build and Push Docs Portal / Escaneo de Secretos (Gitleaks) (push) Successful in 37s
Build and Push Docs Portal / Construir y publicar Docs Portal (push) Successful in 7m47s
2026-09-20 21:03:22 +00:00
gitea-actions c245f3b67a chore(gitops): deploy Docs Portal v1.0.276 [skip ci] 2026-09-20 20:42:06 +00:00
5 changed files with 298 additions and 19 deletions

No files matched your search

@@ -0,0 +1,111 @@
# Plugins y subagentes de Claude Code (sesión "lab")
Inventario de qué plugins/skills se instalaron en la sesión principal
`lab` (no `cloud-practice`, que sigue su propia línea de práctica
multi-cloud — ver [ADR 0012](../decisiones/0012-practica-multicloud-gcp-azure.md))
y qué subagentes propios se configuraron, con la fuente real de cada
uno y por qué se aceptó o se descartó.
## Por qué esto queda documentado como el resto del lab
Dos frentes reales motivaron esto: (a) trabajo visual del storefront
ARI Shopping — ADR 0008 ya costó tres ciclos completos de
implementar-y-descartar una identidad en producción por no verla
renderizada antes de aprobarla; (b) crecimiento de habilidades de
Platform Engineering/DevOps. Un plugin instala instrucciones que
Claude sigue automáticamente, algunos con hooks que se ejecutan sin
pedir confirmación en cada uso — se aplicó la misma disciplina de
verificación que el resto del lab: quién publica (Anthropic vs
comunitario), qué permisos/hooks declara, y popularidad como señal de
confianza, antes de instalar cualquiera que no fuera 100% de Anthropic.
## Plugins instalados
| Plugin | Marketplace | Publica de verdad | Hooks | Notas |
|---|---|---|---|---|
| `frontend-design` | `claude-plugins-official` | **Anthropic** (verificado en `plugin.json`) | Ninguno | Solo skills, sin red externa |
| `context7` | `claude-plugins-official` | **Upstash** (tag `community-managed` — está *hospedado* en el catálogo oficial, no *publicado* por Anthropic) | Sin hooks, pero es un MCP que manda cada consulta al servidor remoto de Upstash (`mcp.context7.com`) | Aceptado con esa salvedad explícita de datos saliendo a un tercero |
| `superpowers` | `claude-plugins-official` | **Jesse Vincent** (`obra/superpowers`, MIT, 288k+ ⭐ en GitHub) — **NO es de Anthropic** pese a estar listado en el catálogo oficial | Sí: `SessionStart` corre un script que inyecta contexto en cada sesión nueva (revisado: solo lee su propio skill local, sin red ni nada destructivo) | Aceptado con esa salvedad — cambia comportamiento de arranque sin pedir confirmación cada vez |
| `gitops-workflows` | `devops-skills` (`ahmedasmar/devops-claude-skills`) | Ahmad Asmar (comunitario) | Ninguno (skill pura, sin ejecución automática) | |
| `k8s-troubleshooter` | `devops-skills` | Ahmad Asmar | Ninguno | |
| `ci-cd` | `devops-skills` | Ahmad Asmar | Ninguno | |
| `monitoring-observability` | `devops-skills` | Ahmad Asmar | Ninguno | |
**Descartados, no instalados:**
- **`iac-terraform`** (del mismo marketplace `devops-skills`) — descartado a propósito, no por falta de calidad. Terraform ya se maneja aparte vía `hashicorp/agent-skills` en la sesión `cloud-practice` (ver ADR 0012 Fase 2); instalarlo acá también duplicaría/confundiría la fuente de verdad.
- **`aws-cost-optimization`** (mismo marketplace) — no se pidió, se dejó afuera para no sumar alcance no solicitado.
- **`theme-factory`** — investigado y descartado: el mismo nombre aparece en al menos 4 fuentes comunitarias distintas y no relacionadas entre sí (`kivilaid`, `shipshitdev`, `composiohq`, etc.), ninguna en el catálogo oficial de Anthropic. Sin una fuente única verificable, no se instaló nada con ese nombre.
- **`ui-theme-designer`** (alternativa considerada del catálogo oficial) — es de **SAP SE**, específico para el SAP Fiori Design System / UI5 Web Components. No tiene nada que ver con el stack real de ARI Shopping (Next.js + Tailwind) — se descartó por no aplicar, no por falta de confianza.
## Subagentes propios (`~/.claude/agents/`)
Tres subagentes con propósito acotado y tools restringidas, definidos
como archivos markdown con frontmatter YAML (formato estándar de
Claude Code — ver [documentación oficial](https://code.claude.com/docs/en/sub-agents)).
### `devsecops-auditor`
Solo lectura y explicación del pipeline DevSecOps real (Gitleaks,
Trivy, Semgrep, Syft, Cosign) en `apps-registry`/`platform-infra`/
`scripts`. `tools: Read, Grep, Glob, Bash` + `disallowedTools: Write,
Edit` — nunca modifica código de producción, su único output es
diagnóstico contra el YAML/config real, citando archivo:línea, nunca
teoría genérica de CI/CD.
### `frontend-critic`
Revisa visualmente un cambio del storefront **antes** de aprobarlo —
formaliza la disciplina "simular antes de implementar" que costó tres
ciclos de descarte en ADR 0008. Regla dura: si no puede ver el
resultado renderizado en esa corrida puntual, el veredicto es "no
puedo aprobar esto sin verlo", nunca un aprobado condicional.
Vía de verificación, en orden de preferencia:
1. Chrome DevTools / Claude in Chrome — **hoy no disponible en esta
sesión** (corre headless dentro de `tmux-host`, sin navegador real
conectado — mismo gotcha ya documentado para Claude in Chrome en
general).
2. Playwright vía Docker en la NAS (el workaround ya validado este
mismo lab, ver `.browser-scratch/README.md`) contra
`shop.cruzcloud.net`/`staging.cruzcloud.net` reales.
Usa la skill `frontend-design` (oficial, ver tabla de arriba) como
marco de criterio de calidad visual.
### `cloud-cost-auditor`
Definido de antemano, a propósito, **sin nada que auditar todavía**.
Necesita los MCP de GCP/Azure que se configuran en la sesión
`cloud-practice` (ADR 0012) para funcionar — no va a tener recursos
reales que revisar hasta que esa línea de trabajo pase de la Fase 1.
Su propio system prompt tiene la regla dura de decir explícitamente
"no tengo nada que auditar todavía" en vez de inventar un análisis si
lo invocan antes de tiempo. No es un bloqueante para nada de lo demás,
solo queda listo para cuando aplique.
## Alcance y persistencia de la instalación
Los 7 plugins quedaron en **`scope: user`** (confirmado con
`claude plugin list`), no a nivel de proyecto de un repo específico.
Los 3 subagentes viven en `~/.claude/agents/` (también scope de
usuario, ubicación estándar según la doc oficial).
**Verificado en vivo que sobrevive a un reinicio del contenedor**,
mismo criterio que el resto de la configuración persistente de
`tmux-host` (ver [Sesión tmux persistente](sesion-tmux-persistente.md)):
`stat -c '%d' /root/.claude` y `stat -c '%d'
/DATA/AppData/k3d-lab-v3/claude-code-home` devuelven el mismo device
ID — es el mismo bind mount ya validado para login/confianza de
carpeta, no un directorio efímero del contenedor.
**Gotcha encontrado en vivo:** tanto los plugins como los subagentes
nuevos **no quedaron activos en la misma sesión donde se instalaron/
crearon** — la doc oficial de subagentes dice que se cargan sin
reinicio, *excepto* la primera vez que se crea el directorio
`~/.claude/agents/` (que no existía antes en este lab). Confirmado en
vivo: invocar `devsecops-auditor` en la misma sesión dio
`Agent type 'devsecops-auditor' not found`. Ambos (plugins y
subagentes) quedan pendientes de confirmar activos recién en el
próximo arranque real de la sesión — no es una falla de instalación,
es el comportamiento documentado.
@@ -1,9 +1,13 @@
# ADR 0012 — Práctica multi-cloud: GCP y Azure DevOps en paralelo al lab ZimaOS # ADR 0012 — Práctica multi-cloud: GCP y Azure DevOps en paralelo al lab ZimaOS
**Estado:** aceptada — Fase 1 (Google Workspace) en ejecución en esta **Estado:** aceptada — Fase 1 (Google Workspace) completa y verificada
misma sesión; Fases 2-4 quedan documentadas como roadmap, explícitamente en vivo, con un giro real: el MCP self-hosted planeado
no implementadas hasta que se pidan en una sesión futura. (`taylorwilsdon/google_workspace_mcp`) quedó abandonado por un límite
**Fecha:** 2026-09-20 real de esa librería (ver §Fase 1), reemplazado por los Connectors
nativos de claude.ai. Fases 2-4 quedan documentadas como roadmap,
explícitamente no implementadas hasta que se pidan en una sesión
futura.
**Fecha:** 2026-09-20 (Fase 1 cerrada 2026-09-21)
## Contexto ## Contexto
@@ -36,7 +40,7 @@ empujan a abrir una segunda línea de práctica en paralelo:
arquitectónica real, diagramas Mermaid, cifras verificadas en vivo o arquitectónica real, diagramas Mermaid, cifras verificadas en vivo o
contra fuente primaria (no contra un blog de terceros sin contra fuente primaria (no contra un blog de terceros sin
corroborar — ver el caso del supuesto MCP "oficial" de Google corroborar — ver el caso del supuesto MCP "oficial" de Google
Workspace en la [Fase 1](#fase-1-ejecutar-en-esta-sesion-google-workspace)). Workspace en la [Fase 1](#fase-1-ejecutada-google-workspace-con-un-giro-real-en-la-implementacion)).
## Diagrama del lab actual (ZimaOS) ## Diagrama del lab actual (ZimaOS)
@@ -194,20 +198,60 @@ Todas documentadas acá; **solo la Fase 1 se ejecuta en esta sesión.**
Las Fases 2-4 no se implementan sin pedido explícito en una sesión Las Fases 2-4 no se implementan sin pedido explícito en una sesión
futura — quedan como roadmap, no como trabajo en curso. futura — quedan como roadmap, no como trabajo en curso.
### Fase 1 (ejecutar en esta sesión) — Google Workspace ### Fase 1 (ejecutada) — Google Workspace, con un giro real en la implementación
MCP de Google Workspace vía cuenta personal, para las iniciativas ya **Objetivo cumplido — acceso real a Google Calendar desde Claude,
en curso. Detalle de la investigación previa a implementar (qué MCP verificado en vivo — pero por un camino distinto al planeado
usar, oficial vs comunitario) en la Parte 3 de esta conversación — originalmente.** Detalle de la investigación previa (qué MCP usar,
resumen: **no existe un MCP oficial de Google Workspace** publicado oficial vs comunitario) — resumen: **no existe un MCP oficial de
por Google (se verificó explícitamente buscando en los GitHub Google Workspace** publicado por Google (se verificó explícitamente
`google`/`googleworkspace` oficiales — no aparece ninguno; un solo buscando en los GitHub `google`/`googleworkspace` oficiales — no
blog de terceros afirma que "ya existe uno oficial" sin que ninguna aparece ninguno; un solo blog de terceros afirma que "ya existe uno
otra fuente lo corrobore, así que se descarta esa afirmación por no oficial" sin que ninguna otra fuente lo corrobore, así que se descarta
verificable). `taylorwilsdon/google_workspace_mcp` es la opción esa afirmación por no verificable). Se optó por
comunitaria más completa y activamente mantenida (120+ herramientas, `taylorwilsdon/google_workspace_mcp` (comunitario, el más completo y
OAuth 2.1, +2500 estrellas) — es la que se usa, etiquetada como activamente mantenido: 120+ herramientas, OAuth 2.1, +2500 estrellas)
comunitaria, no oficial. como primer intento, self-hosted dentro de `tmux-host`.
**Ese self-hosted quedó abandonado — límite real encontrado en la
librería, no un error de configuración.** El servidor usa FastMCP's
`GoogleProvider`/`OAuthProxy`, que construye el `redirect_uri`
enviado a Google directamente desde su propio `base_url` — **no**
desde la variable `GOOGLE_OAUTH_REDIRECT_URI` que el proyecto expone
(esa variable solo valida entradas, no arma la salida real; hallazgo
confirmado leyendo el código fuente instalado, no la documentación
pública). Y `base_url` es la misma variable de la que depende por
default `issuer_url`, que el SDK de MCP exige sea HTTPS salvo que sea
literalmente `localhost`/`127.0.0.1` (chequeo hardcodeado en
`mcp/server/auth/routes.py:validate_issuer_url`, sin variable de
entorno que lo salte). Resultado: **no hay combinación de variables
de entorno que satisfaga a la vez** "el navegador del usuario debe
poder llegar al callback" (necesita un dominio real, no `localhost`)
y "el issuer debe ser HTTPS o `localhost`" — `workspace-mcp` no
expone `issuer_url` por separado de `base_url` en su capa de
configuración (confirmado en `core/server.py`: solo pasa `base_url` a
`GoogleProvider(...)`).
**Decisión del usuario ante ese límite:** en vez de armar un proxy
HTTPS con certificado autofirmado (infraestructura extra, fricción de
certificado no confiable en cada uso) o parchear el paquete instalado
a mano (frágil, se pierde en cualquier reinstalación), se usaron los
**Connectors nativos de claude.ai** (Google Calendar, vía el
directorio de conectores de la cuenta, fuera de Claude Code por
completo) — mismo resultado práctico (Claude con acceso real al
calendario personal), infraestructura cero de nuestro lado, sin
tocar código de terceros. Contrapartida real: es una integración de
cuenta de claude.ai, no un MCP configurado dentro del proyecto
`platform-multicloud` — no aparece como herramienta en sesiones de
Claude Code (`lab`/`cloud-practice`), solo en el chat normal de
claude.ai.
**Verificado en vivo:** pregunta real en claude.ai normal ("¿qué
tengo en el calendario esta semana?") devolvió una respuesta correcta
revisando 3 calendarios reales de la cuenta (principal, Familia,
festivos de Colombia) vía la herramienta `Google Calendar: Lists
calendar events`, con razonamiento correcto sobre qué cuenta como
"esta semana" dado el día/hora real de la consulta.
### Fase 2 (documentar, no ejecutar) — Terraform aislado ### Fase 2 (documentar, no ejecutar) — Terraform aislado
@@ -0,0 +1,122 @@
# ADR 0013 — Iniciativas de clientes: Google Apps Script y AppSheet
**Estado:** aceptada — **fase prioritaria**, precede la reanudación de
las Fases 2-4 del [ADR 0012](0012-practica-multicloud-gcp-azure.md).
Scaffold del repo en curso; primeras iniciativas reales se agregan
sesión a sesión, a medida que se comparten.
**Fecha:** 2026-09-21
## Contexto
Iniciativas propias de la empresa (no del lab), trabajadas con **cuenta
personal de Google** — dos herramientas concretas: **Google Apps
Script** (código, automatizaciones) y **Google AppSheet** (apps
no-code sobre Sheets). Se abre como fase separada del ADR 0012 y con
prioridad sobre él por decisión explícita: retomar las Fases 2-4 del
lab (Terraform, Azure DevOps, GKE) espera a que esto avance primero.
**Restricción dura, no negociable:** ningún repo ni documento de esta
iniciativa contiene credenciales, datos ni información real de
cliente. Apps Script versiona código (lógica), nunca datos. AppSheet
no tiene export de código — solo se documenta desde afuera (tablas,
columnas, expresiones, capturas), nunca se copian datos reales de
ninguna hoja de cálculo al repo.
## Opciones consideradas
### Apps Script: MCP vs. `clasp`
| Opción | A favor | En contra |
|---|---|---|
| MCP para Apps Script | Interacción conversacional directa | **No existe un MCP oficial de Google.** Se verificó explícitamente buscando — solo hay servidores comunitarios (`mohalmah/google-appscript-mcp-server`, `whichguy/gas_mcp`, entre otros), ninguno publicado por Google. Se descartan sin evaluar más a fondo: no hay necesidad de agregar una dependencia comunitaria no verificada cuando existe una CLI oficial que cubre el caso de uso completo. |
| **`clasp`** (elegido) | CLI oficial de Google (`@google/clasp`), mantenida por el equipo de Apps Script, cubre push/pull/login/versiones/despliegues | Requiere login interactivo (OAuth) — mitigado: el login lo corre el dueño de la cuenta, nunca se comparte el código de autorización |
### AppSheet: qué se puede versionar
Se verificó contra la documentación oficial vigente (no se asumió):
**AppSheet no expone ningún mecanismo de export de la definición de la
app** (tablas virtuales, vistas, expresiones, automatizaciones) hacia
un formato versionable con git. La única superficie exportable es la
app en sí vía la consola de AppSheet, no un artefacto de código. Existe
un addon de terceros ("App Script Saver") pero es específico de Apps
Script, no de AppSheet, y no se evaluó como parte de esta decisión
(mismo criterio que con los MCP: no se instala nada de terceros sin
pasar primero por la verificación de publicador/permisos ya establecida
en el lab).
**Decisión sobre AppSheet:** no se intenta versionar la app —se
documenta desde afuera. La documentación (markdown + capturas) es la
única fuente versionada; la app real en la consola de AppSheet sigue
siendo la fuente de verdad operativa, con el riesgo explícito de que
la documentación quede desactualizada (ver Consecuencias).
## Decisión
Repo privado nuevo `client-initiatives` en Gitea (separado de
`apps-registry`/`platform-infra`/`scripts`/`platform-multicloud` — ni
lab GitOps ni práctica multi-cloud, es su propia categoría). Estructura:
una carpeta por iniciativa bajo `apps-script/` (proyecto `clasp`
completo, con su propio `.clasp.json`) o `appsheet/` (documentación +
plantilla de estructura vacía). Mismo criterio de versionado semántico
y modularidad que ya usa `docs-portal`.
**Flujo Apps Script:** rama `fix/*` → diff mostrado → `merge --no-ff`
a `main`. `clasp push` (subir el código a Google) es una confirmación
explícita **aparte**, nunca agrupada con el merge a git — son dos
sistemas de versionado distintos (git para el repo, Apps Script para
las versiones desplegadas) y no deben confundirse.
**Gitleaks:** se agrega al pipeline del repo nuevo. Nota real
encontrada al planificar esto: Gitleaks hoy solo corre en
`apps-registry` (3 workflows) — `platform-infra` y `scripts` no tienen
Gitea Actions configurado en absoluto, no hay "los otros tres repos con
Gitleaks" como se asumió al principio. Se replica el step exacto que
ya usa `apps-registry` (Gitleaks v8.21.2, `--no-git --redact`, reporte
JSON) por ser el único precedente real en el lab.
## Fases
### Fase A — Google Apps Script
1. Scaffold del repo `client-initiatives` (estructura, Gitleaks,
convenciones documentadas).
2. Login de `clasp` (`clasp login --no-localhost`) corrido por el
dueño de la cuenta — verificación posterior de que
`~/.clasprc.json` queda fuera de cualquier repo y con `chmod 600`.
3. Primeras iniciativas: pendientes de compartir, se agregan una por
una bajo `apps-script/<slug>/` a medida que llegan.
### Fase B — Google AppSheet
1. Por cada app existente: documentar tablas, columnas y expresiones
en markdown, más capturas del estado actual, bajo
`appsheet/<slug>/`.
2. Plantilla de estructura de datos vacía si aplica (schema, nunca
filas reales).
3. Limitación dejada explícita en cada README de iniciativa: sin diff
automático posible entre esta doc y la app real.
## En pausa mientras esta fase esté activa
Por decisión explícita del usuario, prioridad sobre lo ya documentado
en el ADR 0012 y el resto del lab:
- **Swap de `tmux-host`** — no se corre en esta fase.
- **[Fase 4 del ADR 0012](0012-practica-multicloud-gcp-azure.md#fase-4-documentar-no-ejecutar-gke-real-con-spot-auto-apagado)**
(GKE real con Spot + auto-apagado) — sigue solo documentada.
- **Prueba del skill `frontend-design`** (pendiente desde la
instalación de plugins del 2026-09-20) — no se ejecuta.
Tampoco se toca NPM, `cloudflared`, ni `lab-agent` durante esta fase.
## Consecuencias
- Se gana un espacio versionado y auditado (Gitleaks) para
automatizaciones reales de la empresa, sin mezclar nada con el lab
GitOps ni con la práctica multi-cloud.
- Se acepta como deuda consciente que la documentación de AppSheet
puede desincronizarse de la app real — no hay forma técnica de
evitarlo, solo disciplina de actualizarla.
- Revertir esta decisión implicaría: eliminar el repo
`client-initiatives` (las iniciativas seguirían existiendo en Google,
solo se perdería el historial versionado y la documentación externa).
+2
View File
@@ -86,6 +86,7 @@ nav:
- Flujo GitOps: arquitectura/gitops-flujo.md - Flujo GitOps: arquitectura/gitops-flujo.md
- Agente de monitoreo: arquitectura/agente-monitoreo.md - Agente de monitoreo: arquitectura/agente-monitoreo.md
- Sesión tmux persistente: arquitectura/sesion-tmux-persistente.md - Sesión tmux persistente: arquitectura/sesion-tmux-persistente.md
- Plugins y subagentes: arquitectura/plugins-y-subagentes.md
- Glosario: arquitectura/glosario.md - Glosario: arquitectura/glosario.md
- Decisiones (ADRs): - Decisiones (ADRs):
- "0001 · Por qué k3d": decisiones/0001-por-que-k3d.md - "0001 · Por qué k3d": decisiones/0001-por-que-k3d.md
@@ -100,6 +101,7 @@ nav:
- "0010 · Pago y envío reales": decisiones/0010-pago-envio-reales-y-storefront.md - "0010 · Pago y envío reales": decisiones/0010-pago-envio-reales-y-storefront.md
- "0011 · Ambiente de Staging": decisiones/0011-ambiente-staging.md - "0011 · Ambiente de Staging": decisiones/0011-ambiente-staging.md
- "0012 · Práctica multi-cloud GCP/Azure": decisiones/0012-practica-multicloud-gcp-azure.md - "0012 · Práctica multi-cloud GCP/Azure": decisiones/0012-practica-multicloud-gcp-azure.md
- "0013 · Iniciativas de clientes": decisiones/0013-iniciativas-clientes.md
- Plantilla ADR: decisiones/plantilla-adr.md - Plantilla ADR: decisiones/plantilla-adr.md
- Playbooks: - Playbooks:
- Crashloop Medusa: playbooks/incidente-crashloop-medusa.md - Crashloop Medusa: playbooks/incidente-crashloop-medusa.md
@@ -25,7 +25,7 @@ spec:
runAsNonRoot: false runAsNonRoot: false
containers: containers:
- name: app - name: app
image: gitea.cruzcloud.net/devops/docs-portal:v1.0.274 image: gitea.cruzcloud.net/devops/docs-portal:v1.0.279
# El base saca TODAS las capabilities. Probado en vivo y # El base saca TODAS las capabilities. Probado en vivo y
# revertido: con drop: ALL (aunque se agregue NET_BIND_SERVICE # revertido: con drop: ALL (aunque se agregue NET_BIND_SERVICE
# de vuelta) el propio entrypoint de nginx:1.27-alpine falla al # de vuelta) el propio entrypoint de nginx:1.27-alpine falla al