El pipeline de Document Publishing Automation cierra el ciclo documental de AI-LAB. Cuando una fase modifica documentación en apps/ialab-docs/, el pipeline ejecuta en orden:

  1. Public Astro — build, secret scan, commit, push a GitHub, espera despliegue de Cloudflare Pages, valida URLs clave
  2. Private Astro — SSH a 192.168.1.30, git pull, npm install, npm run build, sudo systemctl restart ailab-docs, valida URLs vía localhost:4322
  3. AnythingLLM Reindex — reindexa el workspace ai-lab-core vía API con batch controlado, exclusiones y modo incremental
  4. AnythingLLM Smoke Queries — 2-3 preguntas representativas validadas contra AnythingLLM

Cada etapa es independiente y puede saltarse con flags. Cualquier fallo detiene el pipeline y genera un audit report en docs/audits/.

Fase cierra cambios en apps/ialab-docs/
→ invoke-phase-closure.ps1
├── publish-astro-public.ps1 (commit + push → Cloudflare)
├── publish-astro-private.ps1 (SSH → build → restart → validate)
├── reindex-workspace.ps1 (AnythingLLM API → batch reindex)
└── smoke-queries.ps1 (preguntas → validación)
SuperficieURLMétodo de despliegue
Públicohttps://ai-lab.labrazahome.comGitHub push → Cloudflare Pages (auto)
Privadohttps://blog-ai-lab.labrazahome.comSSH → systemd ailab-docs en 192.168.1.30:4322
Métricashttps://metricas.labrazahome.comNext.js SSR (NO incluido en este pipeline)
Usage: .\scripts\phase-closure\invoke-phase-closure.ps1 -PhaseName "NOMBRE" [flags]
Flags:
-PhaseName <string> Nombre obligatorio de la fase (se usa en commit y audit)
-DryRun Valida prerequisitos sin hacer cambios
-SkipPublic Salta publicación Astro público
-SkipPrivate Salta publicación Astro privado
-SkipReindex Salta reindex AnythingLLM y smoke queries
-BuildOnly Solo build privado (sin restart ailab-docs)
-SudoPassword <string> Password sudo para restart en .30 (o $env:AILAB_SUDO_PASSWORD)
-AnythingLLMApiKey <string> API key (o $env:ANYTHINGLLM_API_KEY)

Ejemplo DryRun:

.\scripts\phase-closure\invoke-phase-closure.ps1 -PhaseName "FASE-XX" -DryRun

Ejemplo Apply completo:

$env:AILAB_SUDO_PASSWORD = "mipassword"
$env:ANYTHINGLLM_API_KEY = "sk-..."
.\scripts\phase-closure\invoke-phase-closure.ps1 -PhaseName "FASE-XX"

publish-astro-public.ps1 — Astro público (Cloudflare)

Section titled “publish-astro-public.ps1 — Astro público (Cloudflare)”
Flags: -NoPush (build local sin commit/push), -PushOnly (solo commit/push sin build local)

Pasos:

  1. npm run build en apps/ialab-docs/
  2. Secret scan en dist/ (busca claves API)
  3. git status para verificar cambios
  4. git add -A && git commit -m "feat(docs): ..."
  5. git push origin main
  6. Espera hasta 300s a que Cloudflare Pages despliegue (poll cada 15s)
  7. Valida 4 URLs públicas (200 OK)

publish-astro-private.ps1 — Astro privado (ailab-docs)

Section titled “publish-astro-private.ps1 — Astro privado (ailab-docs)”
Flags: -BuildOnly (SSH + build sin restart), -SudoPassword

Pasos:

  1. SSH a albert@192.168.1.30 (requiere key SSH configurada)
  2. git status en /opt/ai-lab
  3. git pull --ff-only
  4. npm install en apps/ialab-docs
  5. npm run build (264 páginas, ~12s)
  6. sudo systemctl restart ailab-docs (requiere password sudo o NOPASSWD)
  7. Valida 4 URLs vía localhost:4322
ResultadoCondición
PASSTodas las etapas completadas sin error. URLs 200, build OK, reindex OK, smoke queries OK
WARNAlguna etapa saltada o con advertencias (API key no configurada, sudo password no disponible)
FAILCualquier etapa falla (build broken, push rechazado, URLs no responden 200, reindex falla)

El pipeline es secuencial: si public Astro falla, no continúa a private ni reindex. Cada etapa reporta PASS/FAIL/WARN independientemente. El audit report se genera siempre, incluso en FAIL.

Toda la configuración compartida está en scripts/phase-closure/config.ps1:

VariableDefaultDescripción
AILAB_SSH_HOST192.168.1.30Host privado Astro
AILAB_SSH_USERalbertUsuario SSH
AILAB_REMOTE_REPO/opt/ai-labRuta del repo en .30
PUBLIC_ASTRO_URLhttps://ai-lab.labrazahome.comURL pública
PRIVATE_ASTRO_LOCAL_URLhttp://127.0.0.1:4322URL privada local
CLOUDFLARE_DEPLOY_TIMEOUT_SECONDS300Timeout espera Cloudflare
ANYTHINGLLM_BASE_URLhttp://192.168.1.50:3001URL AnythingLLM
ANYTHINGLLM_WORKSPACEai-lab-coreWorkspace AnythingLLM

El pipeline valida 4 URLs representativas tanto en público como en privado tras cada despliegue:

RutaContenido
/docs/governance/phase-closure-protocol/Protocolo de cierre de fase
/docs/governance/anythingllm-reindex-automation/Automatización reindex
/docs/architecture/anythingllm-role/Rol de AnythingLLM
/blog/017-anythingllm-memoria-documental/Blog sobre memoria documental

Todas deben responder HTTP 200. Si alguna falla, la etapa se marca como FAIL y el pipeline se detiene.

  • Git repo local con origin configurado (push a GitHub)
  • SSH key configurada para albert@192.168.1.30 (sin contraseña interactiva)
  • Sudo NOPASSWD en .30 para systemctl restart ailab-docs, o password vía $env:AILAB_SUDO_PASSWORD
  • $env:ANYTHINGLLM_API_KEY para reindex AnythingLLM
  • Astro npm run build funcional en ambos entornos
  • Cloudflare Pages conectado al repo GitHub
DocumentoRelación
phase-closure-protocol.mdDefine cuándo y cómo cerrar una fase. Este pipeline automatiza pasos 3-5 del protocolo.
anythingllm-reindex-automation.mdDocumenta el script de reindex AnythingLLM usado por este pipeline.
ASTRO-DEPLOYMENT-GOVERNANCE.mdDefine las superficies web y reglas de despliegue que este pipeline ejecuta.
VersiónFechaCambio
012026-06-11Versión inicial del pipeline de automatización documental