Runbook: Disaster Recovery
Overview
Section titled “Overview”Propósito: Recuperación del sistema ante fallas catastróficas (pérdida de servidor, corrupción masiva, etc.)
RTO (Recovery Time Objective): 4 horas
RPO (Recovery Point Objective): 24 horas (último backup diario)
Criticidad: 🔴 CRÍTICA - Solo ejecutar en caso de disaster real
Tipos de Desastres
Section titled “Tipos de Desastres”| Nivel | Escenario | Acción |
|---|---|---|
| L1 | Servicio caído (Orchestrator/Sevastopol) | Reiniciar servicio |
| L2 | Corrupción de datos de un tenant | Restore per-schema |
| L3 | Pérdida de base de datos completa | Full database restore |
| L4 | Pérdida de servidor completo | Provisionar nuevo servidor + restore |
L1: Servicio Caído
Section titled “L1: Servicio Caído”Cuando un servicio individual no responde pero el servidor está accesible.
-
Verificar estado del servicio
Terminal window pm2 status -
Revisar logs de errores
Terminal window pm2 logs orchestrator --err --lines 100 -
Reiniciar servicio
Terminal window pm2 restart orchestrator -
Verificar recuperación
Terminal window curl http://localhost:8000/health
Si el reinicio falla repetidamente, escalar a L4.
L2: Corrupción de Tenant Individual
Section titled “L2: Corrupción de Tenant Individual”Cuando los datos de un solo tenant están corruptos pero el resto del sistema funciona.
-
Identificar tenant afectado
SELECT schema_name, last_access, error_countFROM central.tenant_healthWHERE status = 'corrupted'; -
Desactivar tenant temporalmente
UPDATE central.tenantsSET active = falseWHERE id = '<TENANT_ID>'; -
Localizar backup del schema
Terminal window ls -lht /opt/backups/schemas/ | grep tenant_<ID> -
Restaurar schema individual
Terminal window sudo -u postgres psql -d nostromo -c "DROP SCHEMA tenant_<ID> CASCADE;"gunzip -c /opt/backups/schemas/tenant_<ID>_<DATE>.sql.gz | sudo -u postgres pg_restore -d nostromo -
Reactivar tenant
UPDATE central.tenantsSET active = trueWHERE id = '<TENANT_ID>'; -
Verificar integridad
SELECT COUNT(*) FROM tenant_<ID>.employees;SELECT COUNT(*) FROM tenant_<ID>.contracts;
L3: Pérdida de Base de Datos Completa
Section titled “L3: Pérdida de Base de Datos Completa”Cuando se pierde acceso a toda la base de datos PostgreSQL.
-
Detener todos los servicios
Terminal window pm2 stop all -
Verificar estado de PostgreSQL
Terminal window sudo systemctl status postgresqlpg_isready -
Si PostgreSQL corrupto, recrear cluster
Terminal window sudo systemctl stop postgresqlsudo rm -rf /var/lib/postgresql/16/main/*sudo -u postgres /usr/lib/postgresql/16/bin/initdb -D /var/lib/postgresql/16/mainsudo systemctl start postgresql -
Localizar último backup válido
Terminal window ls -lht /opt/backups/ | head -20gunzip -t /opt/backups/<LATEST>/backup_<DATE>.sql.gz -
Restaurar desde backup
Terminal window gunzip -c /opt/backups/<LATEST>/backup_<DATE>.sql.gz | sudo -u postgres psql -
Verificar restauración
\dnSELECT COUNT(*) FROM central.tenants;SELECT COUNT(*) FROM central.users; -
Reiniciar servicios
Terminal window pm2 start all -
Validar sistema completo
Terminal window curl http://localhost:8000/healthcurl http://localhost:4321/
L4: Pérdida de Servidor Completo
Section titled “L4: Pérdida de Servidor Completo”Cuando el servidor físico/VM se pierde completamente.
-
Provisionar nuevo servidor
- Mínimo: 4 vCPU, 8GB RAM, 100GB SSD
- OS: Ubuntu 22.04 LTS o Debian 12
- Acceso SSH configurado
-
Instalar dependencias base
Terminal window sudo apt update && sudo apt upgrade -ysudo apt install -y postgresql-16 nodejs npm nginx certbot -
Configurar PostgreSQL
Terminal window sudo -u postgres createuser nostromo_usersudo -u postgres createdb nostromo -
Descargar backup desde storage remoto
Terminal window mkdir -p /opt/backupsaws s3 cp s3://nostromo-backups/postgres/backup_<LATEST>.sql.gz /opt/backups/ -
Restaurar base de datos
Terminal window gunzip -c /opt/backups/backup_<LATEST>.sql.gz | sudo -u postgres psql -
Clonar repositorios
Terminal window cd /opt/nostromo -
Configurar variables de entorno
Terminal window cp .env.production.example .env.productionnano .env.production -
Instalar dependencias y build
Terminal window cd /opt/nostromo/orchestrator && npm ci && npm run buildcd /opt/nostromo/sevastopol && npm ci && npm run build -
Configurar PM2
Terminal window pm2 start dist/server.js --name orchestratorpm2 start "npm run preview" --name sevastopol --cwd /opt/nostromo/sevastopolpm2 save -
Configurar Nginx y SSL
Terminal window sudo certbot --nginx -d app.nostromo.cl -
Actualizar DNS
Actualizar registros A en Cloudflare para apuntar a nueva IP.
-
Validar sistema completo
Terminal window curl https://app.nostromo.cl/health
Comunicación Durante Disaster
Section titled “Comunicación Durante Disaster”Notificación Inicial (T+0)
Section titled “Notificación Inicial (T+0)”URGENTE: Sistema Nostromo - Incidente en Progreso
Tipo: [L1/L2/L3/L4]Inicio: [HORA]Impacto estimado: [DESCRIPCION]ETA de resolución: [HORA]
Siguiente actualización: [HORA]Actualizaciones (cada 30 min)
Section titled “Actualizaciones (cada 30 min)”UPDATE: Sistema Nostromo - En Recuperación
Estado: [EN PROGRESO/RESUELTO]Avance: [PASO ACTUAL]Nuevo ETA: [HORA]Cierre de Incidente
Section titled “Cierre de Incidente”RESUELTO: Sistema Nostromo - Servicio Restaurado
Duración total: [X horas]Datos perdidos: [Ninguno / X horas de transacciones]Acciones preventivas: [PENDIENTE POST-MORTEM]Post-Mortem
Section titled “Post-Mortem”Después de todo disaster, crear documento post-mortem:
# Post-Mortem: [FECHA] [TIPO]
## Timeline
- HH:MM - Detección- HH:MM - Inicio respuesta- HH:MM - Resolución
## Root Cause
[Descripción técnica de la causa raíz]
## Impacto
- Usuarios afectados: X- Downtime total: X horas- Datos perdidos: [Ninguno / Descripción]
## Acciones Correctivas
1. [Acción inmediata]2. [Mejora a mediano plazo]3. [Mejora estructural]Checklist de Prevención
Section titled “Checklist de Prevención”- Backups diarios ejecutándose (verificar logs)
- Backups remotos sincronizados (S3/Azure)
- Test de restore mensual completado
- Documentación de recovery actualizada
- Contactos de emergencia disponibles
- Credenciales de cloud storage accesibles
Related Documentation
Section titled “Related Documentation”- Runbook: Backup - Procedimientos de backup
- Runbook: Deploy - Procedimiento de deploy estándar
- Infrastructure: Networking - Topología de red
- Infrastructure: Docker - Configuración de containers
Changelog
Section titled “Changelog”| Fecha | Version | Cambios |
|---|---|---|
| 2026-01-18 | 1.0 | Runbook inicial creado |