Saltar al contenido principal

ADR-DB-001-platform — Database Platform Standard para iaw-platform

Contexto

O iaw-platform e o hub central de billing da In All Web. Gere subscricoes, pagamentos Stripe, facturas Moloni e provisioning de tenants para os SaaS (booking + stores). Tem SLA legal por Stripe Connect e SAF-T Moloni.

O STD-DB-001 (aprovado 2026-04-15) define 5 camadas obrigatorias para todos os produtos. Este ADR documenta como o iaw-platform implementa cada camada.

Decisao

O iaw-platform adopta o STD-DB-001 integralmente, sem excepcoes.

RPO/RTO (validado pelo Dany)

MetricaValorJustificacao
RPO5 minSLA legal Stripe + Moloni SAF-T — perder >5min de transaccoes = inconsistencia fiscal
RTO1 horaClientes nao podem ficar sem checkout/billing >1h

Camadas — Estado Actual e Plano

C0 — Data Model Hygiene (pre-go-live)

RequisitoEstadoNotas
tenant_id UUID NOT NULL em tabelas multi-tenantParcialclients, subscriptions, invoices tem. Verificar tickets, domains
PK UUID v7NaoUsa Integer auto-increment. Migracao gradual (novas tabelas UUID)
TIMESTAMPTZ created_at/updated_atSimTodas as tabelas
deleted_at soft deleteParcialclients tem. Adicionar a subscriptions, invoices
FKs ON DELETE explicitoVerificarAuditar todas as FKs
CHECK enumsParcialStatus fields usam String — migrar para CHECK
UNIQUE com tenant_idVerificarAuditar constraints

Accao: CI job db:hygiene para validar automaticamente.

C1 — Pagination (pre-go-live)

RequisitoEstadoNotas
Contrato items + paginationParcialAdmin endpoints usam. Portal parcial
page_size max 200Nao enforcedAdicionar validacao Pydantic
Cursor pagination >100K rowsNaoImplementar quando tabelas crescerem
Proibir SELECT * e COUNT >1MNaoAdicionar linting SQL

C2 — Indexes (<10K rows)

RequisitoEstadoNotas
Compostos comecam tenant_idVerificarAuditar indices existentes
pg_trgm para ILIKENaoAdicionar para busca de clientes
Alembic CONCURRENTLYNaoAplicar em proximas migracoes

C3 — Scaling (quando necessario)

RequisitoThresholdEstado
C3a PgBouncer>50 connsNao necessario agora (2 clientes)
C3b Read replicasread:write >5:1Nao necessario agora
C3c Partitioningstripe_events >5M rowsFuturo
C3d Redis cacheNao cachear billing/stockJa cumprido (Redis so para Celery)
C3e Materialized viewsQuery >1sNao necessario agora

C4 — Resiliencia (dia 1)

RequisitoEstadoNotas
C4a Backups PITRParcialCron diario existe. WAL archive por configurar
C4b DR runbookNaoCriar runbook
C4c pg_stat_statementsNaoActivar imediatamente
C4c Slow query 500msNaoConfigurar log_min_duration_statement
C4c Alertas ZabbixParcialPool/lag/disk por configurar
C4d RLSNaoMiddleware UnifiedTenantMiddleware faz filtering. RLS DB-level por implementar
C4d sslmode=requireVerificarConfirmar connection string
C4d Rotacao 90d VaultNaoConfigurar
C4d pgaudit billingNaoInstalar e configurar
C4e RGPD anonimizacaoSimanonymize_db.py existe
C4e Portability JSONNaoAdicionar export endpoint
C4e Audit 2 anosNaoConfigurar retencao
TabelaTipoRPOJustificacao
invoicesBilling5minSAF-T Moloni — obrigacao fiscal
payment_intentsStripe5minReconciliacao Stripe Connect
subscriptionsBilling5minEstado de cobranca
stripe_eventsWebhooks5minAuditoria Stripe
tax_recordsFiscal5minConformidade SAF-T
tenantsCore15minProvisioning
clientsCore15minDados pessoais RGPD

Accoes Imediatas (3 dias)

  1. pg_stat_statements — activar em todos os ambientes
  2. Slow query logginglog_min_duration_statement = 500
  3. Verificar sslmode — connection strings em .env e Vault

Accoes 1 Semana

  1. Backup encryption — chaves no Vault
  2. WAL archive — configurar para RPO 5min
  3. CI job db:hygiene — validar C0 automaticamente

Accoes 2 Semanas

  1. Simulacro DR — testar restore do backup
  2. RLS policies — adicionar a tabelas criticas
  3. pgaudit — activar para tabelas billing

Excepcoes

Nenhuma. O iaw-platform adopta o STD-DB-001 integralmente.


Referencia canonica: STD-DB-001 v1.0.0 (2026-04-15) Aprovado por: Dany Coutinho