docs(status): marca fila A concluída — produção em v1.0.19 (715b2dc)
build-and-promote / build (push) Successful in 52s
build-and-promote / promote (push) Has been skipped

Atualiza STATUS-SEGURANCA-E-PRODUCAO.md: cabeçalho (prod v1.0.19), nova
seção "Fila A concluída" (push → fix CI → build → tag/promote → backup →
verificação), seção A marcada como feita, commits agora publicados e
"Como retomar" com pendências restantes (B + A.2) e rollback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-06-22 00:36:50 +02:00
parent 715b2dc81e
commit 8f9177a1c1
+28 -15
View File
@@ -1,8 +1,8 @@
# Status — Segurança & Produção (ScoreOdonto) # Status — Segurança & Produção (ScoreOdonto)
> Resumo do que foi feito e do que falta. Atualizado em **19/jun/2026**. > Resumo do que foi feito e do que falta. Atualizado em **22/jun/2026**.
> Produção no ar: **v1.0.18** (`fc00622`). **Todos os commits de código estão LOCAIS (sem `git push`)** — > Produção no ar: **v1.0.19** (`715b2dc`) — fila **A** concluída (push → CI → tag → deploy). **Commits
> exceto a rotação do `JWT_SECRET`, que **já foi aplicada e verificada em produção**. > publicados (`git push` feito).** A rotação do `JWT_SECRET` segue aplicada e verificada em produção.
--- ---
@@ -48,20 +48,28 @@ do frontend, via 3 helpers: `requireCapability`, `requireCapabilityRow`, `requir
### 5. Pré-requisito de produção ### 5. Pré-requisito de produção
- **`SCOREO_DB_PASS` provisionado na VPS1** (`/home/deploy/stack/scoreodonto.com/.env`, 0600), valores - **`SCOREO_DB_PASS` provisionado na VPS1** (`/home/deploy/stack/scoreodonto.com/.env`, 0600), valores
extraídos do container em execução, `.gitignore` da VPS1 ajustado, conexão validada (`SELECT 1` = ok). extraídos do container em execução, `.gitignore` da VPS1 ajustado, conexão validada (`SELECT 1` = ok).
**Produção não foi tocada.**
### 6. Fila A concluída — **PRODUÇÃO EM `v1.0.19`** (22/jun/2026)
- **`git push` do lote** (RBAC 99 rotas + segredos fora do compose/imagem + correções de frontend).
- **CI desbloqueada:** o build falhou na 1ª vez (`SCOREO_DB_PASS` com `:?` quebrava a interpolação do
compose no `docker compose build` do runner) → corrigido com placeholder runtime-only no `build.yml`
(commit `715b2dc`). Build verde → imagens `:715b2dc` (back+front, atômicas) publicadas no registry.
- **Tag `v1.0.19``715b2dc`:** job `promote` re-tagueou `:715b2dc``:v1.0.19` **sem rebuild**
(digests idênticos conferidos) e rodou `deploy-prod.sh v1.0.19` na VPS1.
- **Backup do banco antes do deploy:** `~/backups/scoreodonto_20260622_0005.dump` na VPS1 (PG18).
- **Verificado em produção:** `/api/version` = `v1.0.19` (`715b2dc`, PROD); `/api/health` = ok
(DB ok, cache ok). DEV (8020) realinhado ao mesmo commit via `./dev-build.sh` (mostra `v1.0.19`).
- **Rollback trivial:** `./deploy-prod.sh v1.0.18` (+ dump do banco, se necessário).
--- ---
## ⏳ O QUE FALTA ## ⏳ O QUE FALTA
### A) Levar o trabalho a produção (fila) ### A) Levar o trabalho a produção (fila) — ✅ CONCLUÍDA
1. **Imagem limpa `v1.0.19`** (remove segredos embutidos na imagem): 1. ~~**Imagem limpa `v1.0.19`**~~**FEITO** (ver "Fila A concluída" acima). Produção em `v1.0.19`/`715b2dc`.
`git push` → CI builda `:<sha>` com `.dockerignore``git tag v1.0.19``deploy-prod.sh v1.0.19`
validar `/api/version` + `/api/health`. **Rollback trivial:** `deploy-prod.sh v1.0.18`.
- Leva junto: RBAC (99 rotas), correções de frontend, etc.
2. **Compose novo na VPS1 (opcional, passo 2b):** `deploy-prod.sh` **não faz `git pull`** → o 2. **Compose novo na VPS1 (opcional, passo 2b):** `deploy-prod.sh` **não faz `git pull`** → o
`docker-compose.yml` da VPS1 segue o antigo. Para tirar a senha hardcoded do compose local, copiar o `docker-compose.yml` da VPS1 segue o antigo. Para tirar a senha hardcoded do compose local, copiar o
novo `docker-compose.yml` (scp) + recreate. O root `.env` já provisionado cobre isso. novo `docker-compose.yml` (scp) + recreate. O root `.env` já provisionado cobre isso. **Ainda pendente.**
### B) Rotação dos demais segredos (ainda vivos no histórico/artefatos antigos) ### B) Rotação dos demais segredos (ainda vivos no histórico/artefatos antigos)
3. **Senha do banco** (`scoreodonto_user`) — contida ao scoreodonto; exige refactor já feito no compose + 3. **Senha do banco** (`scoreodonto_user`) — contida ao scoreodonto; exige refactor já feito no compose +
@@ -88,11 +96,12 @@ do frontend, via 3 helpers: `requireCapability`, `requireCapabilityRow`, `requir
--- ---
## Commits locais da sessão (nenhum `push`, exceto JWT já aplicado em prod) ## Commits da sessão — **PUBLICADOS** (`git push` feito; produção em `v1.0.19`)
> **13 commits desta sessão** (incluindo este documento) ainda **locais**. O repositório está > Todos empurrados para `origin/main`. Promovidos a produção via tag `v1.0.19` (commit `715b2dc`).
> `ahead 14` de `origin/main` — o 14º (`7c5b199 docs(LEIA)`) é anterior a esta sessão.
> A rotação do `JWT_SECRET` **não** está nesta lista (foi ação operacional na VPS, sem commit). > A rotação do `JWT_SECRET` **não** está nesta lista (foi ação operacional na VPS, sem commit).
``` ```
715b2dc ci(build): desbloqueia build — SCOREO_DB_PASS placeholder na interpolação
8a27f3b docs+infra: corrige status (JWT/contagem) + versão em DEV (dev-build.sh)
6adf353 docs: status geral de segurança & produção (este documento) 6adf353 docs: status geral de segurança & produção (este documento)
f22e30e docs(skills): completa as 62 skills f22e30e docs(skills): completa as 62 skills
e83af04 docs(skills): biblioteca operacional e83af04 docs(skills): biblioteca operacional
@@ -110,7 +119,11 @@ fcf2fb1 security(infra): .env fora do git + .dockerignore
``` ```
## Como retomar ## Como retomar
- **Para publicar:** seguir a fila **A** (push → `v1.0.19` → deploy → validar health/version). - **Fila A:** ✅ concluída — produção em **`v1.0.19`** (`715b2dc`). Próximo release: `git push` → CI
builda `:<sha>``git tag vX.Y.Z` → job `promote` deploya na VPS1.
- **Antes de abrir a usuários reais:** concluir **B** (rotações) — sobretudo as API keys (você) e a senha do banco. - **Antes de abrir a usuários reais:** concluir **B** (rotações) — sobretudo as API keys (você) e a senha do banco.
- Tudo de código testado em **DEV** (`dev.scoreodonto.com`, banco `pgdev`); produção segue **v1.0.18** intacta. - **Pendência pontual:** passo **A.2** (compose novo na VPS1 via scp + recreate) para tirar a senha
hardcoded do compose local.
- Código rodando em **DEV** (`dev.scoreodonto.com`) e **PROD** no mesmo commit `715b2dc`; rollback de
prod: `./deploy-prod.sh v1.0.18` (+ dump `~/backups/scoreodonto_20260622_0005.dump` se necessário).
</content> </content>