Files
scoreodonto.com/deploy-prod.sh
T
VPS 4 Builder 0a83c0f515
build-and-promote / build (push) Has been skipped
build-and-promote / promote (push) Successful in 1m40s
build: registry pela VPN (10.99.0.3:3000) + fail-fast na tag
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>
2026-07-10 16:46:21 +02:00

62 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# Deploy por TAG na PRODUÇÃO (VPS1) — Etapa 6
# Puxa a imagem versionada do registry do Gitea e sobe, SEM build.
#
# Uso (NA VPS1): ./deploy-prod.sh v1.0.13
# Rollback: ./deploy-prod.sh <tag-anterior>
#
# Pré-requisitos (uma vez): docker login git.clube67.com (token read:package).
# =============================================================================
set -euo pipefail
TAG="${1:-}"
if [ -z "$TAG" ]; then
echo "uso: ./deploy-prod.sh <vX.Y.Z> (ex.: ./deploy-prod.sh v1.0.13)"
echo "tags disponíveis no registry: veja git.clube67.com → Packages"
exit 1
fi
export DOCKER_HOST=unix:///run/user/1000/docker.sock
export SCOREODONTO_TAG="$TAG"
cd "$(dirname "$0")"
FILES="-f docker-compose.yml -f docker-compose.prod.yml"
echo "──────────────────────────────────────────────────────────────"
echo " Deploy ScoreOdonto → PRODUÇÃO tag: $TAG"
echo " Versão exibida (/api/version) será injetada em runtime = $TAG (commit/build vêm da imagem)"
echo "──────────────────────────────────────────────────────────────"
echo "⚠️ Recomendado: backup do banco de PRODUÇÃO antes (migrações rodam no boot do backend):"
echo " ssh deploy@10.99.0.3 'pg_dump -Fc scoreodonto -f ~/backups/scoreodonto_\$(date +%Y%m%d_%H%M).dump'"
echo
echo "[1/3] pull das imagens $TAG (registry pela VPN) ..."
# Registry = 10.99.0.3:3000 (WireGuard). Se o pull falhar (VPN fora do ar), exigimos
# a imagem local COM A TAG EXATA — nunca caímos para :latest.
if ! docker compose $FILES pull scoreodonto-backend scoreodonto-frontend 2>/dev/null; then
echo " pull indisponível — conferindo imagens locais com a tag $TAG ..."
for app in backend frontend; do
img="10.99.0.3:3000/ruicesar/scoreodonto-${app}:${TAG}"
docker image inspect "$img" >/dev/null 2>&1 || {
echo "ERRO: $img não existe nem no registry nem localmente."
echo " Confira a VPN (ping 10.99.0.3)."
exit 1
}
echo " ok: $img (local)"
done
fi
echo "[2/3] subindo (sem build) ..."
docker compose $FILES up -d --no-build scoreodonto-backend scoreodonto-frontend nginx
echo "[3/3] verificação (aguardando boot do backend) ..."
sleep 12
echo -n " versão no ar: "
curl -s --max-time 10 https://scoreodonto.com/api/version || echo "(ainda subindo — confira em alguns segundos)"
echo
docker logs scoreodontocom-scoreodonto-backend-1 --tail 5 2>&1 | grep -iE 'VERSION|MIGRATION' || true
echo
echo "✅ Deploy concluído (tag $TAG)."
echo " Rollback: ./deploy-prod.sh <tag-anterior>"