Após subir a nova versão, apaga as imagens vX.Y.Z locais além das 2 mais
recentes de cada repo (backend/frontend) — a recém-deployada e a anterior, que
fica de reserva para rollback de urgência. Automatiza a política que antes era
manual, evitando o acúmulo que chegou a dezenas de GB.
Salvaguardas: só toca em tags no formato vX.Y.Z; nunca remove imagem em uso por
container; best-effort no fim (|| true) — a poda jamais aborta o deploy nem o
rollback. Testado com uma tag falsa: remove só a antiga, preserva as 2 atuais.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
O proxy HTTPS de git.clube67.com corta uploads em ~60 s, a ~0,75 MB/s: blobs
acima de ~45 MB não publicam (o Gitea recebe o corpo truncado e responde 500).
O maior blob daqui tem 39,5 MB — publicava raspando, e qualquer dependência nova
quebraria o deploy. Pelo WireGuard são ~2,4 MB/s, sem corte.
Mesmo Gitea, mesmo repositório, mesmas tags: só muda o caminho de rede. Verificado
na VPS1 que `10.99.0.3:3000/ruicesar/scoreodonto-backend:v1.0.39` entrega o mesmo
image id que o container em execução — o rollback para tags antigas segue válido.
- docker-compose.prod.yml / deploy-prod.sh / workflow: registry passa a ser
10.99.0.3:3000. Requer `insecure-registries` no daemon da VPS1 e do runner
(já aplicado; a porta 3000 não é exposta à internet, só pelo túnel).
- promote: `buildx imagetools` não fala com registry HTTP, então o manifest é
copiado pela API v2 do registry. Byte a byte ⇒ digest idêntico, que continua
sendo conferido antes de deployar.
- promote: autentica com o `docker login` do runner. `secrets.REGISTRY_TOKEN` não
existe neste repo — o `docker login` mascarava isso; o curl não.
- docker-compose.prod.yml: `${SCOREODONTO_TAG:?}` no lugar de `:-latest`. Sem a
tag o deploy agora ABORTA, em vez de subir uma imagem indeterminada em produção.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- buildInfo.ts: hook useAppVersion() consome GET /api/version (fonte única = backend),
com fallback ao carimbo do bundle; deixa de depender do APP_VERSION manual.
- Versão exibida em Configurações ("Sobre o sistema") + telas públicas (Login/WaitingInvite);
removida do rodapé do Sidebar.
- compose.prod/deploy-prod.sh: injetam APP_VERSION (=tag) e APP_ENV=PROD em runtime,
desacoplando a versão semântica do build (commit/build seguem da imagem).
- constants.ts marcado legado + bump V1.0.15 (transitório até o Passo 5; evita colisão de tag).
- DEPLOY-PRODUCAO.md reescrito com status ✅/🧪/🎯 + nota de fase transitória.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- docker-compose.prod.yml: produção roda imagens versionadas do registry (sem build)
- deploy-prod.sh <tag>: pull da tag + up -d --no-build + verificação /api/version + rollback
- deploy.md: Metade A (CI) marcada como FEITA
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>