CreaRack-SL

Disaster Recovery — CreaRackSL Workspace

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):

  1. Ir a console.hetzner.cloud → Firewalls → firewall-CreaRack
  2. Inbound Rules → Add Rule → Protocol: TCP, Port: 8090, Source: Any IPv4 (o tu IP publica actual para mas seguridad)
  3. 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:

  1. Verificar que workspace.crearack.com carga
  2. Cerrar el mirror: console.hetzner.cloud → Firewalls → firewall-CreaRack → Eliminar regla TCP 8090 → Apply
  3. 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?

QueDondeFrecuencia
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 documentacionEn el PC de cada dev (git)Automatico cada 2h
Facturas y clientesHolded (independiente)Gestionado por Holded
Base de datos de la appServidor 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

ServicioQue aportaCriticidadAlternativa offline
Cloudflare PagesWorkspace web (workspace.crearack.com)ALTAMirror en staging / archivos locales
Cloudflare D1Tasks, notes, news, alerts, activity logMEDIABackup JSON + plantillas CSV
GitHubRepositorios de codigo + deploy triggerALTAGit local (clones en cada PC)
Hetzner PRODCreaRack Pro en produccionCRITICANo hay fallback (ver DR de CreaRack-Pro)
Hetzner STAGETesting + mirror workspaceBAJASolo se pierde el mirror
HoldedFacturacion, clientes, contabilidadMEDIAPlantilla CSV + ultima exportacion
Claude AIAgentes IA, Claude CodeBAJATrabajo manual sin IA
Gmail/CalendarComunicacion, agendaBAJACualquier 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:

  1. Abrir puerto 8090 en Hetzner Firewall (ver seccion Mirror DR)
  2. Acceder al mirror: http://178.104.131.173:8090
    • Usuario: admindomo
    • Contrasena: en la boveda del equipo (ver [[crearack-tech—guides—seguridad-y-backups]])
  3. Docs y guides accesibles en el mirror
  4. Para tareas: usar emergency/office-templates/TASKS.csv en Excel
  5. Para worklog: editar WORKLOG.md en git directamente
  6. Comunicacion: email / WhatsApp del equipo
  7. 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:

  1. Seguir trabajando con git local — commits funcionan sin GitHub
  2. El workspace web sigue operativo (ultima version desplegada)
  3. Cuando GitHub vuelva: git push origin main sube todo lo acumulado
  4. 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:

  1. CreaRack Pro sigue funcionando — Hetzner es independiente
  2. Activar mirror en staging (ver seccion Mirror DR)
  3. Usar plantillas Office para operaciones diarias:
    • emergency/office-templates/TASKS.csv → tareas
    • emergency/office-templates/WORKLOG.csv → registro de actividad
    • emergency/office-templates/CHECKLIST_DIARIO.csv → rutina diaria
  4. Git local funciona para commits — no se pierde codigo
  5. Documentacion accesible en el clon local del repo (src/content/wiki/) o en el mirror
  6. Comunicacion por email / WhatsApp / telefono

Recuperacion: Cuando vuelvan los servicios:

  1. git pull --rebase origin main para sincronizar
  2. Verificar que CF Pages re-despliega
  3. 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:

  1. Verificar estado en Hetzner Console (console.hetzner.cloud)
  2. Si es el servidor: crear nuevo CCX → restaurar backup
  3. Si es red: contactar soporte Hetzner
  4. Comunicar a clientes via Holded/email
  5. El workspace sigue operativo para coordinar la respuesta

Escenario 5: Todo cae (CF + GitHub + Hetzner)

Sintoma: Catastrofico. Ningun servicio cloud funciona.

Acciones:

  1. No perder la calma — los datos importantes estan en:
    • Git local en el PC de cada dev (C:\dev\CreaRack-Pro\ y C:\dev\CreaRackSL-workspace\)
    • Backups D1 en el servidor staging /opt/dr-backups/
    • Holded tiene sus propios datos (independiente)
  2. Abrir las plantillas CSV y operar manualmente
  3. Llamar/escribir al equipo por WhatsApp
  4. Esperar a que los servicios vuelvan — la mayoria tienen SLA de horas, no dias
  5. Cuando vuelva Hetzner primero: restaurar PROD desde backup
  6. Cuando vuelva GitHub: push todo lo local
  7. Cuando vuelva CF: verificar deploy automatico

Mirror DR en Staging

Acceso

DatoValor
URLhttp://178.104.131.173:8090
Usuarioadmindomo
ContrasenaEn la boveda del equipo — rotada 02-07-2026 (rotacion: [[crearack-tech—guides—seguridad-y-backups]] §5)
Puerto8090 (cerrado por defecto en Hetzner Firewall)
ContenidoSite estatico: docs, guides, search, navegacion
No funcionaAPIs dinamicas (tasks, notes, dashboard real-time)

Desde s185, la plantilla nginx de deploy-staging-mirror.ps1 incluye el bloque auth_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:

  1. Ir a console.hetzner.cloud → Firewalls → firewall-CreaRack
  2. Inbound Rules → Add Rule:
    • Protocol: TCP
    • Port: 8090
    • Source: Any IPv4 (o tu IP publica actual para mas seguridad)
  3. Apply
  4. Acceder a http://178.104.131.173:8090 — pedira usuario y contrasena

Procedimiento: Cerrar el mirror tras la emergencia

  1. Ir a console.hetzner.cloud → Firewalls → firewall-CreaRack
  2. Inbound Rules → Eliminar la regla TCP 8090
  3. 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)

TablaContenidoLimite
tasksTareas del equipoTodas
newsNoticias y comunicacionesTodas
notesNotas rapidasTodas
alertsAlertas del sistemaTodas
reportsInformes generados (FinOps, Performance)Todos
activity_logRegistro de actividad (auditoria)Ultimos 5000

NO se respaldan (regenerables): tablas de Biblioteca (bib_nodes, bib_edges, bib_chunks), auth_codes (transitorios).

API Endpoints

EndpointMetodoDescripcionAuth
/api/maintenance/exportPOSTExporta todas las tablas D1 a JSONPublico (CF Access protege el site)
/api/maintenance/statusGETRow counts, ultimo backup, log de exportsPublico (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)

ParametroValor
HorarioCada 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
Retencion30 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 headers CF-Access-Client-Id + CF-Access-Client-Secret en los scripts y leerlos de /opt/dr-backups/.cf-access (chmod 600). Mismo patrón que el resto de callers post-s57. Afecta a cron-dr-backup.sh y cron-stale-check.sh. cron-gdrive-sync.sh no se ve afectado (solo usa rclone).

Cron semanal — Google Drive offsite (Hetzner Staging)

ParametroValor
HorarioCada domingo a las 03:00 UTC
Script/opt/dr-backups/cron-gdrive-sync.sh
Herramientarclone v1.60+ con remote gdrive configurado
Destinogdrive:CreaRackSL/backups/workspace/
Retencion30 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)

HerramientaQue hace
dr.batLanzador Windows con menu interactivo
scripts/export-d1.ps1Export via wrangler (requiere auth local)
scripts/deploy-staging-mirror.ps1Deploy del sitio estatico al staging
scripts/rclone-gdrive-backup.ps1Export 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 /maintenance que 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

ServicioSoporteTiempo respuesta
Hetznerconsole.hetzner.cloud → Support~1h (Cloud)
Cloudflarecloudflarestatus.com / dash.cloudflare.comStatus page
GitHubgithubstatus.comStatus page
Holdedsoporte@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

DatoRiesgoMitigacion
D1: tasks, notes, news, alerts, reportsMUY BAJOCron nocturno Hetzner + sync semanal Google Drive + export manual
Cloudflare secrets (7 API keys)ALTO si no documentadosRellenar SECRETS_VAULT.md y guardar offline
Activity log (auditoria)MEDIOUltimos 5000 registros respaldados, historial anterior se pierde
Biblioteca (knowledge graph)BAJORegenerable con bib_full_reindex (horas, no dias)
OAuth auth_codesNINGUNOSon 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