Files
scoreodonto.com/doc/BANCO-DEV-ESTRATEGIA.md
T
VPS 4 Builder 5049ce9b8b
build-and-push / build (push) Successful in 1m10s
build-and-push / deploy (push) Has been skipped
docs: unifica documentação em doc/ (fonte única, sem sobreposição)
- Pasta única scoreodonto.com/doc/ com 9 docs que prestam:
  VERDADE-HOJE (estado, principal), DEPLOY-PRODUCAO (runbook), BANCO-DEV-ESTRATEGIA,
  REGISTRY, AUDITORIA-FUNCIONAL, BACKLOG-FINANCEIRO-V1, CRM_Ortodontia, RX_ARQUITETURA, RX_BACKLOG.
- Removidos os docs de infra sobrepostos/desatualizados (estado consolidado em VERDADE-HOJE;
  histórico fica no git): arquitetura.md, deploy.md, CHECKLIST-DEPLOY-PRODUCAO.md,
  PENDENCIAS.md, PENDENCIAS_E_DEPLOY.md.
- Pasta documentação/ eliminada.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 12:04:08 +02:00

161 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Estratégia de Banco DEV — Relatório + Plano de Implementação
> Documento de **decisão e plano** (16/jun/2026). A 1ª parte é o relatório técnico baseado em dados reais; a 2ª é o plano de implementação profissional, escalável para **todos os projetos atuais e futuros**.
> Relacionado: `arquitetura.md`, `PENDENCIAS.md` (P0 isolar dev), `VERDADE-HOJE.md`.
---
# PARTE 1 — Relatório técnico (dados reais, read-only)
**Servidor (VPS3):** PostgreSQL **18.4** · **PostGIS 3.6.2** (suíte completa disponível).
**Bancos (8 no total, ~175 MB somados):**
| Banco | Tamanho | Projeto | DEV na VPS4? | Tabelas | Índices | PostGIS |
|-------|--------:|---------|:------------:|--------:|--------:|:-------:|
| newwhats | 91 MB | NewWhats (VPS1) | não | — | — | — |
| giteadb | 22 MB | Gitea (infra) | não | — | — | não |
| **scoreodonto** | **21 MB** | **ScoreOdonto** | **sim** | 104 | 168 | **SIM (3 geog)** |
| mercado | 13 MB | Mercado (VPS1) | não | — | 187 | não |
| **dental_images** | **11 MB** | **RX** | **sim** | 8 | 25 | não |
| clube67 | 8.8 MB | Clube67 | não | — | — | — |
| **subdominio** | **8 MB** | **Subdomínio** | **sim** | 3 | 7 | não |
| postgres | 7.7 MB | default | — | — | — | — |
**Conclusões:**
- Os 3 bancos de DEV (scoreodonto, dental_images, subdominio) somam **~40 MB**. São minúsculos.
- **Só o ScoreOdonto usa PostGIS.** RX e Subdomínio não.
- Sem dependências entre bancos. Sem dados de crescimento histórico (não medível sem superuser); porte indica crescimento lento.
**Veredito:** a proposta "mirror + dev por projeto" (6 containers PostgreSQL/PostGIS) é **viável mas exagerada** para esse porte. Um "mirror" *rodando* não agrega sobre um **template database** ou um **dump**; é só RAM e complexidade a mais (~300600 MB RAM e 6× manutenção).
**Recomendação final:** **um único container PostGIS na VPS4** (rootless), multi-banco, com `*_ref` (referência/template, restaurado da VPS3) + `*_dev` (de trabalho, criado via `CREATE DATABASE ... TEMPLATE`). Reset instantâneo, custo ~50100 MB RAM, manutenção mínima, e **escala para qualquer projeto novo**.
---
# PARTE 2 — Plano de implementação (profissional, escalável)
> Objetivo: desgrudar **todos** os ambientes DEV do banco de produção (VPS3), com um padrão único que serve projetos atuais e futuros. **Produção (VPS3/VPS1) nunca é alterada — só lida (pg_dump).**
## 2.1 Arquitetura
```
VPS3 (produção, fonte da verdade)
│ pg_dump (somente leitura, one-way)
┌──────────────── VPS4 (rootless) — container único "pgdev" ───────────────┐
│ postgis/postgis 18-3.6 (porta interna, rede 'soc', sem exposição pública) │
│ │
│ scoreodonto_ref ──TEMPLATE──► scoreodonto_dev ◄── backend dev ScoreOdonto │
│ dental_images_ref ─TEMPLATE──► dental_images_dev ◄── backend dev RX │
│ subdominio_ref ──TEMPLATE──► subdominio_dev ◄── backend dev Subdomínio │
│ <novo>_ref ──TEMPLATE──► <novo>_dev ◄── (projeto futuro) │
└────────────────────────────────────────────────────────────────────────────┘
```
- **`*_ref`**: cópia fiel da produção (restaurada por `pg_dump`). Não se mexe — é a referência/"mirror".
- **`*_dev`**: banco de trabalho, recriável do `_ref` em segundos via `TEMPLATE`. É onde rodam migrações e testes.
- **Um container só** atende todos (Postgres lida com dezenas de bancos pequenos sem esforço). PostGIS coberto para quem precisa (ScoreOdonto); os demais simplesmente não usam.
## 2.2 Componentes (a criar em `/home/deploy/stack/pg-dev/`)
**a) `docker-compose.yml`** (container do banco DEV):
```yaml
services:
pgdev:
image: postgis/postgis:18-3.6 # confirmar tag p/ PG18+PostGIS3.6 (alt.: imresamu/postgis:18-3.6)
container_name: pgdev
restart: unless-stopped
environment:
POSTGRES_USER: devadmin
POSTGRES_PASSWORD: ${PGDEV_PASSWORD}
volumes:
- pgdev-data:/var/lib/postgresql/data
networks: [soc] # mesma rede dos backends de dev (acesso por DNS 'pgdev')
# SEM ports: publicado → só acessível internamente (segurança)
volumes:
pgdev-data:
networks:
soc:
external: true
```
**b) `pg-dev-projects.conf`** (manifesto — adicionar 1 linha por projeto novo):
```
# nome_projeto : banco_origem_VPS3 : usuario_origem
scoreodonto : scoreodonto : scoreodonto_user
rx : dental_images : clube67
subdominio : subdominio : mercado_admin
```
**c) `.env` / `secrets`** (gitignored, fora do repo): senha do `pgdev` (`PGDEV_PASSWORD`) e as senhas de origem da VPS3. **Nunca** versionar.
**d) `pg-dev-refresh.sh <projeto>`** — atualiza o `_ref` a partir da VPS3 e recria o `_dev`:
```
1. pg_dump -Fc da VPS3 (banco_origem) usando a credencial do manifesto (read-only).
2. DROP/CREATE <projeto>_ref no pgdev; pg_restore do dump → _ref.
3. DROP <projeto>_dev; CREATE DATABASE <projeto>_dev TEMPLATE <projeto>_ref.
```
**e) `pg-dev-reset.sh <projeto>`** — reset rápido (sem ir à VPS3):
```
DROP <projeto>_dev; CREATE DATABASE <projeto>_dev TEMPLATE <projeto>_ref;
```
## 2.3 Apontar os backends de DEV para o pgdev (sem afetar produção)
Parametrizar a `DATABASE_URL` no compose de cada projeto para usar variáveis com **default = produção**, e na VPS4 criar um `.env` (gitignored) que sobrescreve só no dev:
```
# no docker-compose.yml (default mantém produção intacta):
DATABASE_URL=postgresql://${DB_USER}:${DB_PASS}@${DB_HOST:-10.99.0.3}:5432/${DB_NAME:-scoreodonto}
# .env SÓ na VPS4 (dev):
DB_HOST=pgdev
DB_NAME=scoreodonto_dev
DB_USER=devadmin
DB_PASS=<senha pgdev>
```
- Na VPS1 (produção) não existe esse `.env` → resolve para `10.99.0.3/scoreodonto`. **Produção nunca muda.**
- Rebuild/recreate do backend de dev → passa a falar com `pgdev`.
## 2.4 Passos de implantação (quando aprovado)
1. Criar `/home/deploy/stack/pg-dev/` com o compose + scripts + `.env` (secrets).
2. `docker compose up -d pgdev` (rootless) + adicionar `pgdev` à rede `soc`.
3. Rodar `pg-dev-refresh.sh scoreodonto` (e rx, subdominio) → cria os `_ref` e `_dev`.
4. Criar o `.env` de dev em cada projeto e recriar os backends de dev.
5. Verificar: `dev.scoreodonto.com/api/version` sobe; conferir que escrita em dev cai em `scoreodonto_dev` (e produção em `scoreodonto` permanece intacta).
6. (privacidade) opcional: script de anonimização de dados sensíveis nos `_dev`.
## 2.5 Operação do dia a dia
- **Quer dados atualizados da produção?** `pg-dev-refresh.sh <projeto>`.
- **Sujou o dev e quer voltar ao limpo?** `pg-dev-reset.sh <projeto>` (segundos, via TEMPLATE).
- **Projeto novo?** adiciona 1 linha no `pg-dev-projects.conf` + `pg-dev-refresh.sh <novo>`. Pronto — sem novo container.
## 2.6 Custo e ganho
- **Custo:** 1 container (~50100 MB RAM, ~100 MB disco). Disco da VPS4 hoje: ~64 GB livres → folga total.
- **Ganho:** dev deixa de poder corromper produção; resets instantâneos; PostGIS coberto; padrão único que escala para N projetos sem multiplicar containers.
## 2.7 O que este plano deliberadamente NÃO faz
- Não cria 2 containers por projeto (over-engineering p/ bancos de 821 MB).
- Não usa réplica streaming (exigiria config superuser na VPS3 + WAL; canhão p/ 40 MB).
- Não toca em produção (VPS3/VPS1) — refresh é one-way, só `pg_dump`.
---
# PARTE 3 — Status de implementação (16/jun/2026)
**Implementado em `/home/deploy/stack/pg-dev/`** (Docker rootless da VPS4):
- ✅ Container **`pgdev`** (`postgis/postgis:18-3.6`) na rede `soc`, sem porta pública, volume `pgdev-data` em `/var/lib/postgresql`.
- ✅ Scripts `pg-dev-refresh.sh` / `pg-dev-reset.sh` + manifesto `pg-dev-projects.conf` + `secrets.env` (gitignored).
- ✅ Bancos criados (ref+dev): **scoreodonto** (20 MB, PostGIS 3.6.3, 1750 pacientes), **rx** (dental_images), **subdominio**.
**Backends apontados (via `.env` gitignored + `DATABASE_URL`/`PG_*` parametrizados com default=produção):**
-**ScoreOdonto**`pgdev/scoreodonto_dev` (validado: backend conecta, migrações OK; `dev.scoreodonto.com` no ar). Exigiu ajuste de SSL no backend (não força SSL p/ host `@pgdev`).
-**Subdomínio**`pgdev/subdominio_dev` (env confirmado, site no ar).
-**RX**`pgdev/rx_dev` (`rx.scoreodonto.com` no ar). Solução: app adicionado à rede `soc` + `DB_HOST/DB_NAME` parametrizados; role `clube67` criado no pgdev com a senha do `.secrets` (assim DB_USER/senha não mudam).
**Produção (VPS3/VPS1) intocada.** Para um projeto novo: adicionar linha no `pg-dev-projects.conf`, `SRC_<proj>_PASS` no `secrets.env`, rodar `./pg-dev-refresh.sh <proj>` e parametrizar o compose do projeto + `.env`.