PDF-004A Staging Postgres Stack Preflight Plan¶
Fecha local: 2026-06-19
Estado:
PREFLIGHT + PLAN OPERATIVO + CANDIDATES / NOT EXECUTED / NO SECRETS / PDF-004B PENDING GO
portal_visible = yes
Scope: tenant
tenant_id: alpuntodeventa
Owner: Gabi / Carlos Canu
Fuente de verdad:
docs/tenants/alpuntodeventa/business-observer/production/PDF-004A-STAGING-POSTGRES-STACK-PREFLIGHT-PLAN.md
1. Objetivo¶
Preparar la implementacion completa de un PostgreSQL staging-vps real para
Business Observer, separado de openclaw-postgres-sandbox, sin crearlo
todavia.
Esta tarea deja plan operativo y archivos candidatos versionados. No crea
contenedores, volumenes, redes, DB, roles, schemas ni tablas. No ejecuta SQL,
no ejecuta docker compose up, no imprime secretos y no habilita PDF-004B
sin un gate separado.
2. Safe point¶
| Control | Valor |
|---|---|
| workspace | C:\APV\openclawai |
| rama observada | main |
HEAD/origin observado al iniciar |
ba941b6562de20e8a65c830aef2c6b2fa8573b73 |
| ultimo estado publicado | PDF-003F-B BLOCKED / NO-GO por falta de target staging real |
| decision | SAFE POINT PASS / PREFLIGHT READ-ONLY + CANDIDATES ONLY |
3. Decision de implementacion¶
Decision candidata:
text
crear un stack PostgreSQL dedicado para Business Observer staging
en /opt/stacks/business-observer-staging
Identidad propuesta:
| Componente | Nombre |
|---|---|
| service/container | openclaw-business-observer-postgres-staging |
| DB | openclaw_business_observer_staging |
| schema | business_observer |
| owner role logico | openclaw_bo_staging_owner |
| writer role logico | openclaw_bo_staging_writer |
| reader role logico | openclaw_bo_staging_reader |
| reporting role logico | openclaw_bo_staging_reporting_ro |
El stack propuesto no reemplaza ni reutiliza openclaw-postgres-sandbox.
4. Preflight VPS read-only observado¶
Comandos remotos ejecutados solo en modo lectura via ssh openclaw-vps.
No se inspeccionaron variables de entorno, no se abrio psql, no se ejecuto
SQL y no se imprimieron secretos.
| Control | Observado |
|---|---|
| hostname | srv977009 |
| uptime | up 2 weeks, 4 days, 11 hours, 9 minutes |
disco / |
96G total, 28G usado, 69G libre, 29% |
| memoria | 7.8Gi total, 1.9Gi usada, 5.9Gi disponible |
| swap | 4.0Gi total, 768Ki usada |
| Docker | client/server 29.5.2 |
Contenedores relevantes observados:
| Contenedor | Estado | Dictamen |
|---|---|---|
openclaw-postgres-sandbox |
Up 11 days (healthy) |
existe, pero NO SE USARA COMO STAGING REAL |
openclaw-business-observer-postgres-staging |
ausente | sin colision |
openclaw-postgrest-sandbox |
Up 11 days |
fuera de alcance |
| observabilidad, OpenClaw, NPM, Portainer, portal | activos | fuera de alcance, no tocados |
Redes Docker observadas:
text
bridge
host
knowledge-portal_default
nginx-proxy-manager_default
none
obs-observability-internal
openclaw_openclaw_internal
pg-sandbox-internal
portainer2_default
proxy-network
Volumenes Docker observados:
text
obs_alertmanager_data
obs_grafana_data
obs_prometheus_data
obs_thanos_compactor_data
obs_thanos_objectstore_data
obs_thanos_storegateway_data
pg_sandbox_data
portainer_data
portainer_data_new
<dos volumenes anonimos Docker existentes>
Rutas observadas:
| Ruta | Estado |
|---|---|
/opt/stacks/business-observer-staging |
ABSENT |
/opt/stacks/business-observer |
ABSENT |
/opt/stacks/openclaw |
EXISTS |
/opt/stacks/observability |
EXISTS |
Puertos escuchando en host:
text
0.0.0.0:22
0.0.0.0:80
0.0.0.0:81
0.0.0.0:443
127.0.0.1:3000
127.0.0.1:8085
127.0.0.1:65529
127.0.0.53:53
127.0.0.54:53
No se observo publicacion host de 5432 para el sandbox. El candidate de
staging conserva la misma politica: sin puerto publicado al host.
5. Colisiones detectadas¶
| Item | Propuesto | Estado |
|---|---|---|
| container | openclaw-business-observer-postgres-staging |
NO EXISTE |
| volume | openclaw_bo_postgres_staging_data |
NO EXISTE |
| network | openclaw-bo-staging-internal |
NO EXISTE |
| stack path | /opt/stacks/business-observer-staging |
NO EXISTE |
host port 5432 |
no publicado | sin colision requerida |
Dictamen:
text
COLISIONES CRITICAS = NO OBSERVADAS
SANDBOX EXISTE = SI, PERO QUEDA EXCLUIDO
PDF-004B = PENDING GO, NO EJECUTAR TODAVIA
6. Archivos candidatos versionados¶
| Archivo | Estado | Impacto |
|---|---|---|
infra/business-observer/staging/postgres/docker-compose.business-observer-staging.candidate.yml |
CANDIDATE / NOT EXECUTED / NO SECRETS |
define container, imagen, volumen, red interna, healthcheck y secrets file externo |
infra/business-observer/staging/postgres/.env.business-observer-staging.example |
NO SECRETS / TEMPLATE ONLY |
documenta placeholders y nombres logicos sin credenciales reales |
El compose candidate:
- usa
postgres:16.14-alpine; - define volumen dedicado
openclaw_bo_postgres_staging_data; - define red interna dedicada
openclaw-bo-staging-internal; - no publica puertos al host;
- deja el bootstrap catalog en
postgresdurantePDF-004B, para no crear todaviaopenclaw_business_observer_staging; - usa
POSTGRES_PASSWORD_FILEapuntando a un secret file fuera de Git; - monta
./backups:/backups:rosolo como punto no sensible candidato; - incluye healthcheck con
pg_isready; - usa
restart: unless-stopped; - queda marcado como
CANDIDATE / NOT EXECUTED.
7. Politica de secretos fuera de Git¶
Secretos reales prohibidos en Git:
- passwords;
- connection strings;
- tokens;
- roles
LOGINsensibles; - contenidos de archivos en
/opt/stacks/business-observer-staging/secrets/*; .env.business-observer-stagingreal del VPS.
El repo solo versiona:
- nombres logicos;
- rutas propuestas;
- templates;
- candidates sin valores sensibles;
- criterios de ejecucion y validacion.
8. Backup/restore baseline pendiente¶
Antes de cualquier PDF-004B con ejecucion real debe quedar cerrado:
- crear directorio operativo de backups fuera de Git;
- crear o validar secret file fuera de Git;
- definir backup previo de la DB staging correcta;
- ejecutar backup real solo en tarea autorizada;
- ejecutar restore drill real en destino separado;
- registrar evidencia
PASS/FAIL, tamanio, checksum y duracion.
El runbook candidato vigente sigue siendo PDF-003E. Este PDF-004A no
ejecuto pg_dump, pg_restore ni SQL.
9. Observabilidad minima pendiente¶
Pendiente para PDF-004B o gate posterior:
- health container visible por Docker;
- alerta o check de disponibilidad Postgres;
- backup age;
- restore drill age;
- uso de volumen;
- logs basicos del contenedor;
- evidencia de que no hay puerto PostgreSQL publicado al host;
- fingerprint posterior a provisioning.
10. Criterios GO para PDF-004B¶
PDF-004B puede pasar a GO solo si todo esto queda aprobado en una tarea
separada:
- confirmar safe point Git limpio;
- confirmar ventana de cambio y responsable operativo;
- crear secretos fuera de Git en VPS sin imprimirlos;
- validar que el compose candidate sigue sin secretos reales;
- validar que no existe colision nueva de container, volumen, red o path;
- validar que
openclaw-postgres-sandboxno sera tocado; - aprobar explicitamente la creacion del stack;
- definir evidencia post-provisioning esperada;
- mantener
PDF-004DDL bloqueado hasta fingerprint, backup y restore.
11. Criterios NO-GO¶
Debe seguir NO-GO si ocurre cualquiera de estos puntos:
- aparece un contenedor, volumen, red o path con naming incompatible;
- falta secret file fuera de Git;
- el candidate contiene password, token o connection string real;
- se requiere publicar
5432al host sin justificacion aprobada; - alguien intenta usar
openclaw-postgres-sandboxcomo staging real; - falta responsable operativo o ventana de cambio;
- falta baseline de backup/restore;
- no se puede ejecutar observabilidad minima;
- se propone tocar
La Directa,SGC,O4, sync diaria o prod.
12. Rollback/cleanup candidate¶
Si una tarea futura provisiona el stack y falla antes de contener datos utiles, el cleanup candidato debe tratarse en tarea separada y puede incluir, con autorizacion explicita:
text
docker compose down
docker volume rm openclaw_bo_postgres_staging_data
docker network rm openclaw-bo-staging-internal
Reglas:
- no ejecutar cleanup desde
PDF-004A; - no tocar
pg_sandbox_data; - no tocar
openclaw-postgres-sandbox; - no borrar backups ni secretos sin orden explicita;
- si ya existieran datos o backup real, preferir restore/retencion antes que eliminacion.
13. Bloqueos preservados¶
Siguen bloqueados:
PDF-004DDL;PDF-004Bprovisioning hasta GO separado;- produccion final;
- sync diaria y scheduler;
- cualquier carga SGC;
- runtime
O4; La Directa;openclaw-postgres-sandbox;- push y deploy portal.
14. Confirmacion de no cambios runtime¶
Confirmado:
- no se creo contenedor;
- no se creo volumen;
- no se creo red;
- no se creo DB;
- no se crearon roles;
- no se creo schema;
- no se ejecutaron tablas;
- no se ejecuto SQL;
- no se ejecuto
docker compose up; - no se imprimieron secretos.
15. Conclusion¶
text
PDF-004A PASS AS PREFLIGHT + IMPLEMENTATION PLAN
STAGING POSTGRES STACK = CANDIDATE ONLY
TARGET PATH = /opt/stacks/business-observer-staging
CONTAINER = openclaw-business-observer-postgres-staging
VOLUME = openclaw_bo_postgres_staging_data
NETWORK = openclaw-bo-staging-internal
HOST PORT 5432 = NOT PUBLISHED
openclaw-postgres-sandbox = EXISTS / NOT USED AS REAL STAGING
COLLISIONS = NONE OBSERVED FOR PROPOSED NAMES
SECRETS = OUT OF GIT
BACKUP/RESTORE BASELINE = PENDING
OBSERVABILITY MINIMA = PENDING
PDF-004B = PENDING GO
PDF-004 DDL = NO-GO
PRODUCTION + DAILY SYNC = BLOCKED