Multi-tenancy en CreaRack Pro
Qué es
CreaRack Pro es una aplicación SaaS multi-tenant donde Organization actúa como tenant raíz. Cada User pertenece a exactamente una Organization mediante FK, y todos los recursos principales (Rack, Blueprint, Stencil, SystemLog) llevan un campo organization que los ancla al tenant propietario. El aislamiento se aplica en tres capas: filtros ORM en cada servicio, middleware de Row-Level Security (RLS) que instruye a PostgreSQL con una variable de transacción, y middleware de module-gating que controla qué funcionalidades puede usar el tenant según su plan.
Por qué existe
Sin aislamiento explícito, un bug en cualquier query podría devolver datos de otro cliente. La regulación de datos y los SLAs de cada plan exigen que un tenant nunca acceda ni afecte los recursos de otro. Adicionalmente, los tenants en planes inferiores no deben poder saturar la cola de tareas en background (“noisy neighbor problem”).
Componentes
Organization(core/models.py): tenant raíz. Campos relevantes:is_active,deleted_at(soft-delete),plan,extra_modules.get_active_modules()combina módulos core siempre-activos y los extra del tenant.User(core/models.py): extiendeAbstractUser, FK aOrganization, camporole(admin,operator,readonly).ModuleGatingMiddleware(core/middleware/module_gating.py): resuelve la org del usuario, verificais_activeyis_deleted, bloquea con HTTP 403 cualquier path cuyo módulo requerido no esté en el set activo. Superusuarios bypassean.TenantRLSMiddleware(core/middleware/tenant_rls.py): activa transacción atómica por request y ejecutaSET LOCAL app.current_org_id = <id>en PostgreSQL. Las políticas RLS leen esta variable para restringir filas como red de seguridad. Compatible con pgBouncer transaction pooling porqueSET LOCALse limpia al commit.tenant_throttle(core/tenant_fairness.py): decorador para tareas Huey. Usa Django cache para contar tareas concurrentes por org, limitando según plan (starter: 3,pro: 10,custom: 25). Backoff de 5s si supera.- Services de apps (
racks/services/racks.py,blueprints/services/blueprints.py): cada método recibeorganizationexplícito y aplica.filter(organization=...)en querysets.
Flujos
Request HTTP normal:
AuthenticationMiddlewareidentificaUsery cargaOrganizationvia FK.ModuleGatingMiddlewareverifica que el path esté cubierto por el plan. Si no, 403.TenantRLSMiddlewareabre transacción atómica y ejecutaSET LOCAL app.current_org_id = <org.id>. Políticas RLS activas.- La view llama al servicio (
RackService.list_racks(organization=request.user.organization)) que filtra en ORM. Si el filtro falla, RLS bloquea filas de otros tenants a nivel BD.
Soft-delete de Organization:
- Admin setea
org.deleted_at = now()y guarda. - Siguiente request:
ModuleGatingMiddlewaredetectaorg.is_deleted == Truey retorna 403 conerrors/account_paused.html(o JSON si/api/*). - Datos permanecen aislados y recuperables limpiando
deleted_at.
Tarea background con fairness:
- View encola tarea Huey decorada con
@tenant_throttle()(sin límite fijo, usa el del plan). - Decorador consulta cache
tenant_tasks:<org_id>. Si supera el límite del plan, espera 5s y reintenta. - Incrementa contador antes de ejecutar, decrementa en
finally.
Related
entity--core--model--organization— tenant raíz.entity--core--model--user— FK a Organization.concept--saas--module-gating— lógica de planes y acceso granular.
Véase también
- [[entity—core—model—organization]]
- [[entity—core—model—user]]
- [[concept—saas—module-gating]]
- [[decision—20260101—django-ninja-vs-drf]] — Framework REST que expone las APIs multi-tenant
Referenciado desde
- _get_org_from_request: autenticación única del CNS (sesión + Agente) tras B-01/B-11
- ¿Cómo está implementado el aislamiento multi-tenant en CreaRack Pro? ¿Se usa django-tenants con schemas de PostgreSQL o un modelo de organización por fila (Organization FK)? ¿Qué mecanismos garantizan
- 🧩 Visio Stencil Import v2 — importación de ficheros reales de fabricante
- ADR: ACK y APPLIED escriben resolved_at; EXPIRE no (decisión Edu 14-08-2026)
- ADR: Hito E Fase 1 — Cifrado de credenciales desacoplado de SECRET_KEY (s101)
- Agente · dev-core
- API SNMP endpoints — test, interfaces, poll con autorización
- Arquitectura de Base de Datos - CreaRack Pro v1.0.50
- Arquitectura de Métricas para SaaS - CreaRack Pro
- Auditoria 2026-07 Fase 1: Seguridad, Rendimiento y Calidad
- Auditoría Suprema — dominio Digital Signage (24 hallazgos, 4 raíces)
- Auditoría Suprema — Racks: 6 arreglos de seguridad ALTA (s104)
- Auditoría Suprema · Módulo network sub-área 1 (Discovery/Auto-Provision) — Etapa 3
- Auditoria Suprema · Monitoring SA2 (Protocolos/Probes) + SA3 (CNS/IA)
- Auditoría Suprema · network sub-área 4 (Devices/Backups/Groups) — Seguridad de credenciales y configuraciones
- Auditoría Suprema 2 · Cola monitoring D: rendimiento de deep-discovery y de Wireless/UPS
- Auditoría Suprema 2 · Tanda 1 (core) — cerrar gates de permiso que faltaban
- Auditoría Suprema 2 · Tanda 5, 2ª pasada: revocar sin borrar, rotación del refresh y candado del invariante Primary
- Auditoría Suprema 2 · Tanda 5: revocación real del token del Agente y roles de flota sin condiciones de carrera
- Auditoría Suprema 2 · Tanda 6: toma de control del Agente local desde cualquier web y downgrade forzado del .exe
- Auditoría Suprema 2 · Tanda 9: SSRF por IPv6 mapeada, XSS almacenado en stencils y borde anónimo de signage
- Auditoría Suprema Etapa 3 · SA4 (ITSM/alerting) + SA5 (wireless/UPS) — Rectificación
- Auditoría Suprema Etapa 3: Cierre de findings M1 (media gateado), B6 (orden middleware) y E (Device.management_config)
- Auditoría Suprema monitoring sa3 — CNS / Insights / IA (s109)
- Auditoría Suprema monitoring sa6 — páginas del Observatory + tiempo real (s108)
- Auditoría Suprema network sub-área 2 (Scripts/SSH/Auto-config) · Sesión 113
- Auditoría Suprema s105: Blueprints / Auto-Plan (22 fixes)
- Auditoría Suprema Terminal — Fase A Backend: Correctness/Honestidad
- Auto-Provision no pierde su listado de resultados por el cierre de sesión
- Auto-Provision UX — panel en vivo + asignación inline (s115)
- Barra de Integridad F2: el radar interno plano↔realidad
- Biblioteca — Grafo + Archivo Maestro + Wiki Supercontexto
- Blueprint · Modelo blueprints
- Cambiar de Primary deja de ser un clic mudo — confirmación, historial y aviso al equipo
- Cerrar Broken Access Control sistémico en Digital Signage
- Ciclo de cierre ITSM — resolved_at con escritor y auto-resolución de grupos
- Cierre de BAJA/MEDIA en sa5 (wireless+UPS) — Auditoría Suprema Sesión 112
- Cierre del formulario de registro built-in de allauth
- Cifrado de credenciales con clave dedicada (Hito E Fase 1)
- Clonar un rack de la Fila con un clic (v1.78.0)
- Concepto: Calibración del motor (signal vs. noise)
- CONN_MAX_AGE=0 con Daphne ASGI
- Consumer monitoring · realtime WebSocket — canal de tiempo real del Observatory
- Copia de seguridad y restauración completa en segundo plano (v1.56.0 · ADR T2 2/2)
- Decision · Auditoría Suprema: 4 hallazgos ALTA confirmados en core
- Decisión arquitectónica · Unificación de gates con `require_perm` en network (sa4)
- Decisión pendiente: dimensionado del servidor self-host LLM (Help Widget)
- Decisión: Activar enforcement del Bearer local del Agent (Raíz 3 cerrada)
- Decisión: sa4-G2 cerrada — el validador de comandos vuelve a aceptar '| include' con regex anclada
- Decisiones de la Auditoría Suprema s105 (Blueprints/Auto-Plan)
- DeviceTrashEntry · Modelo network
- Diccionario central de glosa (127 términos) · Informes públicos
- Disponibilidad honesta: uptime_pct sale null si faltan más del 20% de las horas (v1.125.0)
- Endpoint GET /api/racks/backup/full/download/{job_id} — Descargar ZIP (v1.56.0)
- Endpoint GET/POST /signup — página pública de registro invite-only (F1 PR-A)
- Endpoint POST /api/correo/ask · Chat de la Secretaria (F1)
- Endpoint POST /api/scripts/{id}/execute · Ejecución de scripts SSH
- Endpoint receive_agent_alert — Ingesta de alertas del Agent
- Endpoint update_company_settings — Configuración de organización
- Endpoint: GET /api/agent/local-token (Frontend recoge token local descifrado)
- Endpoint: GET/POST/DELETE /auto-provision/scans
- Endpoint: Obtener credenciales SSH descifradas de DeviceProfile
- Endpoint: POST /api/racks/visio/confirm — Confirmar e importar stencils Visio
- Endpoint: POST /api/visio/analyze — Iniciar conversión async de Visio
- Endpoint: POST /auto-provision/assign-types
- Endpoints /api/correo/peticiones · Cola de Encargos de Correo (F2)
- Equipos fuera de servicio (Take out of Service)
- Estrategia SaaS 2026 — CreaRack Pro
- Feature Catalog — CreaRack Pro v1.0.51
- Feature s104 · Auditoría Suprema — 4 arreglos de seguridad en el núcleo
- Feature s115: Búsquedas guardadas persistidas en BD
- Fix Auto-Provision Refresh: Re-descubrimiento vía Local Agent
- Fondos de plano compartidos entre organizaciones y borrado a ciegas (task #252)
- Fuga cross-tenant en el publicador anónimo de signage (playlist_id sin validar)
- Fuga de datos cross-tenant a Google AI Studio en perf-review / finops
- Gráficas configurables en paneles de monitoreo
- Guía de Superusuario y Administración SaaS
- Helper require_perm: gate de permisos por scope/level
- Incident: RLS-gap en 3 tablas nuevas (AIInsight, AIInsightAuditLog, VictoriaMetrics ingest)
- Incidente: Auditoría Suprema network SA5 — Broken Access Control, XSS, inyección cerrados
- Incidente: Target de monitoreo "zombi" — Observable pero sin sondeo activo
- Índice de la Wiki Supercontexto
- kb.js v2 — Módulo de auto-marcado de términos del diccionario
- MCP Tool: bib_ask — Búsqueda semántica en corpus de wiki
- Menú Correo del Workspace · F0/F1/F2 — Chat y Cola de Peticiones
- Middleware RateLimitMiddleware — Control anti-abuso por endpoint
- Modelo AgentRoleEvent — historial de cambios de rol de la flota
- Modelo AIPrompt: prompt del AI Brain por organización
- Modelo RackIntegritySnapshot — foto diaria de integridad plano↔realidad
- Modelo StripeEvent — Ledger global de eventos de Stripe
- Modelo: ScanSession
- Módulo SaaS: integrity (Barra de Integridad)
- Motor de Integridad F1 — cruce plano↔realidad con métricas separadas
- Multi-tenancy con PostgreSQL Row Level Security
- Observatory: Sidebar Unificado de Todos los Dispositivos
- Organización de demostración - seed_demo_org
- Organization · Modelo core
- Panel Bibliotecario · 7d — Sección operativa en /biblioteca/pulse
- Papelera de dispositivos: borrar de todas partes y restaurar desde la Home
- Patrón de renderizado Markdown → HTML en CNS y Help Widget
- Permisos por rol en Digital Signage (s121)
- Plan Hardening fleco E cerrado: retirada de DEV_KEY de la cadena de descifrado
- Portal Approval: revalidar scope del ClientShareLink en cada aprobación
- Raíz R6: Fallback silencioso a primer tenant permitía lectura/escritura cross-tenant (CERRADO)
- Refactor R7 lote P2 · Autorización por scope módulo (is_admin → require_perm)
- Registro invite-only (F1 de la task #137) · plan aprobado en plan-review
- Remate de capacidad: vatios unificados, totales visibles y reporte con límites (v1.57.1)
- Reorden manual de secciones del Dashboard por drag&drop (v1.50.0)
- Retirar el camino cloud de monitorización (batch-ping/snmp/http) y las tablas MetricSample/AggregatedMetric
- RLS WITH CHECK — aislamiento de escritura cross-tenant (Hito D)
- Roadmap SaaS — CreaRack Pro 2026
- s121: Digital Signage — permisos por rol y cierre de 4 raíces de seguridad
- s129: Fix arranque Agent 2.1.1 (dashboard SaaS desbloqueado)
- serve_media_gated: Función de servicio de media con autenticación
- Servicio / Tarea Huey `apply_full_restore_from_zip()` — Restaurar desde ZIP (v1.56.0)
- Servicio core.services.signup — alta de organización invite-only (F1 PR-A)
- Servicio de autenticación Agent en frontend (`agent_auth.js`)
- Servicio de autenticación local del Agent (`local_token`)
- Servicio de seguridad en filesystem (safe-fs)
- Servicio decrypt_credential — Descifrado de credenciales
- Servicio hot-cache.ts — Construcción y renderizado del HotCache
- Servicio monitoring · provisioning — auto-provisionamiento de objetivos SNMP
- Servicio ssh_host_keys: TOFU server-side para conexiones SSH
- Servicio: Autenticación local del Agent (Bearer token)
- Servidor MCP de CreaRack: asistentes de IA consultan WiFi y estado de equipos con la cuenta del usuario (entrega 1, v1.173.0)
- Servidor MCP de CreaRack: pantallas de conexiones y actividad (entrega 2)
- Servidor MCP v3: 30 herramientas de solo lectura para armarios, red, monitorización, SAI y cartelería (v1.177.0)
- Sesión 107: Auditoría Suprema — monitoring sub-área 2 (protocolos SNMP·ping·HTTP)
- signage_view — Vista de listado de pantallas en Digital Signage
- Sincronización de metadatos durables (.md ↔ D1)
- Sonda TCP — Equipos que bloquean ICMP dejan de salir "down" falsos
- SSRF: mitigación en conexiones controlables por usuario (check_scan_ip)
- Stencils duplicados en paleta (bug restore, ronda funcional 13-08-2026)
- T1 Cifrado de Credenciales SNMP en Reposo
- T5 (Auditoría Suprema R6): Eliminación del fallback a primer tenant en operaciones multi-tenant
- Tabla D1: correo_peticiones · Cola de Encargos de Correo (F2)
- Task #279 · gates de permisos que faltaban en 3 zonas + test de contrato universal
- UI del preview de import Visio v2 — categorías por shape y renombrado inline
- User · Modelo core
- Utilidad require_org: resolver organización con fallo cerrado