Dev Factory Code Wiki

devfactory-services-dbgateway

Proxy do wire protocol do PostgreSQL com broker de credencial. Apps em qualquer

Python · 3 arquivos JSON · 2 arquivos Markdown · 2 arquivos JavaScript · 2 arquivos 13 arquivos

Estrutura

📁 clients/5 arquivos
· port-forward.ps1
· README.md
· test_node.js
· test_psycopg2.py
· test_raw_node.js
📁 k8s/1 arquivos
📁 dev/
· .gitignore
· config.sample.json
· Dockerfile
· gateway.py
· provision_and_test.py
· README.md
· version.json

README

devfactory-apis-dbgateway

Proxy do wire protocol do PostgreSQL com broker de credencial. Apps em qualquer linguagem usam suas libs/drivers normais (psycopg2, SQLAlchemy, pg, JDBC, Npgsql, GORM, Prisma…) para falar com os bancos da plataforma — sem SDK custom. O usuário conecta com uma credencial da plataforma (project key); a senha real do Aurora/RDS fica escondida no gateway.


psycopg2 / pg / JDBC / Npgsql ──(user=projectId, password=PROJECT KEY)──▶ apis-dbgateway ──(senha REAL)──▶ RDS/Aurora PG
        lib padrão, zero código de plataforma                            1) valida no apis-aws    por projeto: db df_{proj}_{env}
                                                                         2) provisiona lazy        + role app_{proj}_{env}
                                                                         3) injeta a senha real    (senha nunca vai pro cliente)

Self-service end-to-end: o gateway (1) valida a PROJECT KEY no apis-aws (POST /internal/project-keys/validate), (2) provisiona lazy o df_{project}_{env} + role app_{project}_{env} no RDS (como master, na 1ª conexão — igual ao provider relational que cria o db por projeto no 1º uso), com senha da role derivada por HMAC (determinística, sem armazenar por projeto), e (3) conecta como aquela role. Criar projeto → pegar a project key → conectar com qualquer driver: o banco nasce sozinho. Tokens estáticos no config.json servem de fallback/bootstrap.

Connection string que o app usa (igual a qualquer Postgres): postgresql://<projectId>:<PROJECT_KEY>@<dbgateway-host>:5432/<projectId>?sslmode=disable

sslmode=disable: o gateway responde N ao SSLRequest (não termina TLS com o cliente — ver Roadmap);
a ponte cliente↔gateway é interna à VPC e o leg gateway↔RDS é que é TLS. require falha aqui.
O database do handshake é ignorado — o gateway força o df_{projectId}_{env} da project key.

Isolamento (e o limite dele)

Decisão de arquitetura: gateway próprio (v1)

A plataforma já tem identidade (Entra + RBAC + project-keys) e console self-service. Teleport traria um modelo de identidade/RBAC paralelo (duplicaria o existente) e é pesado; pgcat é mais pooler que broker de identidade. O gateway próprio reusa a identidade da plataforma e mantém o broker simples. Pooling fica para PgBouncer/RDS Proxy atrás do gateway, sem reescrever o broker.

Componentes

Backend (dev)

RDS PostgreSQL devfactory-dev-postgres (VPC vpc-0f5b75c7bdfd5a8ed, SG devfactory-dev-pg-sg/5432 da VPC, master em Secrets Manager devfactory/dev/postgres-master, privado). Database por projeto df_{projectId}_{env} + role por projeto (espelha o modelo do serviço relational/SQL Server). Aurora PostgreSQL é drop-in (mesmo wire protocol) — só troca o backend.host.

Deploy (manual)


# config do(s) projeto(s) — backend creds reais, fora do git
cp config.sample.json config.json && $EDITOR config.json
kubectl create secret generic dbgateway-config -n devfactory-v1-dev --from-file=config.json=./config.json
kubectl apply -f k8s/dev/deployment.yaml
# imagem é publicada pelo CI no push em main; rolar para a nova:
kubectl set image deploy/apis-dbgateway apis-dbgateway=<ECR>/devfactory-apis-dbgateway:latest -n devfactory-v1-dev

Roadmap p/ produção

PoC original (3 linguagens validadas) em devfactory/samples/db-gateway.