CreaRack-SL

Auditoría de Robustez Infraestructural — CreaRack Pro SaaS

Auditoría de Robustez Infraestructural — CreaRack Pro SaaS

Fecha: 04-04-2026 Contexto: Evaluación post-incidentes durante sesión de hardening Objetivo: Determinar si la infraestructura actual es suficientemente robusta para producción pública Audiencia: Equipo CreaRack (Edu, Dani, Txell)


Resumen Ejecutivo

Veredicto: La infraestructura actual NO está lista para producción pública con clientes reales.

La capa de aplicación (Django, APIs, seguridad, auth) es sólida y madura. Pero la capa de infraestructura y despliegue tiene fragilidades críticas que se evidenciaron durante la sesión del 04-04-2026. El sistema funciona para uso interno/demo, pero carece de la resiliencia necesaria para garantizar SLA a clientes.


1. Lecciones Aprendidas (04-04-2026)

Incidentes del día (en orden cronológico)

#IncidenteCausa raízTiempo caídoSeveridad
1PG 16→18: contenedor con nombre incorrectodocker compose usa directorio como project name, no el de Dokploy2 minBajo
2pgbouncer en prod: web no resuelve DNSDokploy crea containers en dokploy-network, aislada de crearack_internal donde vive pgbouncer~15 minAlto
3docker swarm leave: Dokploy destruidoDokploy corre como servicio Swarm — sin Swarm, desaparece~30 minCrítico
4Eliminar ports: 8000: sitio caídoDokploy/Traefik necesita el port mapping para enrutar tráfico al container~10 minAlto
5Traefik 404 persistenteTraefik cacheó error de Swarm; necesitó recreación completa + redeploy Dokploy~15 minAlto
6Dokploy DB password mismatchReinstalación generó nuevo Docker secret pero PG conservó password viejo5 minMedio

Patrones problemáticos identificados

1. No existe entorno de staging Todos los cambios de infraestructura van directamente a producción. No hay forma de probar un cambio de compose, una migración de DB, o un nuevo servicio sin afectar al sistema en vivo.

2. Dokploy es una caja negra No comprendemos completamente cómo Dokploy gestiona:

  • Redes Docker (crea dokploy-network separada)
  • Labels de Traefik (los inyecta en el deploy, no están en el compose)
  • Dependencia con Docker Swarm (servicio Swarm, no container standalone)
  • Interacción con docker compose up manual (conflictos de red/labels)

3. docker compose up manual vs Dokploy son incompatibles Ejecutar docker compose -p crearack-pro-zcmvsl up -d desde SSH crea containers sin los labels de Traefik que Dokploy inyecta. Resultado: el container existe pero Traefik no lo ve → 404.

4. Sin rollback automatizado Cuando algo falla, el rollback es manual: editar compose, re-subir, redesplegar. No hay “revert to last working state” con un click.

5. Las reglas iptables son frágiles Docker puede resetear la cadena DOCKER-USER en reinicios. netfilter-persistent ayuda pero no es 100% fiable con Docker. Cualquier docker restart puede perder reglas.


2. Auditoría de Tecnologías del Stack SaaS

2.1 Dokploy (Plataforma de Despliegue)

AspectoEstadoRiesgo
Versiónv0.28.8Proyecto relativamente joven (< 2 años)
DependenciaDocker Swarm obligatorioNo se puede eliminar Swarm
NetworkingRed propia dokploy-networkServicios adicionales (pgbouncer) no son accesibles
RollbackManual (redeploy versión anterior)Sin rollback automático
BackupsTiene su propia PG + RedisSe pierden si Swarm se destruye
MonitoreoSin alertas de saludSi Dokploy cae, nadie se entera
HASingle instanceSi el servidor cae, todo cae

Evaluación: Dokploy simplifica el deploy pero añade complejidad oculta. Para un SaaS público, considerar migrar a una plataforma más madura (Coolify, CapRover) o gestionar Traefik+Docker directamente sin intermediario.

Recomendación: A corto plazo, documentar exactamente cómo Dokploy gestiona redes y labels. A medio plazo, evaluar alternativas.

2.2 Docker Swarm (Orquestación)

AspectoEstadoRiesgo
Uso realSolo para DokployOverhead innecesario
NodosSingle nodeNo aporta HA
AutolockDeshabilitadoEncryption keys no protegidas en restart
Puertos expuestos2377, 7946Superficie de ataque innecesaria

Evaluación: Swarm está forzado por Dokploy, no por necesidad real. Un single-node Swarm no aporta resiliencia. Añade complejidad (services vs containers, secrets vs env vars, redes overlay).

Recomendación: Aceptar como dependencia de Dokploy. No tocar. Si se migra de Dokploy, eliminar Swarm.

2.3 Traefik (Reverse Proxy / SSL)

AspectoEstadoRiesgo
Versiónv3.6.7Actual ✅
SSLLet’s Encrypt ACME httpChallengeFuncional, auto-renewal
Email ACMEinfo@crearack.com (corregido hoy)Recibirá alertas de expiración ✅
RoutingVia Docker labels (Dokploy los gestiona)Opaco — no controlamos los labels directamente
Config/etc/dokploy/traefik/Separada del repo — cambios manuales en servidor
Fallback404 si no encuentra rutaSin página de error personalizada
WAFNoSin protección contra ataques L7

Evaluación: Traefik funciona bien como reverse proxy pero la gestión via Dokploy lo hace opaco. Los labels se inyectan en deploy time y no son visibles en el compose.

Recomendación: Documentar la configuración de Traefik. Considerar añadir Traefik middlewares para rate limiting a nivel proxy (independiente de Django).

2.4 PostgreSQL 18 (Base de Datos)

AspectoEstadoRiesgo
Versión18.3 (migrado hoy)Última estable ✅
max_connections500Suficiente sin pgbouncer
Backupspg_dump diario (Huey task 3:30 AM) + verificación ZIP✅
RLS34 policies activas✅ Multi-tenancy
pg_stat_statementsActivado✅ Slow query tracking
Connection monitoringHuey task cada 5 min, alerta 80%✅
ReplicaciónNo⚠️ Single point of failure
Point-in-time recoveryNo (solo pg_dump diarios)⚠️ Hasta 24h de pérdida
pgbouncerNo (incompatible con Dokploy networking)⚠️ Sin connection pooling
VolumenDocker named volume en host⚠️ Si disco falla, datos perdidos

Evaluación: La DB es sólida funcionalmente pero tiene un SPOF crítico. Sin replicación, sin PITR, sin backups offsite. Un fallo de disco = pérdida total.

Recomendación:

  • Inmediato: Copiar backups diarios a almacenamiento externo (Hetzner Object Storage, ~€5/mes)
  • Medio plazo: Habilitar WAL archiving para PITR (minutos de pérdida vs horas)
  • Largo plazo: Read replica para HA

2.5 Valkey / Redis (Cache + Broker)

AspectoEstadoRiesgo
Versión7.2✅
PersistenciaAOF habilitado✅
PasswordConfigurado via env var✅
ExposiciónSolo red interna Docker✅
HASingle instance⚠️ Si cae, rate limiting falla (fail-open)
Maxmemory512MB + allkeys-lru✅

Evaluación: Adecuado para el volumen actual. El fail-open del rate limiter es aceptable.

2.6 VictoriaMetrics (Time-Series)

AspectoEstadoRiesgo
Versiónv1.106.1✅
Retención180 días✅
ExposiciónSolo red interna Docker✅
BackupsNo⚠️ Métricas históricas se pierden si volumen falla
HASingle instance⚠️

Evaluación: Funcional para monitoreo. No es crítico para el negocio (métricas se pueden repoblar desde dispositivos).

2.7 Daphne (Servidor ASGI)

AspectoEstadoRiesgo
Versión4.2.1✅
WebSocketsFuncional✅
WorkersSingle process⚠️ No escala horizontalmente
Graceful shutdown30s stop_grace_period✅
Server headerOculto (middleware)✅

Evaluación: Daphne es estable pero single-process. Para escalar, considerar múltiples réplicas detrás de Traefik (requiere session affinity para WebSockets).

2.8 Hetzner Cloud (Hosting)

AspectoEstadoRiesgo
TipoCCX (dedicated vCPU)✅ Rendimiento consistente
DatacenterEU (Alemania)✅ GDPR compliance
FirewallHetzner Cloud Firewall activo✅
Backups servidorNo configurados⚠️
SnapshotsNo programados⚠️
FailoverNo (single server)⚠️ SPOF

Evaluación: Hetzner es fiable y económico. Pero estamos en un solo servidor sin failover ni snapshots automáticos.

Recomendación: Activar snapshots semanales de Hetzner (~€2/mes por 20GB). Proporciona rollback completo del servidor.

2.9 iptables / Firewall Host

AspectoEstadoRiesgo
UFWInactivo⚠️
iptables DOCKER-USER5 reglas (8000 block, 3000 restrict)✅
Persistencianetfilter-persistent instalado⚠️ Docker puede resetear en restart
Hetzner Cloud FirewallActivo, 5 reglas✅

Evaluación: Doble capa funcional pero frágil. Las reglas iptables pueden perderse con reinicios de Docker.

Recomendación: Crear script /root/restore-firewall.sh que se ejecute en boot como systemd service, independiente de netfilter-persistent.


3. Matriz de Single Points of Failure (SPOF)

ComponenteSPOFImpacto si fallaMitigación actualMitigación recomendada
Servidor Hetzner✅ SíTodo caídoNingunaSnapshot semanal + plan DR
PostgreSQL✅ SíApp inutilizablepg_dump diarioBackup offsite + WAL archiving
Disco/Volumen✅ SíPérdida total datospg_dump en mismo discoBackup en Object Storage externo
Dokploy✅ SíNo se puede desplegarRedeploy manual via SSHDocumentar deploy manual sin Dokploy
Traefik✅ SíSin HTTPS ni routingdocker startAuto-restart (unless-stopped) ✅
Valkey✅ SíRate limit off, Huey paradoAOF persistenciaAceptable (fail-open)
DNS (Cloudflare)❌ No—Cloudflare HA global✅ Ya mitigado

4. Comparativa: Estado Actual vs Producción Pública

RequisitoEstado actualNecesario para SaaS público
Uptime SLA 99.9%❌ No garantizado✅ Sí
Backup offsite❌ Solo local✅ Sí
Disaster recovery plan❌ No existe✅ Sí
Staging environment❌ No existe✅ Sí
Monitoring/alertas⚠️ Parcial (Huey tasks)✅ Alertas externas (email/Slack)
Rollback automatizado❌ Manual✅ Sí
Escalado horizontal❌ Single instance⚠️ Deseable
Connection pooling❌ Revertido⚠️ Deseable
WAF❌ No⚠️ Deseable
Log aggregation❌ Solo docker logs⚠️ Deseable
SSL monitoring❌ Solo ACME auto-renew✅ Alertas de expiración
Load testing❌ Nunca realizado✅ Sí

5. Plan de Fortalecimiento (Priorizado)

Fase 1 — Fundamentos (1-2 semanas)

#AcciónEsfuerzoImpacto
1Backup offsite: pg_dump diario → Hetzner Object Storage4hCrítico
2Snapshots Hetzner: Activar snapshots semanales del servidor10 minCrítico
3Disaster Recovery doc: Procedimiento paso a paso para restaurar desde cero4hCrítico
4Script firewall boot: systemd service que restaura iptables en cada boot1hAlto
5Dokploy doc interna: Documentar exactamente cómo gestiona redes, labels, Swarm2hAlto

Fase 2 — Observabilidad (2-4 semanas)

#AcciónEsfuerzoImpacto
6Uptime monitoring externo: Servicio externo (UptimeRobot, Betterstack) que alerte si crearack.com cae30 minCrítico
7Alertas email para backups: Notificación si backup falla o DB connections > 80%2hAlto
8SSL expiry alert: Monitor externo que alerte 30 días antes de expiración30 minMedio

Fase 3 — Resiliencia (1-2 meses)

#AcciónEsfuerzoImpacto
9Staging environment: Segundo servidor Hetzner (CX21, ~€6/mes) con Dokploy clone1 díaAlto
10WAL archiving: Point-in-time recovery para PostgreSQL4hAlto
11Load testing: Pruebas con k6/locust para determinar capacidad real1 díaMedio
12pgbouncer via Dokploy: Configurar pgbouncer como servicio gestionado por Dokploy4hMedio

Fase 4 — Escala (cuando haya clientes)

#AcciónEsfuerzoImpacto
13Read replica PostgreSQL: HA para base de datos1 díaAlto
14Múltiples workers Daphne: Escalar horizontalmente detrás de Traefik4hMedio
15CDN para static/media: Cloudflare o Hetzner CDN4hMedio
16Log aggregation: Loki o similar para centralizar logs1 díaMedio

6. Conclusión

La plataforma CreaRack Pro tiene una capa de aplicación madura y bien protegida (509 endpoints, RLS, CSP, rate limiting, CSRF, MFA). El código es sólido.

La capa de infraestructura es funcional pero frágil. Los incidentes del 04-04-2026 demostraron que:

  1. Un solo error de infraestructura puede tumbar el sistema — sin staging, cada cambio es un riesgo directo
  2. Dokploy simplifica pero oscurece — la interacción entre Dokploy, Swarm, Traefik y Docker Compose manual es fuente de conflictos
  3. No hay red de seguridad — sin backups offsite, sin monitoring externo, sin DR plan

Para uso interno/demo: El sistema actual es adecuado. Para SaaS público con clientes: Se necesitan las Fases 1 y 2 como mínimo antes de aceptar clientes de pago.

El coste estimado de las Fases 1+2 es de ~2 semanas de trabajo + ~€10/mes adicionales en infraestructura. Es una inversión pequeña comparada con el riesgo de perder datos de un cliente.


Generado por: Claude (Anthropic) + Edu Fecha: 04-04-2026

Véase también

  • [[crearack-tech—reports—audit-punto-cero-04-04-2026]] — auditoría punto cero v1.0.51
  • [[crearack-tech—reports—security-audit-04-04-2026]] — auditoría de seguridad crearack.com
  • [[crearack-tech—guides—disaster-recovery]] — procedimiento de disaster recovery
  • [[crearack-tech—guides—production-deployment]] — deploy en producción Hetzner
  • [[crearack-tech—guides—capacity-planning]] — capacity planning SaaS
  • [[crearack-tech—admin—dokploy-internals]] — internals de Dokploy
  • [[decision—20260315—postgres-18-pgbouncer]] — ADR migración a PostgreSQL 18 + pgbouncer