PostgreSQL Sandbox Multi-Tenant¶
Estado: SANDBOX VALIDADO EN VPS
Scope: global
tenant_id: global
Owner: OpenClaw Platform Governance
Fuente de verdad: docs/governance/operations/POSTGRESQL-SANDBOX-MULTI-TENANT.md
Proposito¶
Definir y dejar preparado un primer PostgreSQL sandbox multi-tenant,
estrictamente no productivo, para validar separacion de datos entre
alpuntodeventa y ladirecta con datos ficticios y sin tocar integraciones
reales.
Que valida¶
- uso de
PostgreSQLcomo primera base sandbox multi-tenant - estrategia inicial de tablas compartidas con
tenant_id - estructura minima para
tenants,clientes,productosyventas - datos demo separados por tenant
Row Level Securityde lectura por tenant- lectura global controlada para un rol autorizado
- no exposicion publica directa de la base
- uso de red Docker interna y volumen persistente
Que no valida¶
- uso productivo
- rendimiento real
- alta disponibilidad
- backup automatico
- integracion con
WooCommerce - integracion con
SGC / ERP PostgRESTScalar- APIs publicas
- acceso externo por
Nginx Proxy Manager - cargas de datos sensibles
Tenants iniciales¶
alpuntodeventaladirecta
Alcance¶
- carpeta runtime:
infra/data-foundation/postgres-sandbox/ - compose privado con
postgres:16-alpine - scripts
SQLde bootstrap yRLS - documentacion operativa y de validacion
- validacion prevista solo con datos ficticios
Restricciones¶
- no usar contrasenas reales en repo
- no publicar
5432 - no conectar el contenedor a
proxy-network - no usar datos reales de clientes, productos o ventas
- no usar esta base como fuente productiva
- no mezclar este sandbox con observabilidad tecnica actual
No uso productivo¶
Este sandbox existe solo para validar aislamiento multi-tenant y contrato de datos. Cualquier consumo real de negocio, dashboards, agentes o APIs sigue pendiente de etapas posteriores.
Diagnostico previo al 2026-06-02¶
Safe point inicial¶
git status -sb->## main...origin/maingit rev-parse HEAD->7d52b384638c226b656514a459a36e120da915df
Hallazgos del VPS¶
Relevamiento remoto de solo lectura ejecutado por ssh openclaw-vps.
dockerdisponible en VPS:/usr/bin/dockerpsqlno aparece instalado en host- no existe contenedor
PostgreSQLactivo al momento del relevamiento - contenedores activos observados:
knowledge-portalportainerobs-grafanaobs-alertmanagerobs-thanos-queryobs-prometheusobs-thanos-compactorobs-thanos-storegatewayobs-thanos-sidecarobs-node-exporterobs-cadvisorobs-blackbox-exporteropenclaw-openclaw-gateway-1nginx-proxy-manager- redes Docker existentes:
proxy-networkobs-observability-internalopenclaw_openclaw_internalknowledge-portal_defaultnginx-proxy-manager_defaultportainer2_default- volumenes Docker existentes:
obs_alertmanager_dataobs_grafana_dataobs_prometheus_dataobs_thanos_compactor_dataobs_thanos_objectstore_dataobs_thanos_storegateway_dataportainer_dataportainer_data_new- puertos publicos escuchando en VPS:
228081443- puertos privados observados:
127.0.0.1:8085paraknowledge-portal127.0.0.1:3000paraobs-grafana- no hay evidencia de
5432publicado en el VPS al momento del relevamiento
Validacion runtime al 2026-06-02¶
Validacion ejecutada en openclaw-vps desplegando el sandbox desde una copia
temporal controlada en /tmp/openclawai-sandbox-deploy/.
Evidencia confirmada:
docker compose up -dejecutado sin tocar stacks productivos existentes- contenedor
openclaw-postgres-sandboxen estadohealthy docker compose psmuestra solo5432/tcpinterno, sin publicacion hostdocker inspect ... HostConfig.PortBindingsdevuelve{}- red efectiva del contenedor:
pg-sandbox-internal- consulta de tenants:
alpuntodeventaladirecta- lectura como
app_alpuntodeventa_reader: - solo
alpuntodeventa | Venta Demo APV - lectura como
app_ladirecta_reader: - solo
ladirecta | Venta Demo La Directa - lectura como
app_global_reader: - ve ambos tenants
- intento de acceso cruzado de
app_alpuntodeventa_readersobretenant_id=ladirecta: - sin filas devueltas
Convencion previa en DATA-FOUNDATION.md¶
La convencion ya aprobada y respetada por este sandbox es:
tenant_idobligatorio- tablas compartidas con
tenant_idcomo recomendacion inicial source_system, auditoria yrecord_statusobligatorios- tenants iniciales aprobados:
alpuntodeventaladirectaRLScomo mecanismo recomendado antes de exponer APIs o dashboards
Diseno sandbox aprobado¶
Red Docker sugerida¶
- nombre:
pg-sandbox-internal - driver:
bridge - propiedad:
internal: true - objetivo: aislar el contenedor del plano publico y evitar publicacion accidental
Volumen sugerido¶
- nombre:
pg_sandbox_data - objetivo: persistir el cluster de datos del sandbox entre reinicios
Credenciales¶
- archivo esperado:
infra/data-foundation/postgres-sandbox/.env - versionado permitido: solo
.env.example - politica: password solo de sandbox, nunca credenciales productivas
Politica futura de backup¶
En esta etapa no se activa backup automatico, pero queda recomendada la siguiente politica minima futura:
pg_dumplogico de sandbox antes de cambios estructurales- snapshot o copia del volumen
pg_sandbox_dataantes de resets - almacenamiento separado de artefactos y
SHA256SUMS - retencion corta, porque es un entorno de prueba
Rollback¶
Rollback sugerido si el sandbox debe descartarse por completo:
docker compose downdocker volume rm pg_sandbox_datadocker network rm pg-sandbox-internal
No aplicar rollback destructivo si existe evidencia o seeds que se quieran preservar para comparacion.
Implementacion entregada¶
- compose:
infra/data-foundation/postgres-sandbox/docker-compose.yml - runtime notes:
infra/data-foundation/postgres-sandbox/README.md - bootstrap
SQL: init/001_create_schema.sqlinit/002_seed_tenants.sqlinit/003_seed_sample_data.sqlinit/004_rls_policies.sql
Modelo minimo incluido¶
sandbox_mt.tenantssandbox_mt.clientessandbox_mt.productossandbox_mt.ventas
Todas las tablas incluyen los campos obligatorios definidos por Data
Foundation:
tenant_idsource_systemcreated_atupdated_atcreated_byupdated_byrecord_statusexternal_idsi aplicasync_batch_idsi aplica
Seguridad inicial¶
RLSactivado en las cuatro tablas- roles de lectura creados:
app_global_readerapp_alpuntodeventa_readerapp_ladirecta_reader- politica esperada:
app_global_readerpuede leer ambos tenantsapp_alpuntodeventa_readersolo puede leeralpuntodeventaapp_ladirecta_readersolo puede leerladirecta
Validacion operativa¶
Los comandos de validacion quedaron documentados en:
infra/data-foundation/postgres-sandbox/README.md- VALIDACION-MULTI-TENANT-SANDBOX.md
Regla final¶
Este sandbox no habilita de forma automatica ninguna API, dashboard, agente o integracion productiva. Solo abre una base controlada y privada para validar aislamiento multi-tenant con datos de prueba.