feat: exemplos e documentacao da automacao de deploy GitOps (v1.0.0)
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
#!/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/<projeto>"
|
||||
PROD_VPS="10.99.0.1"
|
||||
PROD_USER="deploy"
|
||||
LOG_FILE="/home/deploy/stack/webhook-listener/deploy.log"
|
||||
LOG_TAG="[<projeto>]"
|
||||
DOCKER_HOST_REMOTE="unix:///run/user/1000/docker.sock" # Docker rootless na VPS1
|
||||
|
||||
# Trava de concorrência
|
||||
LOCK_FILE="/tmp/deploy-<projeto>.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!"
|
||||
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
# ─── deploy-prod-onhost.sh (EXEMPLO — Modelo B: build no host de produção) ────
|
||||
# Envia o CÓDIGO-FONTE para a VPS 1 e a própria VPS 1 builda a imagem Docker.
|
||||
# Mais simples; indicado quando o build é leve (ex.: app Node servindo estáticos).
|
||||
# Faz swap do container com quase zero downtime (--no-deps).
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
set -e
|
||||
|
||||
PROJECT_PATH="/home/deploy/stack/<projeto>"
|
||||
PROD_VPS="10.99.0.1"
|
||||
PROD_USER="deploy"
|
||||
LOG_FILE="/home/deploy/stack/webhook-listener/deploy.log"
|
||||
LOG_TAG="[<projeto>]"
|
||||
DOCKER_HOST_REMOTE="unix:///run/user/1000/docker.sock"
|
||||
SERVICE="app" # nome do serviço no docker-compose.yml
|
||||
|
||||
LOCK_FILE="/tmp/deploy-<projeto>.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 deploy (Modelo B — build no host)..."
|
||||
|
||||
# 1. GitOps na VPS 4
|
||||
cd "$PROJECT_PATH"
|
||||
log "📦 git fetch + reset --hard origin/main"
|
||||
git fetch origin main
|
||||
git reset --hard origin/main
|
||||
|
||||
# 2. Enviar o FONTE para a VPS 1 (sem node_modules, sem dados/segredos)
|
||||
log "🚚 rsync do código-fonte -> VPS1..."
|
||||
rsync -avz --delete \
|
||||
--exclude '.git' --exclude '.env' --exclude 'node_modules' \
|
||||
--exclude 'uploads' --exclude 'processed' --exclude 'data' \
|
||||
"$PROJECT_PATH/" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/"
|
||||
|
||||
# 3. Build + swap do container NA VPS 1
|
||||
log "🐳 build + up (no-deps) na VPS1..."
|
||||
ssh -o BatchMode=yes -o StrictHostKeyChecking=no "${PROD_USER}@${PROD_VPS}" "
|
||||
set -e
|
||||
cd ${PROJECT_PATH}
|
||||
export DOCKER_HOST=${DOCKER_HOST_REMOTE}
|
||||
docker compose build ${SERVICE}
|
||||
docker compose up -d --no-deps ${SERVICE}
|
||||
"
|
||||
|
||||
log "✅ Deploy (Modelo B) concluído sem downtime!"
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/bin/bash
|
||||
# ─── deploy-to-prod.sh (EXEMPLO — Promoção manual Staging -> Produção) ────────
|
||||
# Usado quando há um ambiente de STAGING na VPS 4 (docker-compose-staging.yml) e
|
||||
# se deseja promover a build já validada para a PRODUÇÃO (VPS 1).
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
set -e
|
||||
|
||||
PROJECT_PATH="/home/deploy/stack/<projeto>"
|
||||
PROD_VPS="10.99.0.1"
|
||||
PROD_USER="deploy"
|
||||
LOG_FILE="/home/deploy/stack/webhook-listener/deploy.log"
|
||||
LOG_TAG="[<projeto>-PROD]"
|
||||
DOCKER_HOST_REMOTE="unix:///run/user/1000/docker.sock"
|
||||
|
||||
LOCK_FILE="/tmp/deploy-<projeto>-release.lock"
|
||||
if [ -f "$LOCK_FILE" ]; then echo "🚨 Promoção 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 "🚀 Promovendo Staging (VPS4) -> Produção (VPS1)..."
|
||||
|
||||
# 1. Backend (fonte/artefato já validado em staging)
|
||||
rsync -avz --delete --exclude '.env' --exclude 'node_modules/.cache' \
|
||||
"$PROJECT_PATH/backend/" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/backend/"
|
||||
|
||||
# 2. Frontend (build compilada)
|
||||
rsync -avz --delete \
|
||||
"$PROJECT_PATH/frontend/dist/" "${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/frontend/dist/"
|
||||
|
||||
# 3. Infra (compose + configs)
|
||||
rsync -avz \
|
||||
"$PROJECT_PATH/docker-compose.yml" "$PROJECT_PATH/nginx" \
|
||||
"${PROD_USER}@${PROD_VPS}:${PROJECT_PATH}/"
|
||||
|
||||
# 4. Subir em produção
|
||||
log "🔄 docker compose up -d na VPS1..."
|
||||
ssh -o BatchMode=yes "${PROD_USER}@${PROD_VPS}" \
|
||||
"cd ${PROJECT_PATH} && DOCKER_HOST=${DOCKER_HOST_REMOTE} docker compose up -d"
|
||||
|
||||
log "✅ Promoção para produção concluída!"
|
||||
Reference in New Issue
Block a user