#!/bin/bash # ─── deploy-prod-builder.sh (EXEMPLO — Modelo A: Builder-to-Host) ───────────── # Build na VPS 4 (Builder) e envio dos ARTEFATOS COMPILADOS para a VPS 1. # A VPS 1 NÃO compila nada — só recebe o build pronto e reinicia os containers. # Indicado para frontends pesados (Next.js/Vite) onde compilar em produção é caro. # ───────────────────────────────────────────────────────────────────────────── set -e PROJECT_PATH="/home/deploy/stack/" PROD_VPS="10.99.0.1" PROD_USER="deploy" LOG_FILE="/home/deploy/stack/webhook-listener/deploy.log" LOG_TAG="[]" DOCKER_HOST_REMOTE="unix:///run/user/1000/docker.sock" # Docker rootless na VPS1 # Trava de concorrência LOCK_FILE="/tmp/deploy-.lock" if [ -f "$LOCK_FILE" ]; then echo "🚨 Deploy já em andamento!"; 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 build & deploy (Modelo A)..." # 1. GitOps: a fonte de verdade é o Gitea (VPS3) cd "$PROJECT_PATH" log "📦 git fetch + reset --hard origin/main" git fetch origin main git reset --hard origin/main # 2. Incrementar versão (grava version.json / deploys.json) log "🔢 Incrementando versão..." node update-version.js # 3. Compilar na VPS 4 log "⚙️ Build backend..." ( cd backend && npm ci ) log "⚙️ Build frontend..." ( cd frontend && npm ci && npm run build ) # 4. Enviar SOMENTE artefatos compilados para a VPS 1 (rsync) log "🚚 rsync de artefatos -> VPS1..." rsync -avz --delete --exclude '.env' --exclude 'node_modules/.cache' \ "$PROJECT_PATH/backend/" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/backend/" rsync -avz --delete \ "$PROJECT_PATH/frontend/dist/" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/frontend/dist/" rsync -avz \ "$PROJECT_PATH/docker-compose.yml" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/" # 5. Reiniciar containers na VPS 1 (sem build) log "🔄 Restart de containers na VPS1..." ssh -o BatchMode=yes "${PROD_USER}@${PROD_VPS}" \ "cd ${PROJECT_PATH} && DOCKER_HOST=${DOCKER_HOST_REMOTE} docker compose up -d" # 6. Commit do bump de volta ao Gitea (o listener ignora este commit -> sem loop) log "💾 git commit + push do bump de versão..." git add version.json deploys.json 2>/dev/null || true git commit -m "chore(deploy): bump version" || true git push origin main || true log "✅ Deploy (Modelo A) concluído com sucesso!"