Hetzner OPS (crearack-ops) — runners CI + crons del ecosistema
Servidor de operaciones del equipo, creado el 03-07-2026 (s193) para sacar TODO el mantenimiento automatizado de GitHub Actions (0 minutos) y descargar a STAGE de responsabilidades que no eran suyas. Desde la limpieza F3 (s201, 05-07-2026) es el ÚNICO host de crons del ecosistema.
Naturaleza: máquina RECREABLE. No guarda datos de negocio ni tiene rol DR — todo lo que corre aquí se reconstruye desde los repos + 4 secretos. Si se pierde, se re-provisiona con el playbook de §5 en <1h. El DR del workspace vive en STAGE (
concept--infra--staging-server).
1. Hardware y red
- Hetzner CX33 (4 vCPU / 8 GB), Ubuntu. Swapfile 2G (anti-OOM del build Astro).
- IP pública:
178.104.244.255· NetBird:100.96.245.233(acceso SSH habitual del equipo). - Node 22 + pnpm 9 + wrangler 4 + Python 3.12 + jq + Docker (para los runners).
- ✅ Monitor UptimeRobot del host activo (monitor
crearack-ops→178.104.244.255, dado de alta el 04-07-2026; visible en el widget de servidores del workspace y víaget_uptime).
2. Runners self-hosted del CI (0 minutos de Actions)
- 2 runners:
crearack-ops-1/crearack-ops-2, en usuarios AISLADOSrunner/runner2(el HOME compartido provocaba carreras enpnpm/action-setup, s193). - Sirven el CI de CreaRack-Pro (PR #250) y del workspace (PR #130).
- Toolcache compartido
/opt/hostedtoolcacheconchmod -R g+w+ ACL por defecto (footgun s196: un runner lo creaba 755 y el otro no podía cachear → EACCES en setup-node). - Higiene semanal: cron
docker-prune(domingo 05:30,docker system prune -af --filter until=168h).
3. Crons (/etc/cron.d/ · scripts en /opt/)
El inventario detallado con frecuencias y objetivos es la tabla §4 de AUTOMATISMOS.md (fuente de verdad viva). Resumen de grupos:
| Grupo | Qué cubre |
|---|---|
bib-reindex | grafo de CreaRack-Pro: AST cada 10 min · extras (openapi+docs) cada hora · communities diario |
bib-reindex-ws | grafo del workspace: supercontext (diario 00:45) · ts + claude-method (L+J) · chunks Pro (01:30) · wiki (01:00, dom --full) |
biblioteca-crons | mantenimiento wiki: lint (04:30) · lint-consolidation (dom) · curator (L+J) · utility (L+M+V) · drift-check (06:00) · escriba (04:15) · enrich (02:50) |
cf-pages-deploy | build+deploy del sitio workspace a CF Pages cada 10 min con debounce por SHA (palanca 1 anti-Actions, s188) |
gh-actions-watchdog | cada 5 min re-dispara ci.yml (Pro) / post-merge-ingest.yml (workspace) si un commit de main se queda sin runs (footgun “push triggers pausados”). Par del workspace corregido en s201 (antes apuntaba al deshabilitado cf-pages-deploy.yml → 422) |
cron-heartbeat | dead-man’s-switch cada 30 min: email si un cron no reporta [OK] dentro de su ventana |
docker-prune | higiene semanal de los runners |
4. Credenciales y clones
- Deploy keys SSH (
/root/.ssh/, read-only, tituladascrearack-ops (read-only)en GitHub):github_crearack→ CreaRack-Pro ·github_workspace→ workspace ·github_claude_method→ claude-method. Las viejas de STAGE (staging-bib-reindex, hetzner-reindex ×2) se revocaron en la F3. - Tokens (chmod 600):
/opt/bib-reindex/{.token,.cf-access-id,.cf-access-secret}(BIB_MCP_TOKEN + CF Access Service Token) ·/opt/cf-pages-deploy/.env(token CF “hetzner-cf-pages-deploy”, scope Pages Write) ·/opt/gh-actions-watchdog/.token(PAT fine-grained contents:read + actions:write sobre Pro y workspace, puesto el 03-07). - Clones (read-only, los refresca cada cron con
pull --rebase --autostash):/opt/crearack-pro·/opt/crearacksl-workspace·/opt/claude-method·/opt/cf-pages-deploy/workspace(clone dedicado del deploy).
5. Réplica desde cero (playbook corto)
- Provisionar CX33 Ubuntu + alta en NetBird + swapfile 2G.
- Instalar Node 22, pnpm 9, wrangler 4, Python 3.12, jq, Docker.
- Generar 3 deploy keys nuevas → añadirlas read-only a los 3 repos → clonar en
/opt/. - Restaurar los 4 secretos de la bóveda (BIB_MCP_TOKEN, CF Access ST, token CF Pages, PAT watchdog).
- Copiar los
/etc/cron.d/y scripts desde los repos (los scripts viven enscripts/de workspace y Pro; los debiblioteca-cronsyheartbeaten/opt— ver AUTOMATISMOS.md §4). - Runners CI: registrar 2 runners en la org con usuarios separados + ACL del toolcache (§2).
- Verificar: ejecución manual de cada grupo + heartbeat en
[OK].
6. Impacto si OPS cae
| Se para | Efecto | Dolor |
|---|---|---|
| Runners CI | PRs de Pro/workspace sin checks (CI en cola infinita) | Inmediato |
| cf-pages-deploy | el sitio workspace deja de reflejar pushes | ≤1 h |
| Reindex del grafo | bib_ask responde con datos rancios | 12-24 h |
| Crons wiki (lint/curator/…) | drift documental sin vigilancia | días |
| Heartbeat | nadie avisa de los crons — pero el host caído SÍ lo avisa UptimeRobot (crearack-ops) | — |
No afecta: DR del workspace, Dokploy, PROD, STAGE (viven en otros hosts).
Véase también
- [[concept—infra—staging-server]]
- [[runbook—infra—rotate-mcp-token]]
- [[workspace—infra—servidor-ops]]
- [[decision—20260614—rearquitectura-automatismos]]
Referenciado desde
- ADR: Backup de Forgejo como cron de sistema, excepción a centralización en Forgejo Actions
- Catálogo del stack de servicios · los 30 servicios uno a uno (costes, criticidad, credenciales, mapa)
- Cloudflare delante del apex crearack.com — topología, IP real y TLS
- Cron forgejo-backup: Backup diario de Forgejo (OPS)
- El servidor OPS — el cuarto de máquinas de los robots
- Endpoint POST /api/biblioteca/curator-goldens-run — golden-set del Curator contra el prompt desplegado
- Firewalls Hetzner — estado y topología de acceso
- Forgejo F1: Automatizaciones en paralelo (GitHub ↔ Forgejo)
- Hetzner STAGE (178.104.131.173) — inventario y plan de réplica
- Incidente 503/1102 — Workers Free asfixiado por el crecimiento de la Biblioteca (05→07 julio 2026)
- Incidente: needrestart colgó un job de CI 45 min sin fallar, y crearack-ops-1 llevaba 4 días caído sin aviso
- Runner Forgejo Actions (OPS): Ejecución de workflows en forgejo-runner v12.13.2
- Workflow infra-espejo-releases: Copia de Releases desde GitHub a Forgejo