5 playbooks nuevos en docs/playbooks/ del portal: - SQLite en modo DELETE causando SQLITE_BUSY, por que WAL lo resuelve. - Anchors YAML no soportados por el parser de Gitea Actions, incluido el diagnostico equivocado inicial (indentacion) que se corrigio despues -- documentado con honestidad como leccion de proceso. - Docker-in-Docker vs sibling containers, y por que Semgrep corre nativo en un venv en vez de como container aparte. - El SNI/realm HTTP del tunel rompiendo especificamente a Cosign (docker push funcionaba, cosign sign no), conectado con el incidente ya documentado del 504 -- misma capa de ingress, dos fallas distintas. - Contencion de recursos entre Gitea y su runner: causa raiz real confirmada en vivo durante esta misma sesion (ambos contenedores reiniciados a mitad de un build, sin limites de CPU/memoria reales), con fix propuesto (ver rama fix/gitea-runner-resource-limits en scripts/) pendiente de aplicacion manual. Se actualiza el playbook del 504 para linkear hacia el nuevo hallazgo de contencion, cerrando el loop que habia quedado abierto ahi. cosign.md: nueva seccion "Limitaciones conocidas y mejoras futuras" con los dos TODO reales -- firma por tag en vez de digest (con el warning real de Cosign visto en los logs) y transparency log de Rekor deshabilitado, explicado en simple. index.md: tabla resumen de los 3 pipelines (imagen + adaptacion de Semgrep por stack), diagrama generalizado para reflejar que es el mismo patron en los 3 workflows, y "que falta" actualizado. Validado con mkdocs build --strict (0 errores, 0 warnings) antes de commitear.
118 lines
4.0 KiB
YAML
118 lines
4.0 KiB
YAML
site_name: CruzCloud Lab
|
|
site_description: >-
|
|
Portal de documentación del lab GitOps CruzCloud — arquitectura, decisiones
|
|
y playbooks de incidentes reales (ZimaOS + k3d + Gitea + Argo CD).
|
|
site_url: https://docs.cruzcloud.net/
|
|
repo_url: https://gitea.cruzcloud.net/devops/apps-registry
|
|
repo_name: devops/apps-registry
|
|
edit_uri: _blank
|
|
|
|
docs_dir: docs
|
|
|
|
theme:
|
|
name: material
|
|
language: es
|
|
palette:
|
|
- media: "(prefers-color-scheme: light)"
|
|
scheme: default
|
|
primary: indigo
|
|
accent: indigo
|
|
toggle:
|
|
icon: material/weather-night
|
|
name: Cambiar a modo oscuro
|
|
- media: "(prefers-color-scheme: dark)"
|
|
scheme: slate
|
|
primary: indigo
|
|
accent: indigo
|
|
toggle:
|
|
icon: material/weather-sunny
|
|
name: Cambiar a modo claro
|
|
features:
|
|
- navigation.tabs
|
|
- navigation.tabs.sticky
|
|
- navigation.sections
|
|
- navigation.top
|
|
- navigation.footer
|
|
- navigation.indexes
|
|
- search.suggest
|
|
- search.highlight
|
|
- content.code.copy
|
|
- content.tabs.link
|
|
- toc.follow
|
|
|
|
plugins:
|
|
- search:
|
|
lang: es
|
|
# TODO (fase 2): git-revision-date-localized deshabilitado a propósito.
|
|
# El Dockerfile construye con context: workloads/docs-portal/, que no
|
|
# incluye .git (vive en la raíz del repo) — el plugin no tiene historial
|
|
# real que leer y cae siempre en fallback_to_build_date, emitiendo un
|
|
# WARNING por página. mkdocs build --strict aborta ante CUALQUIER
|
|
# WARNING, así que mientras no se le dé contexto de build con .git real
|
|
# (mover el build a la raíz del repo + fetch-depth:0 en el workflow),
|
|
# este plugin debe quedar fuera para no romper el pipeline.
|
|
# - git-revision-date-localized:
|
|
# enable_creation_date: true
|
|
# type: date
|
|
# fallback_to_build_date: true
|
|
|
|
markdown_extensions:
|
|
- admonition
|
|
- attr_list
|
|
- md_in_html
|
|
- tables
|
|
- toc:
|
|
permalink: true
|
|
- pymdownx.details
|
|
- pymdownx.superfences:
|
|
custom_fences:
|
|
- name: mermaid
|
|
class: mermaid
|
|
format: !!python/name:pymdownx.superfences.fence_code_format
|
|
- pymdownx.highlight:
|
|
anchor_linenums: true
|
|
- pymdownx.inlinehilite
|
|
- pymdownx.snippets
|
|
- pymdownx.tabbed:
|
|
alternate_style: true
|
|
|
|
nav:
|
|
- Inicio: index.md
|
|
- Arquitectura:
|
|
- Visión general: arquitectura/vision-general.md
|
|
- Red y exposición: arquitectura/red-y-exposicion.md
|
|
- Flujo GitOps: arquitectura/gitops-flujo.md
|
|
- Glosario: arquitectura/glosario.md
|
|
- Decisiones (ADRs):
|
|
- "0001 · Por qué k3d": decisiones/0001-por-que-k3d.md
|
|
- "0002 · Por qué Argo CD": decisiones/0002-por-que-argocd-vs-manual.md
|
|
- "0003 · HTTP/2 sobre QUIC": decisiones/0003-por-que-http2-sobre-quic-tunnel.md
|
|
- Plantilla ADR: decisiones/plantilla-adr.md
|
|
- Playbooks:
|
|
- Crashloop Medusa: playbooks/incidente-crashloop-medusa.md
|
|
- 504 túnel Gitea: playbooks/incidente-504-gitea-tunnel.md
|
|
- Precios Medusa: playbooks/incidente-precios-medusa.md
|
|
- Imágenes NPM: playbooks/incidente-imagenes-npm.md
|
|
- SQLite modo DELETE: playbooks/incidente-sqlite-modo-delete-2026-08.md
|
|
- Anchors YAML en Gitea Actions: playbooks/incidente-yaml-anchors-gitea-actions-2026-08.md
|
|
- Docker-in-Docker y Semgrep: playbooks/incidente-docker-in-docker-semgrep-2026-08.md
|
|
- Realm HTTP y Cosign: playbooks/incidente-cosign-realm-http-tunnel-2026-08.md
|
|
- Contención de recursos Gitea/runner: playbooks/incidente-contencion-recursos-gitea-runner-2026-08.md
|
|
- Aprendizajes:
|
|
- Notas sueltas: aprendizajes/notas-sueltas.md
|
|
- Guía del estudiante:
|
|
- Inicio: guia-estudiante/README.md
|
|
- Conceptos básicos: guia-estudiante/conceptos-basicos.md
|
|
- DevSecOps:
|
|
- Resumen: devsecops/index.md
|
|
- Gitleaks (secretos): devsecops/gitleaks.md
|
|
- Trivy (imagen + IaC): devsecops/trivy.md
|
|
- SAST (Semgrep): devsecops/sast.md
|
|
- SBOM (Syft): devsecops/sbom.md
|
|
- Cosign (firma de imágenes): devsecops/cosign.md
|
|
|
|
extra:
|
|
social:
|
|
- icon: fontawesome/brands/git-alt
|
|
link: https://gitea.cruzcloud.net/devops
|