Ir al contenido
use-cases / one-sandbox-per-customer / hero
CONTENEDORES · SAAS MULTI-INQUILINO

Un sandbox por cliente, automáticamente

Deja de dispersar tenant_id por todas las tablas. Cuando un cliente se registra, un script exec copia un contenedor nuevo y le entrega su propia URL, su propio sistema de archivos, su propio SQLite. El aislamiento es el sistema operativo entre ellos, no una cláusula WHERE.

use-cases / one-sandbox-per-customer / trigger

What that single API call provisions

Each POST to /api/v1/projects/{id}/containers spins up an isolated environment. One call, one tenant, one URL handed back to your app.

01 · WEBHOOK

Signup triggers the container POST

Your Stripe (or any billing) webhook hits a Hoody Exec script. No Express, no server config — just a file in scripts/.

02 · ISOLATION

Linux namespaces, not a WHERE clause

The new container has its own filesystem, its own SQLite, its own ramdisk. Tenant A literally cannot see tenant B's data.

03 · URL

A unique URL back to your app

The response includes a container URL. Your app redirects the user into their own sandbox in the same deploy window.

04 · FIREWALL

Per-tenant network rules cloned

Container network and firewall rules are copied from your template. Every new tenant starts from the same security baseline.

05 · IDLE

Zero cost when idle

Stop the container and it costs nothing. BTRFS keeps only the delta from your template — disk stays cheap even at scale.

06 · OFFBOARD

DELETE container = forget tenant

One DELETE call removes the container and all their data. GDPR offboarding is not a script, it is a single HTTP call.

The whole flow is one webhook handler. No Kubernetes operator, no namespace YAML, no cluster admin. Three HTTP calls: webhook in, container out, URL to user.

use-cases / one-sandbox-per-customer / compare

Multi-tenancy compartido vs contenedor por cliente

Las opciones tradicionales eran una columna en cada tabla o una flota de VMs que no podías permitirte. Hoody es una tercera forma: contenedores lo bastante baratos como para dar uno a cada cliente.

DIMENSIÓN
BD COMPARTIDA · TENANT_ID
HOODY · CONTENEDOR POR CLIENTE
  • AISLAMIENTOWHERE tenant_id = $1 — y esperas que cada query lo recuerdeNamespaces de Linux. El tenant A literalmente no puede ver el filesystem del tenant B.
  • SUPERFICIE DE FUGA DE DATOScada JOIN, cada hook ORM, cada script de reportingel límite del contenedor. Un artefacto que auditar, no 200 sitios de queries.
  • CONFIG POR TENANTtabla de feature flags, frágil, medio probada en devedita el entorno de un contenedor. Los otros 399 quedan intactos.
  • VECINO RUIDOSOun cliente pesado puede bloquear la BD compartidacuotas de CPU y disco por contenedor; la carga de un tenant queda en su caja.
  • OFFBOARDINGDELETE … WHERE tenant_id … más otras 12 tablas que olvidasteDELETE el contenedor. Sus datos se van con él. GDPR es una llamada HTTP.
  • COSTE EN OCIOSOcada fila cuesta almacenamiento incluso cuando el cliente está dormidopara el contenedor — cero CPU, cero RAM. BTRFS guarda solo el delta.
  • sin columnas tenant_id
  • sin auditorías de row-level security
  • sin YAML de namespace
  • borrar = olvidar
use-cases / one-sandbox-per-customer / punchline

La multi-tenancy deja de ser un problema de arquitectura. Se convierte en un comando `cp`.

ONBOARDPOST /containers/$TEMPLATE/copy
OFFBOARDDELETE /containers/$CID
AJUSTE POR TENANTPATCH /containers/$CID [ env_vars ]
  • aislamiento de nivel namespace
  • borrado GDPR en una llamada
  • un contenedor por cuenta
use-cases / one-sandbox-per-customer / replaces

Qué reemplaza esto

El aislamiento por tenant ha significado históricamente o una cláusula WHERE ingeniosa o un cluster caro. Container-per-customer desplaza los parches habituales:

  • Multi-tenancy compartido (columna tenant_id)Una mala query expone a todos
  • Middleware de aislamiento por tenant a medidaGuardia hecho a mano que mantienes para siempre
  • Políticas de row-level security de PostgresLa respuesta correcta, costosa de auditar por tabla
  • Namespace de Kubernetes por tenantSobrecarga a nivel de cluster, equipo de ops requerido
  • Schemas / bases de datos por clienteMultiplicador de migraciones, dolor de connection-pool
  • Filas de medición de Stripe en tabla compartidaTracking de uso pegado a la misma caja compartida
use-cases / one-sandbox-per-customer / cta

Los clientes ociosos no cuestan nada. Los activos escalan bajo demanda. Toda la cosa corre sobre $49 de bare metal hasta que tienes cientos de usuarios de pago.

use-cases / one-sandbox-per-customer / related

Lee los otros