feat(deploy): padroniza rx p/ Build Once->Promote->Deploy (CI registry, compose.prod, badge/health)
- .gitea/workflows/build.yml: push->build rx-scoreodonto:<sha> no registry; tag->promote+deploy - docker-compose.prod.yml: image do registry, APP_VERSION/GIT_COMMIT em runtime - deploy-prod.sh: VPS1 pull + up --no-build (antigo vira deploy-prod-legado-webhook.sh) - /api/health usa APP_VERSION (tag) com fallback version.txt; badge no canto - webhook 9003 aposentado (gatilho agora e CI/tag) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Executable
+85
@@ -0,0 +1,85 @@
|
||||
#!/bin/bash
|
||||
# ─── deploy-prod.sh (rx.scoreodonto.com) ──────────────────────────────────────
|
||||
# GitOps: VPS4 (Builder) → VPS1 (Produção)
|
||||
# Modelo A: build na VPS4 (inclui build React + Docker) → imagem pronta → VPS1
|
||||
# ──────────────────────────────────────────────────────────────────────────────
|
||||
set -e
|
||||
|
||||
PROD_VPS="10.99.0.1"
|
||||
PROD_USER="deploy"
|
||||
PROD_PATH="/home/deploy/stack/rx.scoreodonto.com"
|
||||
LOG_FILE="/home/deploy/stack/webhook-listener/deploy.log"
|
||||
LOG_TAG="[rx.scoreodonto.com]"
|
||||
DOCKER_HOST_REMOTE="unix:///run/user/1000/docker.sock"
|
||||
|
||||
LOCK_FILE="/tmp/deploy-rx-scoreodonto.lock"
|
||||
if [ -f "$LOCK_FILE" ]; then
|
||||
echo "🚨 Deploy já em andamento!" | tee -a "$LOG_FILE"
|
||||
exit 1
|
||||
fi
|
||||
touch "$LOCK_FILE"
|
||||
trap 'rm -f "$LOCK_FILE"' EXIT
|
||||
|
||||
log() { echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] ${LOG_TAG} $1" | tee -a "$LOG_FILE"; }
|
||||
|
||||
log "🚀 Iniciando deploy..."
|
||||
|
||||
# 1. GitOps: fonte de verdade é o Gitea (VPS3)
|
||||
cd "$PROD_PATH"
|
||||
log "📦 git fetch + reset --hard origin/main"
|
||||
git fetch origin main
|
||||
git reset --hard origin/main
|
||||
|
||||
# 2. Bump de versão (sincroniza version.txt)
|
||||
log "🔢 Incrementando versão..."
|
||||
node update-version.js
|
||||
|
||||
# 3. Build do frontend React (Vite) — gera dental-server/dental-client/dist/
|
||||
# DEVE ocorrer ANTES do docker compose build para que o dist/ seja copiado na imagem
|
||||
log "⚛️ Build do React (Vite)..."
|
||||
cd "$PROD_PATH/dental-server/dental-client"
|
||||
cp "$PROD_PATH/dental-server/version.txt" public/version.txt
|
||||
# --include=dev: o listener roda com NODE_ENV=production, que por padrão pula
|
||||
# devDependencies — mas o Vite é devDependency e é necessário para o build.
|
||||
NODE_ENV=development npm install --include=dev --prefer-offline
|
||||
npm run build
|
||||
cd "$PROD_PATH"
|
||||
log "✅ Build React concluído — dist/ pronto"
|
||||
|
||||
# 4. Build da imagem Docker na VPS4 (inclui dental-client/dist/)
|
||||
log "🐳 docker compose build na VPS4..."
|
||||
docker compose -f "$PROD_PATH/docker-compose.yml" build app
|
||||
|
||||
# 5. Exportar imagem para arquivo
|
||||
log "💾 Exportando imagem para arquivo..."
|
||||
IMAGE_NAME="rxscoreodontocom-app:latest"
|
||||
IMAGE_TAR="/tmp/rxscoreodontocom-app.tar.gz"
|
||||
docker save "$IMAGE_NAME" | gzip > "$IMAGE_TAR"
|
||||
|
||||
# 6. Enviar docker-compose.yml + imagem + versão para VPS1
|
||||
log "🚚 rsync docker-compose + imagem + versão → VPS1..."
|
||||
rsync -avz \
|
||||
"$PROD_PATH/docker-compose.yml" \
|
||||
"$PROD_PATH/dental-server/version.txt" \
|
||||
"$IMAGE_TAR" \
|
||||
"${PROD_USER}@${PROD_VPS}:${PROD_PATH}/"
|
||||
|
||||
# 7. Carregar imagem e subir container na VPS1
|
||||
log "🚀 Load imagem + docker compose up na VPS1..."
|
||||
ssh -o BatchMode=yes -o StrictHostKeyChecking=no "${PROD_USER}@${PROD_VPS}" "
|
||||
set -e
|
||||
cd ${PROD_PATH}
|
||||
export DOCKER_HOST=${DOCKER_HOST_REMOTE}
|
||||
docker load < rxscoreodontocom-app.tar.gz
|
||||
docker compose up -d --no-deps app
|
||||
rm -f rxscoreodontocom-app.tar.gz
|
||||
"
|
||||
|
||||
# 8. Commit do bump de versão de volta ao Gitea (sem loop — listener ignora)
|
||||
# package.json NÃO é incluído: preserva cache do npm install no Docker
|
||||
log "💾 git commit + push do bump de versão..."
|
||||
git add dental-server/version.txt
|
||||
git commit -m "chore(deploy): bump version" || true
|
||||
git push origin main || true
|
||||
|
||||
log "✅ Deploy concluído sem downtime!"
|
||||
Reference in New Issue
Block a user