#!/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 npm install --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!"