Disaster Recovery — CreaRackSL Workspace
Ultima actualizacion: 2026-07-02 (auditoría s185 — contraseña del mirror retirada de la wiki y rotada; enlaces a Documentation/ archivada repuntados)
Responsable: Edu / Dani
Objetivo: Mantener la operativa de CreaRack SL si los servicios cloud fallan.
Guia rapida de emergencia
Para Txell, Edu y Dani — Lee esta seccion primero. Explica que hacer paso a paso sin conocimientos tecnicos.
Que es esto?
CreaRack SL usa varios servicios en la nube para trabajar: el workspace (nuestra intranet en workspace.crearack.com), GitHub (donde guardamos el codigo), Hetzner (donde funciona la app de clientes en crearack.com) y Holded (facturacion). Si alguno de estos servicios falla, este documento explica que hacer.
Lo mas importante
- La app de clientes (crearack.com) funciona en un servidor independiente. Si el workspace cae, los clientes NO se ven afectados.
- Holded (facturas, clientes, contabilidad) es independiente. Sigue funcionando siempre.
- Cada noche a las 00:00, un sistema automatico guarda una copia de seguridad de todos los datos del workspace (tareas, notas, noticias, informes).
- Cada domingo a las 03:00, esa copia se sube automaticamente a Google Drive como backup offsite.
- Hay una copia de emergencia de la web del workspace en un servidor alternativo, lista para activarse.
Que hago si workspace.crearack.com no funciona?
Paso 1 — Confirmar que no es tu conexion:
- Prueba a abrir otras webs (google.com). Si funcionan, el problema es del workspace.
- Comprueba el estado de Cloudflare: visita cloudflarestatus.com
Paso 2 — Avisar al equipo:
- Escribe al grupo de WhatsApp del equipo: “El workspace no funciona”
- Edu o Dani activaran el mirror de emergencia
Paso 3 — Activar el mirror (Edu o Dani):
- Ir a console.hetzner.cloud → Firewalls →
firewall-CreaRack - Inbound Rules → Add Rule → Protocol: TCP, Port: 8090, Source: Any IPv4 (o tu IP publica actual para mas seguridad)
- Pulsar Apply
Paso 4 — Acceder al mirror:
- Abrir en el navegador: http://178.104.131.173:8090
- Usuario: admindomo
- Contrasena: en la boveda del equipo (rotada el 02-07-2026 — NUNCA se escribe aqui; ver [[crearack-tech—guides—seguridad-y-backups]])
- Aqui puedes consultar toda la documentacion, guias y manuales
Paso 5 — Trabajar mientras tanto:
- Para tareas: usa las plantillas Excel que hay en la carpeta
emergency/office-templates/del repositorio (o pidelas a Edu/Dani por email) - Para comunicacion: email y WhatsApp
- Para facturas y clientes: Holded sigue funcionando normal
Paso 6 — Cuando todo vuelva a funcionar:
- Verificar que workspace.crearack.com carga
- Cerrar el mirror: console.hetzner.cloud → Firewalls →
firewall-CreaRack→ Eliminar regla TCP 8090 → Apply - Si creaste tareas en Excel durante la caida, pasarlas al workspace
Que hago si crearack.com (la app de clientes) no funciona?
Esto es mas critico. Avisar a Edu o Dani inmediatamente. Ellos tienen un procedimiento separado para restaurar el servidor. Mientras tanto:
- Comunicar a los clientes afectados via email o telefono
- El workspace (si funciona) sirve para coordinar la respuesta
Donde estan los backups?
| Que | Donde | Frecuencia |
|---|---|---|
| Datos del workspace (tareas, notas, informes, etc.) | Servidor staging (automatico) | Cada noche 00:00 |
| Datos del workspace (offsite) | Google Drive → CreaRackSL/backups/workspace/ | Cada domingo 03:00 |
| Datos del workspace (copia local) | Desde workspace.crearack.com/maintenance → “Descargar copia local” | Manual, cuando quieras |
| Codigo y documentacion | En el PC de cada dev (git) | Automatico cada 2h |
| Facturas y clientes | Holded (independiente) | Gestionado por Holded |
| Base de datos de la app | Servidor produccion (pg_dump diario) | Cada noche |
Pagina de mantenimiento
En workspace.crearack.com/maintenance puedes:
- Backup servidor: Ejecuta una copia de seguridad de los datos en el servidor de staging
- Descargar copia local: Descarga un archivo JSON con todos los datos a tu PC
- Refrescar: Actualiza el estado
- Ver el conteo de filas de cada tabla y el historial de backups
Seccion tecnica
A partir de aqui, informacion tecnica para Edu y Dani.
Inventario de dependencias
| Servicio | Que aporta | Criticidad | Alternativa offline |
|---|---|---|---|
| Cloudflare Pages | Workspace web (workspace.crearack.com) | ALTA | Mirror en staging / archivos locales |
| Cloudflare D1 | Tasks, notes, news, alerts, activity log | MEDIA | Backup JSON + plantillas CSV |
| GitHub | Repositorios de codigo + deploy trigger | ALTA | Git local (clones en cada PC) |
| Hetzner PROD | CreaRack Pro en produccion | CRITICA | No hay fallback (ver DR de CreaRack-Pro) |
| Hetzner STAGE | Testing + mirror workspace | BAJA | Solo se pierde el mirror |
| Holded | Facturacion, clientes, contabilidad | MEDIA | Plantilla CSV + ultima exportacion |
| Claude AI | Agentes IA, Claude Code | BAJA | Trabajo manual sin IA |
| Gmail/Calendar | Comunicacion, agenda | BAJA | Cualquier email/calendario alternativo |
Escenarios de fallo y respuesta
Escenario 1: Cloudflare Pages cae (GitHub OK)
Sintoma: workspace.crearack.com no carga, pero git push/pull funciona.
Impacto: Sin dashboard web, sin MCP tools, sin D1 (tasks/notes).
Acciones:
- Abrir puerto 8090 en Hetzner Firewall (ver seccion Mirror DR)
- Acceder al mirror:
http://178.104.131.173:8090- Usuario:
admindomo - Contrasena: en la boveda del equipo (ver [[crearack-tech—guides—seguridad-y-backups]])
- Usuario:
- Docs y guides accesibles en el mirror
- Para tareas: usar
emergency/office-templates/TASKS.csven Excel - Para worklog: editar
WORKLOG.mden git directamente - Comunicacion: email / WhatsApp del equipo
- Si el mirror no esta actualizado, ejecutar desde un PC con SSH:
.\scripts\deploy-staging-mirror.ps1
Recuperacion: Cuando CF vuelva, re-deploy automatico desde GitHub. Datos de D1 se restauran solos. Cerrar puerto 8090 en Hetzner Firewall.
Escenario 2: GitHub cae (Cloudflare OK)
Sintoma: No se puede push/pull, pero workspace.crearack.com funciona.
Impacto: No se puede desplegar codigo nuevo. Workspace funciona con ultima version.
Acciones:
- Seguir trabajando con git local — commits funcionan sin GitHub
- El workspace web sigue operativo (ultima version desplegada)
- Cuando GitHub vuelva:
git push origin mainsube todo lo acumulado - Si necesitas compartir codigo con Dani:
git bundle create crearack.bundle main→ enviar por email/USB
Recuperacion: git push cuando GitHub vuelva. Sin perdida de datos.
Escenario 3: Cloudflare + GitHub caen simultaneamente
Sintoma: Ni workspace ni git remoto funcionan.
Impacto: Sin web, sin deploy, sin MCP tools. Maximo impacto en herramientas.
Acciones:
- CreaRack Pro sigue funcionando — Hetzner es independiente
- Activar mirror en staging (ver seccion Mirror DR)
- Usar plantillas Office para operaciones diarias:
emergency/office-templates/TASKS.csv→ tareasemergency/office-templates/WORKLOG.csv→ registro de actividademergency/office-templates/CHECKLIST_DIARIO.csv→ rutina diaria
- Git local funciona para commits — no se pierde codigo
- Documentacion accesible en el clon local del repo (
src/content/wiki/) o en el mirror - Comunicacion por email / WhatsApp / telefono
Recuperacion: Cuando vuelvan los servicios:
git pull --rebase origin mainpara sincronizar- Verificar que CF Pages re-despliega
- Importar tareas/notas del CSV al workspace si se crearon offline
Escenario 4: Hetzner PROD cae
Sintoma: crearack.com no responde. Clientes sin acceso.
Impacto: CRITICO — la aplicacion principal esta caida.
Acciones: Ver [[crearack-tech—guides—disaster-recovery]] (la antigua Documentation/guides/DISASTER_RECOVERY.md del repo fue archivada en abril 2026).
Resumen rapido:
- Verificar estado en Hetzner Console (console.hetzner.cloud)
- Si es el servidor: crear nuevo CCX → restaurar backup
- Si es red: contactar soporte Hetzner
- Comunicar a clientes via Holded/email
- El workspace sigue operativo para coordinar la respuesta
Escenario 5: Todo cae (CF + GitHub + Hetzner)
Sintoma: Catastrofico. Ningun servicio cloud funciona.
Acciones:
- No perder la calma — los datos importantes estan en:
- Git local en el PC de cada dev (
C:\dev\CreaRack-Pro\yC:\dev\CreaRackSL-workspace\) - Backups D1 en el servidor staging
/opt/dr-backups/ - Holded tiene sus propios datos (independiente)
- Git local en el PC de cada dev (
- Abrir las plantillas CSV y operar manualmente
- Llamar/escribir al equipo por WhatsApp
- Esperar a que los servicios vuelvan — la mayoria tienen SLA de horas, no dias
- Cuando vuelva Hetzner primero: restaurar PROD desde backup
- Cuando vuelva GitHub: push todo lo local
- Cuando vuelva CF: verificar deploy automatico
Mirror DR en Staging
Acceso
| Dato | Valor |
|---|---|
| URL | http://178.104.131.173:8090 |
| Usuario | admindomo |
| Contrasena | En la boveda del equipo — rotada 02-07-2026 (rotacion: [[crearack-tech—guides—seguridad-y-backups]] §5) |
| Puerto | 8090 (cerrado por defecto en Hetzner Firewall) |
| Contenido | Site estatico: docs, guides, search, navegacion |
| No funciona | APIs dinamicas (tasks, notes, dashboard real-time) |
Desde s185, la plantilla nginx de
deploy-staging-mirror.ps1incluye el bloqueauth_basic— un redeploy del mirror ya NO borra la proteccion por contrasena.
Procedimiento: Abrir el mirror en emergencia
El puerto 8090 esta cerrado por defecto en el Hetzner Cloud Firewall. Para abrirlo:
- Ir a console.hetzner.cloud → Firewalls →
firewall-CreaRack - Inbound Rules → Add Rule:
- Protocol: TCP
- Port: 8090
- Source: Any IPv4 (o tu IP publica actual para mas seguridad)
- Apply
- Acceder a
http://178.104.131.173:8090— pedira usuario y contrasena
Procedimiento: Cerrar el mirror tras la emergencia
- Ir a console.hetzner.cloud → Firewalls →
firewall-CreaRack - Inbound Rules → Eliminar la regla TCP 8090
- Apply
Importante: Cerrar siempre el puerto cuando CF vuelva a estar operativo.
Sistema automatizado
Arquitectura
┌─────────────────────────┐ cron 00:00 ┌──────────────────┐
│ Cloudflare Pages │◄─────────────────── │ Hetzner STAGE │
│ /api/maintenance/* │ curl + Bearer │ /opt/dr-backups │
│ (D1 export endpoints) │───────────────────► │ 30 dias retenc. │
└─────────────────────────┘ JSON response └────────┬─────────┘
▲ │
│ manual (web) cron dom 03:00 (rclone)
┌─────────┴─────────────┐ │
│ workspace.crearack.com│ ┌────────▼─────────┐
│ /maintenance │ │ Google Drive │
│ Backup, Download, Logs│ │ CreaRackSL/ │
└────────────────────────┘ │ backups/workspace│
│ 30 backups ret. │
└──────────────────┘
Tablas respaldadas (6)
| Tabla | Contenido | Limite |
|---|---|---|
| tasks | Tareas del equipo | Todas |
| news | Noticias y comunicaciones | Todas |
| notes | Notas rapidas | Todas |
| alerts | Alertas del sistema | Todas |
| reports | Informes generados (FinOps, Performance) | Todos |
| activity_log | Registro de actividad (auditoria) | Ultimos 5000 |
NO se respaldan (regenerables): tablas de Biblioteca (bib_nodes, bib_edges, bib_chunks), auth_codes (transitorios).
API Endpoints
| Endpoint | Metodo | Descripcion | Auth |
|---|---|---|---|
/api/maintenance/export | POST | Exporta todas las tablas D1 a JSON | Publico (CF Access protege el site) |
/api/maintenance/status | GET | Row counts, ultimo backup, log de exports | Publico (CF Access protege el site) |
Nota: Estos endpoints son publicos a nivel de middleware porque el bypass de CF Access (necesario para el cron) elimina el JWT del browser. La seguridad la proporciona CF Access a nivel de site — sin login no se accede a ninguna pagina.
Pagina web
workspace.crearack.com/maintenance:
- Backup servidor — Ejecuta export de D1 y lo registra en el log de actividad
- Descargar copia local — Ejecuta export y descarga el JSON al PC
- Refrescar — Actualiza el panel de estado
- Panel con conteo de filas por tabla
- Historial de los ultimos 10 exports
Cron nocturno — Export D1 (Hetzner Staging)
| Parametro | Valor |
|---|---|
| Horario | Cada dia a las 00:00 UTC |
| Script | /opt/dr-backups/cron-dr-backup.sh |
| Token | /opt/dr-backups/.token (Bearer token, chmod 600) |
| CF Access | /opt/dr-backups/.cf-access (Service Token, chmod 600) — añadido s60 13-05-2026 tras incidente HTTP 302 |
| Retencion | 30 backups (1 mes) |
| Log | /opt/dr-backups/cron.log |
s60 13-05-2026 — Tras la migración a CF Access Service Token (s57) y el cierre del bypass
everyone(d20 s58), los crons de STAGE empezaron a recibir HTTP 302 al llamar/api/maintenance/*. Fix: añadir headersCF-Access-Client-Id+CF-Access-Client-Secreten los scripts y leerlos de/opt/dr-backups/.cf-access(chmod 600). Mismo patrón que el resto de callers post-s57. Afecta acron-dr-backup.shycron-stale-check.sh.cron-gdrive-sync.shno se ve afectado (solo usa rclone).
Cron semanal — Google Drive offsite (Hetzner Staging)
| Parametro | Valor |
|---|---|
| Horario | Cada domingo a las 03:00 UTC |
| Script | /opt/dr-backups/cron-gdrive-sync.sh |
| Herramienta | rclone v1.60+ con remote gdrive configurado |
| Destino | gdrive:CreaRackSL/backups/workspace/ |
| Retencion | 30 backups mas recientes |
| Log | /opt/dr-backups/cron.log |
Forzar sync a Google Drive manualmente:
ssh root@178.104.131.173 "/opt/dr-backups/cron-gdrive-sync.sh"
Verificar backups en Drive desde Hetzner:
ssh root@178.104.131.173 "rclone ls gdrive:CreaRackSL/backups/workspace/"
Crontab completo en Hetzner Staging
0 0 * * * /opt/dr-backups/cron-dr-backup.sh >> /opt/dr-backups/cron.log 2>&1
0 3 * * 0 /opt/dr-backups/cron-gdrive-sync.sh >> /opt/dr-backups/cron.log 2>&1
Reinstalacion (solo si se pierde)
# Export D1 diario
scp scripts/cron-dr-backup.sh root@178.104.131.173:/opt/dr-backups/
ssh root@178.104.131.173 "chmod +x /opt/dr-backups/cron-dr-backup.sh"
ssh root@178.104.131.173 "echo 'TOKEN' > /opt/dr-backups/.token && chmod 600 /opt/dr-backups/.token"
# Sync Google Drive semanal
scp scripts/cron-gdrive-sync.sh root@178.104.131.173:/opt/dr-backups/
ssh root@178.104.131.173 "chmod +x /opt/dr-backups/cron-gdrive-sync.sh"
# Reinstalar rclone + remote (si se pierde)
ssh root@178.104.131.173 "apt install rclone"
# En tu PC: rclone authorize "drive" → copiar token
# En Hetzner: rclone config → crear remote "gdrive" con el token
# Crontab
ssh root@178.104.131.173 "crontab -e"
# Añadir las 2 lineas del crontab de arriba
Herramientas locales (complementarias)
| Herramienta | Que hace |
|---|---|
dr.bat | Lanzador Windows con menu interactivo |
scripts/export-d1.ps1 | Export via wrangler (requiere auth local) |
scripts/deploy-staging-mirror.ps1 | Deploy del sitio estatico al staging |
scripts/rclone-gdrive-backup.ps1 | Export D1 + upload a Google Drive desde Windows |
Medidas preventivas (rutina)
Diario (automatizado)
- Cron en Hetzner Staging a las 00:00 — export D1 (6 tablas) a
/opt/dr-backups/ - Verificar en
/maintenanceque el ultimo export es reciente
Semanal (automatizado)
- Cron en Hetzner Staging domingos 03:00 — sync backups a Google Drive via rclone
- Verificar en Google Drive → CreaRackSL/backups/workspace/ que hay backups recientes
- Forzar sync manual si es necesario:
ssh root@178.104.131.173 "/opt/dr-backups/cron-gdrive-sync.sh"
Mensual
- Desplegar mirror a staging:
scripts/deploy-staging-mirror.ps1 - Verificar que el mirror funciona:
http://178.104.131.173:8090 - Revisar y actualizar
SECRETS_VAULT.md(guardado fuera de git) - Verificar que los clones locales de ambos repos estan actualizados
Tras cambios importantes
- Export D1 inmediato si se crearon muchas tareas/notas
- Re-deploy mirror si cambio la estructura del sitio
Contactos de emergencia
| Servicio | Soporte | Tiempo respuesta |
|---|---|---|
| Hetzner | console.hetzner.cloud → Support | ~1h (Cloud) |
| Cloudflare | cloudflarestatus.com / dash.cloudflare.com | Status page |
| GitHub | githubstatus.com | Status page |
| Holded | soporte@holded.com | ~24h |
Estructura de archivos
src/content/wiki/
└── workspace--guias--disaster-recovery-workspace.md ← Este documento
emergency/
├── SECRETS_VAULT.md ← Plantilla de secrets (rellenar offline)
├── backups/ ← Exports de D1 locales (via export-d1.ps1)
└── office-templates/ ← Plantillas para operaciones manuales
├── TASKS.csv
├── WORKLOG.csv
├── CONTACTS_CLIENTS.csv
└── CHECKLIST_DIARIO.csv
/opt/dr-backups/ (en Hetzner Staging)
├── cron-dr-backup.sh ← Script del cron diario (export D1)
├── cron-gdrive-sync.sh ← Script del cron semanal (sync a Google Drive)
├── .token ← Bearer token (chmod 600)
├── cron.log ← Log de ambos crons
└── backup-2026-04-15.json ← Backups diarios (30 dias)
Google Drive (offsite)
└── CreaRackSL/backups/workspace/
├── backup-2026-04-15.json ← Copia semanal automatica
├── backup-2026-04-14.json
└── ... (30 backups max)
Que NO se puede recuperar sin backup
| Dato | Riesgo | Mitigacion |
|---|---|---|
| D1: tasks, notes, news, alerts, reports | MUY BAJO | Cron nocturno Hetzner + sync semanal Google Drive + export manual |
| Cloudflare secrets (7 API keys) | ALTO si no documentados | Rellenar SECRETS_VAULT.md y guardar offline |
| Activity log (auditoria) | MEDIO | Ultimos 5000 registros respaldados, historial anterior se pierde |
| Biblioteca (knowledge graph) | BAJO | Regenerable con bib_full_reindex (horas, no dias) |
| OAuth auth_codes | NINGUNO | Son transitorios, se regeneran solos |
Véase también
- [[crearack-tech—guides—seguridad-y-backups]] — manual de seguridad y backups (fuente única; incluye la rotación del mirror)
- [[runbook—infra—rotate-mcp-token]] — rotar token MCP
- [[workspace-tech—tecnico—workspace-technical]] — stack técnico
- [[workspace—que-es-workspace]] — qué es Workspace
- [[crearack-tech—guides—disaster-recovery]] — DR general CreaRack
- [[workspace—guias—workspace-user-guide]] — guía usuario
- [[workspace-tech—tecnico—security-audit-11-04-2026]] — security audit