Saltar a contenido

PDF-007B2 SOURCE-003 Production Dedicated PostgreSQL Provisioning

Fecha local: 2026-06-20

Estado: SOURCE-003 PRODUCTION DEDICATED POSTGRES PROVISIONED / EMPTY / NO LOAD

portal_visible = yes

Scope: tenant

tenant_id: alpuntodeventa

Owner: Gabi / Carlos Canu

Fuente de verdad: docs/tenants/alpuntodeventa/business-observer/production/PDF-007B2-SOURCE-003-PRODUCTION-DEDICATED-POSTGRES-PROVISIONING.md

1. Contexto

PDF-007A preparo el paquete candidate productivo para SOURCE-003. PDF-007B fue ejecutado operativamente con resultado verde, pero dejo el target productivo vacio dentro del contenedor llamado openclaw-business-observer-postgres-staging.

Este gate corrige la arquitectura antes de cargar datos productivos: produccion queda en un PostgreSQL Docker dedicado, con contenedor, red, volumen y baseline propios.

2. Safe point local

  • git status -sb: ## main...origin/main
  • HEAD: 2a4f90cf9ba82b7ace9f0f9c65705abf57ffd3dc
  • origin/main: 2a4f90cf9ba82b7ace9f0f9c65705abf57ffd3dc
  • ultimo commit: 2a4f90c docs: prepare source-003 production controlled rollout
  • git diff --check: PASS
  • ..\.venv-portal\Scripts\mkdocs.exe build --strict: ruta inexistente desde C:\APV\openclawai
  • .\.venv-portal\Scripts\mkdocs.exe build --strict: PASS

3. Safe point VPS

  • host: srv977009
  • repo: /opt/openclawai
  • git status -sb: ## main...origin/main
  • HEAD/origin: 2a4f90cf9ba82b7ace9f0f9c65705abf57ffd3dc
  • ultimo commit: 2a4f90c docs: prepare source-003 production controlled rollout
  • staging: openclaw-business-observer-postgres-staging, postgres:16.14-alpine, healthy, sin puertos host publicados
  • sandbox: openclaw-postgres-sandbox, healthy, no usado
  • Portainer: portainer/portainer-ce:2.39.3, Up
  • NPM: jc21/nginx-proxy-manager:2.15.1, Up

4. Diagnostico Portainer read-only

Resolucion DNS:

  • www.portainer.alpuntodeventa.com.ar: resuelve a 46.202.151.32
  • portainer.alpuntodeventa.com.ar: resuelve a 46.202.151.32

HTTP/TLS:

  • https://portainer.alpuntodeventa.com.ar/: 200 OK
  • https://www.portainer.alpuntodeventa.com.ar/: falla TLS/SNI (tlsv1 unrecognized name desde VPS, error Schannel desde Windows)

Conclusion:

text Portainer container UP NPM container UP portainer.alpuntodeventa.com.ar OK www.portainer.alpuntodeventa.com.ar NO-OK por TLS/SNI/certificado o proxy host

El problema no parece DNS ni contenedor caido. Parece configuracion NPM/TLS para el alias www. No se modifico DNS, NPM ni Portainer.

5. Target viejo en staging

El target openclaw_business_observer_prod existe dentro de openclaw-business-observer-postgres-staging.

Conteos read-only:

Tabla Filas
source_003_sales_items 0
raw_source_003_sales_items 0
core_source_003_sales_items 0
mart_source_003_sales_daily 0
mart_source_003_sales_by_seller 0
mart_source_003_sales_by_customer 0
mart_source_003_sales_by_sku 0

Clasificacion:

text LEGACY_EMPTY_TARGET / PENDING_CLEANUP

Ese target no debe usarse para carga futura. No fue borrado.

6. Nuevo PostgreSQL productivo dedicado

Contenedor:

text openclaw-business-observer-postgres-prod

Imagen:

text postgres:16.14-alpine

Runtime:

  • stack operativo: /opt/stacks/business-observer-prod
  • compose: /opt/stacks/business-observer-prod/docker-compose.yml
  • env externo: /opt/stacks/business-observer-prod/.env.business-observer-prod
  • secret externo: /opt/secrets/openclaw/business-observer-prod/postgres_bootstrap_password
  • volumen: openclaw_business_observer_prod_data
  • red interna: openclaw-bo-prod-internal
  • HostConfig.PortBindings: {}
  • estado: healthy

El contenedor no publica puertos host. El secret no fue impreso ni versionado.

7. Provisioning estructural

DB:

text openclaw_business_observer_prod

Schema:

text business_observer

Roles NOLOGIN:

  • openclaw_bo_prod_owner
  • openclaw_bo_prod_writer
  • openclaw_bo_prod_reader
  • openclaw_bo_prod_reporting_ro

Tablas SOURCE-003 creadas vacias:

  • business_observer.source_003_sales_items
  • business_observer.raw_source_003_sales_items
  • business_observer.core_source_003_sales_items
  • business_observer.mart_source_003_sales_daily
  • business_observer.mart_source_003_sales_by_seller
  • business_observer.mart_source_003_sales_by_customer
  • business_observer.mart_source_003_sales_by_sku

SQL ejecutado:

  • DDL estructural de roles, DB y schema, adaptado desde el patron staging PDF-004F
  • infra/business-observer/production/postgres/ddl/PDF-007A/002-source-003-production-target-tables-forward.candidate.sql

No se ejecutaron scripts de load.

8. Post-checks

Resultado:

  • contenedor prod dedicado: healthy
  • DB prod presente: PASS
  • roles prod 4/4 presentes y NOLOGIN: PASS
  • schema business_observer presente: PASS
  • tablas SOURCE-003 7/7: PASS
  • owner de las 7 tablas: openclaw_bo_prod_owner
  • conteos: 0/0/0/0/0/0/0
  • PUBLIC table ACL rows: 0
  • writer: SELECT/INSERT/UPDATE sobre 7/7
  • reader: SELECT sobre 7/7
  • reporting_ro: SELECT sobre 7/7
  • PostgreSQL prod sin exposicion publica: PortBindings {}
  • staging: healthy
  • sandbox: healthy, no usado

9. Backup baseline

Baseline estructural vacio fuera de Git:

text /opt/backups/openclaw/business-observer-prod/postgres/baseline/20260620T192631Z/openclaw-bo-prod-postgres-baseline-20260620T192631Z.dump

Tamanio:

text 56581 bytes

SHA256:

text d66a1c2636ab7f7d03f40f2abb4d6f8d10b63acf218dcd1b8e27c2ff580252a8

pg_restore --list:

text PASS / 92 lines

Permisos:

  • directorio: 700 root:root
  • dump/checksum/listado: 600 root:root

git status remoto en /opt/openclawai quedo limpio despues del backup.

10. Restricciones respetadas

  • no se cargaron datos SOURCE-003;
  • no se ejecuto COPY;
  • no se ejecuto INSERT/UPDATE/DELETE/TRUNCATE de datos de negocio;
  • no se ejecuto sync;
  • no se ejecuto scheduler;
  • no se ejecuto cron;
  • no se ejecutaron pipelines;
  • no se uso openclaw-postgres-sandbox;
  • no se modifico OpenClaw;
  • no se modifico NPM;
  • no se modifico DNS;
  • no se modifico Portainer;
  • no se reinicio NPM ni Portainer;
  • no se expusieron puertos publicos para PostgreSQL;
  • no se imprimieron passwords ni connection strings reales;
  • no se agregaron backups/dumps al repo;
  • no se borro el target viejo dentro de staging.

11. Decision

Decision:

text PDF-007B2 VERDE

Produccion SOURCE-003 tiene ahora un PostgreSQL dedicado, estructuralmente provisionado y vacio.

Produccion cargada:

text NO

Sync, scheduler, cron y pipelines:

text NO-GO

12. Proximo gate recomendado

Proximo gate recomendado:

text PDF-007C SOURCE-003 production initial controlled load preflight

Ese gate debe validar snapshot/hash, preparar CSV fuera de Git, confirmar baseline vigente, ejecutar preflight de carga y pedir autorizacion separada antes de cualquier COPY o DML de negocio.