- build: fixa COMPOSE_PROJECT_NAME=scoreodontocom (imagem buildada batia com nome errado no tag/push → carimbo da Etapa 3 vazava) - novo job deploy: só em tags v*, SSH VPS4->VPS1 roda deploy-prod.sh (push na main não deploya) - deploy.md: Metade B + roadmap Etapa 6 = FEITO Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.1 KiB
Deploy ScoreOdonto — Como um commit vira produção (estado-ALVO)
Este documento responde uma pergunta: "como um commit vira produção?" Descreve o fluxo-alvo com Gitea como motor de CI/CD. O que já existe hoje está marcado como ✅; o que ainda será construído está marcado como 🔜. Para a realidade da infra ver
arquitetura.md. Para o procedimento manual executável hoje verDEPLOY-PRODUCAO.md.
1. Princípios (inegociáveis)
- Gitea (VPS3) é a fonte única da verdade e o motor de CI/CD.
- Produção (VPS1) nunca builda e nunca recebe código-fonte — só consome imagens versionadas prontas.
- Build acontece fora da produção (na CI / na VPS4).
- Deploy é um ato deliberado por TAG, nunca automático em todo push (a
mainé usada para desenvolvimento e o banco é compartilhado — promover sem querer é perigoso). - Rollback é trocar a imagem por uma tag anterior — sem rebuild, sem recompilar, sem copiar arquivo.
- Toda imagem é rastreável: carrega versão semântica + commit + data de build.
2. O fluxo-alvo, em uma frase
Push abastece o desenvolvimento e (🔜) produz uma imagem versionada no registry; criar uma tag
vX.Y.Zé o que promove essa imagem para produção.
git push ──► Gitea (VPS3) ──► CI: build da imagem ──► Registry privado (VPS3)
(na main) (versão+commit+data) imagem :vX.Y.Z
│
criar tag vX.Y.Z ────┘
▼
VPS1: docker compose pull + up -d
(troca o container pela imagem da tag)
▼
Produção rodando vX.Y.Z
3. As duas metades do fluxo
Metade A — Integração contínua (push → imagem) ✅ FEITO
- Desenvolvedor trabalha na VPS4 e valida em
https://dev.scoreodonto.com. git push origin main(ou tagv*) para o Gitea (VPS3).- A CI do Gitea (Gitea Actions) builda backend+frontend via
docker compose build, injetando versão, commit curto e data de build (build args →VITE_*/process.env). - As imagens são enviadas ao Container Registry do Gitea com tags
:<versão>,:<commit-curto>e:latest. - Nada vai para produção aqui. Esta metade só produz e guarda o artefato.
Implementado em 16/jun/2026. Workflow:
.gitea/workflows/build.yml. Runner:vps4-builder(act_runner 0.6.1, modo host com Docker, serviço systemdact_runnerna VPS4, labelself-hosted). Login no registry usa o secretREGISTRY_TOKENse presente, senão a credencial do host. Validado: push na main → build →scoreodonto-{backend,frontend}:v1.0.13/:<commit>/:latestpublicados.
Metade B — Entrega por tag (tag → produção) ✅ FEITO
- Quando uma versão está aprovada, cria-se uma tag semântica:
git tag v1.0.15 && git push origin v1.0.15. - A CI builda e publica a imagem
:v1.0.15no registry e o jobdeploy(só em tagsv*) promove para a VPS1. - Na VPS1, o
deploy-prod.sh <tag>fazdocker compose pull+up -d --no-buildapontando para a imagem da tag. - A versão visível (rodapé/endpoint
/api/version) confirma a tag no ar comenvironment: PROD.
Implementado em 16/jun/2026.
docker-compose.prod.yml(imagens do registry, sem build) +deploy-prod.sh <tag>(na VPS1) + jobdeployno workflow (SSH VPS4→VPS1, só em tags). Push na main NÃO deploya — só tags. Rollback:deploy-prod.sh <tag-anterior>. Validado: v1.0.13 promovida e confirmada (V1.0.13 · fc0d65f · PROD).
4. Versionamento visível (pré-requisito da confiança) ✅ FEITO
Implementado em 16/jun/2026 (Etapa 3). O build carimba versão/commit/data/ambiente via build args (
GIT_COMMIT,BUILD_TIME,APP_ENV,APP_VERSION) →import.meta.env.VITE_*no frontend eprocess.envno backend. Visível no rodapé do Sidebar, no endpointGET /api/versione na linha de boot[VERSION] …dos logs.
Cada build carimba e exibe:
ScoreOdonto
v1.0.15
commit: 7a9b3c1
build: 2026-06-16 14:32 UTC
ambiente: PRODUÇÃO
Visível no rodapé da aplicação, em um endpoint de diagnóstico (ex.: GET /api/version) e na linha de boot dos logs. Hoje a versão fica escondida no bundle index-<hash>.js (ver arquitetura.md §7) — esta é a primeira melhoria de maior valor.
5. Rollback 🔜
- Listar as tags/imagens no registry da VPS3.
- Na VPS1, apontar o compose para a tag anterior (
:v1.0.14) edocker compose up -d. - Recuperação em minutos, sem rebuild. O banco é aditivo (ver
arquitetura.md§5), então voltar o código é seguro; restaurar dump só em caso extremo.
6. Estado de hoje (honesto) ✅/❌
- ✅
git pushpara o Gitea funciona (guarda o código). - ❌ Não há build automático, não há registry, não há deploy automático. O antigo listener (porta 9002) foi deletado e não há webhook do scoreodonto.com no Gitea.
- ➡️ Enquanto a CI acima não existe, a promoção para produção é manual e está documentada passo a passo em
DEPLOY-PRODUCAO.md(build na VPS4 → enviar imagem para a VPS1 →up -d).
7. Roadmap para sair do "hoje" e chegar no "alvo"
| Etapa | Entrega | Status |
|---|---|---|
| 3 | Versionamento visível (rodapé + endpoint + log) | ✅ |
| 4 | Registry Docker privado na VPS3 | ✅ (Gitea Container Registry — ver REGISTRY.md) |
| 5 | Pipeline de build no Gitea (push → imagem → registry), sem deploy | ✅ (.gitea/workflows/build.yml + runner vps4-builder) |
| 6 | Deploy por TAG (vX.Y.Z → produção na VPS1) + rollback por imagem |
✅ (deploy-prod.sh + job deploy em tags) |
Quando as Etapas 3–6 estiverem prontas, este documento deixa de ter marcações 🔜 e passa a descrever o fluxo corrente.