Versão inicial do site Avanzato

This commit is contained in:
2026-05-25 23:31:32 -03:00
commit 4eed31a206
155 changed files with 31304 additions and 0 deletions
+185
View File
@@ -0,0 +1,185 @@
# Setup do Ambiente CI/CD - Avanzato
## Arquitetura
```
+------------------------------------------------------------------+
| SEU SERVIDOR |
| |
| +-------------------+ +-------------------+ +-----------+ |
| | Git Bare Repo | | Pipeline | | Site | |
| | /var/git/site |--->| /var/ci/ |--->| Nginx | |
| | | | | | | |
| | - hooks/post-receive | - build.sh | | /var/www | |
| | - hooks/pre-receive | - deploy.sh | | | |
| +-------------------+ +-------------------+ +-----------+ |
| ^ | |
| | v |
| +-------------------+ +-------------------+ |
| | Seu Computador | | Mautic | |
| | | | mkt.avanzato | |
| | git push | | | |
| +-------------------+ +-------------------+ |
+------------------------------------------------------------------+
```
## 1. Instalar dependencias no servidor
```bash
# Atualizar sistema
apt update && apt upgrade -y
# Instalar Git
apt install -y git curl
# Instalar Node.js 20
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
# Verificar
node -v # v20.x.x
npm -v # 10.x.x
# Instalar Nginx
apt install -y nginx
# Instalar PM2 (opcional, para gerenciar processos)
npm install -g pm2
```
## 2. Criar usuario de deploy
```bash
# Criar usuario dedicado
useradd -m -s /bin/bash deploy
# Adicionar ao grupo www-data
usermod -aG www-data deploy
# Criar chave SSH (como usuario deploy)
su - deploy
ssh-keygen -t ed25519 -C "deploy" -f ~/.ssh/id_ed25519 -N ""
# Ver chave publica (para autorizar pushes)
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
```
## 3. Criar repositorio Git bare
```bash
# Criar pasta
mkdir -p /var/git/site.git
cd /var/git/site.git
git init --bare
# Permissoes
chown -R deploy:deploy /var/git/site.git
chmod -R 755 /var/git/site.git
```
## 4. Configurar hooks Git
```bash
# Copiar hooks
sudo su - deploy
cp /var/ci/hooks/post-receive /var/git/site.git/hooks/post-receive
chmod +x /var/git/site.git/hooks/post-receive
```
## 5. Configurar Nginx
```bash
# Criar config
nano /etc/nginx/sites-available/avanzato
# Ver link: CI/CD > nginx-config.conf
# Ativar
ln -s /etc/nginx/sites-available/avanzato /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx
# SSL com Let's Encrypt
certbot --nginx -d avanzato.com.br -d www.avanzato.com.br
```
## 6. Criar estrutura de pastas
```bash
mkdir -p /var/www/avanzato # Site em producao
mkdir -p /var/www/avanzato-staging # Site em staging (opcional)
mkdir -p /var/ci # Pipeline scripts
mkdir -p /var/ci/logs # Logs de build/deploy
mkdir -p /var/ci/backups # Backups automaticos
mkdir -p /var/ci/assets # Assets preservados
chown -R deploy:www-data /var/www
chmod -R 755 /var/www
```
## 7. Configurar pipeline
```bash
# Copiar scripts do pipeline
cp /var/ci/scripts/* /var/ci/
chmod +x /var/ci/*.sh
# Configurar variaveis
nano /var/ci/config.env
# Conteudo:
DEPLOY_PATH=/var/www/avanzato
STAGING_PATH=/var/www/avanzato-staging
BACKUP_PATH=/var/ci/backups
LOG_PATH=/var/ci/logs
MAUTIC_URL=https://mkt.avanzato.com.br
```
## 8. Configurar seu computador local
```bash
# Adicionar remote no seu projeto local
cd /caminho/do/projeto/avanzato-site
git remote add servidor ssh://deploy@SEU_SERVIDOR/var/git/site.git
# Testar conexao
ssh deploy@SEU_SERVIDOR "echo 'Conectado!'"
# Push inicial
git push servidor main
```
## Comandos de uso diario
| Comando | Resultado |
|---------|-----------|
| `git push servidor main` | Deploy automatico para producao |
| `git push servidor staging` | Deploy para staging |
| `ssh deploy@SERVIDOR "cat /var/ci/logs/last-deploy.log"` | Ver ultimo log |
| `ssh deploy@SERVIDOR "ls /var/ci/backups"` | Listar backups |
## Estrutura final no servidor
```
/var/
git/
site.git/ # Repo bare (recebe pushes)
hooks/
post-receive # Hook de deploy automatico
ci/
scripts/
build.sh # Compila o site
deploy.sh # Envia para producao
preserve-assets.sh # Preserva logo/imagens
backup.sh # Cria backup
hooks/
post-receive # Template do hook
logs/ # Logs de execucao
backups/ # Backups automaticos
assets/ # Assets preservados
config.env # Variaveis de ambiente
www/
avanzato/ # Site em producao
index.html
assets/
backups/ # Backups antigos
```
+57
View File
@@ -0,0 +1,57 @@
# ============================================================================
# Configuracao do Pipeline CI/CD - Avanzato
# ============================================================================
# Edite estas variaveis conforme seu ambiente.
# ============================================================================
# --- CAMINHOS ---
# Caminho onde o site fica em producao
DEPLOY_PATH=/var/www/avanzato
# Caminho do site em staging (opcional)
STAGING_PATH=/var/www/avanzato-staging
# Caminho para backups
BACKUP_PATH=/var/ci/backups
# Caminho para logs
LOG_PATH=/var/ci/logs
# Caminho para assets preservados (logo, imagens)
ASSETS_PATH=/var/ci/assets
# --- SERVIDOR ---
# URL do site
SITE_URL=https://avanzato.com.br
# URL do site em staging
STAGING_URL=https://staging.avanzato.com.br
# --- INTEGRACOES ---
# URL do Mautic
MAUTIC_URL=https://mkt.avanzato.com.br
# URL do EspoCRM
ESPOCRM_URL=https://crm.avanzato.com.br
# Chave API do Brevo (opcional)
BREVO_API_KEY=
# Google Ads ID
GOOGLE_ADS_ID=AW-16714813566
# --- E-MAIL ---
# E-mail para notificacoes
NOTIFY_EMAIL=leads@avanzato.com.br
# --- CONFIGURACOES ---
# Numero de backups a manter
MAX_BACKUPS=10
# Timeout do build (segundos)
BUILD_TIMEOUT=300
+240
View File
@@ -0,0 +1,240 @@
#!/bin/bash
# ============================================================================
# Git Hook: post-receive
# ============================================================================
# Este hook executa automaticamente apos cada git push.
# Ele faz build e deploy do site sem intervencao manual.
#
# Instalacao:
# cp ci/hooks/post-receive /var/git/site.git/hooks/
# chmod +x /var/git/site.git/hooks/post-receive
# ============================================================================
set -e
# Cores
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
# Configuracoes
REPO_DIR="$(pwd)"
DEPLOY_DIR="/var/tmp/site-deploy-$(date +%s)"
CI_DIR="/var/ci"
LOG_FILE="/var/ci/logs/deploy-$(date +%Y%m%d-%H%M%S).log"
LAST_LOG="/var/ci/logs/last-deploy.log"
CONFIG_FILE="/var/ci/config.env"
# Criar pasta de logs
mkdir -p "$(dirname "$LOG_FILE")"
# Funcao de log
log() {
echo -e "$1" | tee -a "$LOG_FILE"
}
# Redirect output to log
exec > >(tee -a "$LOG_FILE")
exec 2>&1
log "${BLUE}============================================================${NC}"
log "${BLUE} Avanzato CI/CD - Deploy Automatico${NC}"
log "${BLUE}============================================================${NC}"
log ""
log "Data: $(date)"
log "Branch recebida: $1"
log "Commit: $2"
log ""
# Carregar configuracoes
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
log "${GREEN}[OK]${NC} Configuracoes carregadas."
else
log "${YELLOW}[AVISO]${NC} Arquivo config.env nao encontrado. Usando defaults."
DEPLOY_PATH="/var/www/avanzato"
STAGING_PATH="/var/www/avanzato-staging"
BACKUP_PATH="/var/ci/backups"
fi
# Detectar branch
while read oldrev newrev refname; do
BRANCH=$(git rev-parse --symbolic --abbrev-ref "$refname")
log "Processando branch: ${YELLOW}${BRANCH}${NC}"
case "$BRANCH" in
main|master)
TARGET="production"
DEPLOY_TARGET="$DEPLOY_PATH"
;;
staging)
TARGET="staging"
DEPLOY_TARGET="$STAGING_PATH"
;;
*)
log "${YELLOW}[IGNORADO]${NC} Branch '${BRANCH}' nao configurada para deploy."
log "Branches validas: main, master, staging"
exit 0
;;
esac
done
log ""
log "${BLUE}------------------------------------------------------------${NC}"
log "Ambiente: ${YELLOW}${TARGET}${NC}"
log "Destino: ${DEPLOY_TARGET}"
log "${BLUE}------------------------------------------------------------${NC}"
log ""
# ==========================================================================
# PASSO 1: Checkout do codigo
# ==========================================================================
log "${BLUE}[1/6]${NC} Checkout do codigo..."
mkdir -p "$DEPLOY_DIR"
git --git-dir="$REPO_DIR" --work-tree="$DEPLOY_DIR" checkout -f "$BRANCH" 2>&1
log "${GREEN}[OK]${NC} Codigo extraido para ${DEPLOY_DIR}"
log ""
# ==========================================================================
# PASSO 2: Instalar dependencias
# ==========================================================================
log "${BLUE}[2/6]${NC} Instalando dependencias..."
cd "$DEPLOY_DIR"
if [ -f "package.json" ]; then
npm ci --silent 2>&1 || {
log "${RED}[ERRO]${NC} Falha ao instalar dependencias."
exit 1
}
log "${GREEN}[OK]${NC} Dependencias instaladas."
else
log "${YELLOW}[AVISO]${NC} package.json nao encontrado. Pulando."
fi
log ""
# ==========================================================================
# PASSO 3: Build
# ==========================================================================
log "${BLUE}[3/6]${NC} Executando build..."
cd "$DEPLOY_DIR"
if [ -f "package.json" ]; then
npm run build 2>&1 || {
log "${RED}[ERRO]${NC} Falha no build."
exit 1
}
# Verificar se a pasta dist foi criada
if [ ! -d "dist" ]; then
log "${RED}[ERRO]${NC} Pasta dist/ nao encontrada apos build."
exit 1
fi
log "${GREEN}[OK]${NC} Build concluido com sucesso."
log "Tamanho: $(du -sh dist/ | cut -f1)"
else
# Se nao tem package.json, usar o proprio diretorio
log "${YELLOW}[AVISO]${NC} Projeto estatico detectado. Usando arquivos diretamente."
fi
log ""
# ==========================================================================
# PASSO 4: Preservar assets
# ==========================================================================
log "${BLUE}[4/6]${NC} Preservando assets customizados..."
cd "$DEPLOY_DIR"
# Se existir pasta custom-assets, preservar
if [ -d "custom-assets" ]; then
log "Assets customizados encontrados. Preservando..."
bash "${DEPLOY_DIR}/scripts/preserve-assets.sh" "${DEPLOY_DIR}/dist" 2>&1 || {
log "${YELLOW}[AVISO]${NC} Erro ao preservar assets (nao critico)."
}
else
log "${YELLOW}[AVISO]${NC} Nenhum asset customizado encontrado."
fi
# Se existem assets preservados no /var/ci/assets, copiar
if [ -d "/var/ci/assets" ] && [ "$(ls -A /var/ci/assets)" ]; then
log "Copiando assets preservados..."
cp -r /var/ci/assets/* "${DEPLOY_DIR}/dist/" 2>/dev/null || true
fi
log "${GREEN}[OK]${NC} Assets processados."
log ""
# ==========================================================================
# PASSO 5: Backup do site atual
# ==========================================================================
log "${BLUE}[5/6]${NC} Criando backup..."
if [ -d "$DEPLOY_TARGET" ] && [ "$(ls -A "$DEPLOY_TARGET" 2>/dev/null)" ]; then
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_PATH"
# Criar backup (excluindo backups antigos para nao duplicar)
tar -czf "${BACKUP_PATH}/${BACKUP_NAME}.tar.gz" \
-C "$(dirname "$DEPLOY_TARGET")" \
--exclude="backups" \
"$(basename "$DEPLOY_TARGET")" 2>/dev/null || true
# Limpar backups antigos (manter 10)
ls -t "${BACKUP_PATH}"/*.tar.gz 2>/dev/null | tail -n +11 | xargs -r rm -f
log "${GREEN}[OK]${NC} Backup criado: ${BACKUP_NAME}.tar.gz"
else
log "${YELLOW}[AVISO]${NC} Nada para fazer backup (primeiro deploy)."
fi
log ""
# ==========================================================================
# PASSO 6: Deploy
# ==========================================================================
log "${BLUE}[6/6]${NC} Fazendo deploy..."
# Criar diretorio se nao existir
mkdir -p "$DEPLOY_TARGET"
# Limpar conteudo antigo (exceto backups)
find "$DEPLOY_TARGET" -mindepth 1 -not -path "${DEPLOY_TARGET}/backups/*" -not -name "backups" -delete 2>/dev/null || rm -rf "${DEPLOY_TARGET:?}"/*
# Copiar novos arquivos
if [ -d "${DEPLOY_DIR}/dist" ]; then
cp -r "${DEPLOY_DIR}/dist/"* "$DEPLOY_TARGET/"
else
# Se nao tem dist, copiar tudo
cp -r "${DEPLOY_DIR}/"* "$DEPLOY_TARGET/"
fi
# Permissoes
chown -R www-data:www-data "$DEPLOY_TARGET"
chmod -R 755 "$DEPLOY_TARGET"
# Limpar pasta temporaria
rm -rf "$DEPLOY_DIR"
log "${GREEN}[OK]${NC} Deploy concluido!"
log ""
# ==========================================================================
# FINAL
# ==========================================================================
log "${BLUE}============================================================${NC}"
log "${GREEN} Deploy concluido com sucesso!${NC}"
log "${BLUE}============================================================${NC}"
log ""
log "Ambiente: ${TARGET}"
log "Caminho: ${DEPLOY_TARGET}"
log "Backup: ${BACKUP_PATH}"
log "Log: ${LOG_FILE}"
log "Data: $(date)"
log ""
# Atualizar link do ultimo log
ln -sf "$LOG_FILE" "$LAST_LOG"
# Notificar via webhook (opcional)
# curl -X POST "https://hooks.slack.com/services/..." \
# -H 'Content-Type: application/json' \
# -d "{\"text\":\"Deploy ${TARGET} concluido!\"}" 2>/dev/null || true
exit 0
+22
View File
@@ -0,0 +1,22 @@
#!/bin/bash
# ============================================================================
# Git Hook: pre-receive
# ============================================================================
# Executado ANTES do push ser aceito.
# Pode bloquear pushes que nao atendem criterios.
# ============================================================================
set -e
# Rejeitar pushes diretos na main (forcar via PR)
# Descomente se quiser forcar code review:
# while read oldrev newrev refname; do
# BRANCH=$(git rev-parse --symbolic --abbrev-ref "$refname")
# if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
# echo "Push direto na main bloqueado. Use pull request."
# exit 1
# fi
# done
# Aceitar todos os pushes por padrao
exit 0
+56
View File
@@ -0,0 +1,56 @@
#!/bin/bash
# ============================================================================
# Script de Backup - Avanzato
# ============================================================================
# Uso: bash ci/scripts/backup.sh [ambiente]
#
# Faz backup manual do site.
# ============================================================================
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
# Carregar config
CONFIG_FILE="/var/ci/config.env"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
fi
DEPLOY_PATH="${DEPLOY_PATH:-/var/www/avanzato}"
BACKUP_PATH="${BACKUP_PATH:-/var/ci/backups}"
AMBIENTE="${1:-production}"
# Determinar diretorio
if [ "$AMBIENTE" = "staging" ]; then
DEPLOY_PATH="${STAGING_PATH:-$DEPLOY_PATH-staging}"
fi
BACKUP_NAME="backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_PATH"
if [ ! -d "$DEPLOY_PATH" ] || [ ! "$(ls -A "$DEPLOY_PATH" 2>/dev/null)" ]; then
echo -e "${RED}Nada para fazer backup.${NC}"
exit 1
fi
echo -e "${GREEN}Criando backup...${NC}"
echo "Origem: $DEPLOY_PATH"
echo "Destino: $BACKUP_PATH/${BACKUP_NAME}.tar.gz"
tar -czf "${BACKUP_PATH}/${BACKUP_NAME}.tar.gz" \
-C "$(dirname "$DEPLOY_PATH")" \
--exclude="backups" \
"$(basename "$DEPLOY_PATH")"
echo -e "${GREEN}Backup criado: ${BACKUP_NAME}.tar.gz${NC}"
# Limpar backups antigos
MAX_BACKUPS="${MAX_BACKUPS:-10}"
echo "Limpando backups antigos (manter $MAX_BACKUPS)..."
ls -t "${BACKUP_PATH}"/*.tar.gz 2>/dev/null | tail -n +$((MAX_BACKUPS + 1)) | xargs -r rm -f
echo -e "${GREEN}Concluido!${NC}"
+86
View File
@@ -0,0 +1,86 @@
#!/bin/bash
# ============================================================================
# Script de Rollback - Avanzato
# ============================================================================
# Uso: bash ci/scripts/rollback.sh [numero]
#
# Restaura um backup anterior.
# ============================================================================
set -e
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
CONFIG_FILE="/var/ci/config.env"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
fi
DEPLOY_PATH="${DEPLOY_PATH:-/var/www/avanzato}"
BACKUP_PATH="${BACKUP_PATH:-/var/ci/backups}"
AMBIENTE="${1:-production}"
if [ "$AMBIENTE" = "staging" ]; then
DEPLOY_PATH="${STAGING_PATH:-$DEPLOY_PATH-staging}"
fi
echo -e "${BLUE}============================================================${NC}"
echo -e "${BLUE} Avanzato - Rollback${NC}"
echo -e "${BLUE}============================================================${NC}"
echo ""
# Listar backups disponiveis
echo "Backups disponiveis:"
echo ""
BACKUPS=()
i=1
for backup in $(ls -t "${BACKUP_PATH}"/*.tar.gz 2>/dev/null); do
nome=$(basename "$backup")
tamanho=$(du -h "$backup" | cut -f1)
data=$(stat -c %y "$backup" | cut -d'.' -f1)
printf " ${GREEN}%2d.${NC} %s (${tamanho}) %s\n" "$i" "$nome" "$data"
BACKUPS+=("$backup")
i=$((i + 1))
done
if [ ${#BACKUPS[@]} -eq 0 ]; then
echo -e "${RED}Nenhum backup encontrado.${NC}"
exit 1
fi
echo ""
read -p "Digite o numero do backup para restaurar: " NUM
if ! [[ "$NUM" =~ ^[0-9]+$ ]] || [ "$NUM" -lt 1 ] || [ "$NUM" -gt ${#BACKUPS[@]} ]; then
echo -e "${RED}Numero invalido.${NC}"
exit 1
fi
BACKUP="${BACKUPS[$((NUM - 1))]}"
echo ""
echo -e "Selecionado: ${YELLOW}$(basename "$BACKUP")${NC}"
echo "Destino: $DEPLOY_PATH"
read -p "Confirma? (s/N): " CONFIRM
if [ "$CONFIRM" != "s" ] && [ "$CONFIRM" != "S" ]; then
echo "Cancelado."
exit 0
fi
echo ""
echo -e "${YELLOW}Fazendo backup do estado atual antes do rollback...${NC}"
bash "$(dirname "$0")/backup.sh" "$AMBIENTE"
echo ""
echo -e "${YELLOW}Restaurando backup...${NC}"
rm -rf "${DEPLOY_PATH:?}"/*
tar -xzf "$BACKUP" -C "$(dirname "$DEPLOY_PATH")" --strip-components=1
echo -e "${GREEN}Rollback concluido!${NC}"
echo ""
echo "Verifique: ${DEPLOY_PATH}"
+75
View File
@@ -0,0 +1,75 @@
#!/bin/bash
# ============================================================================
# Script de Status - Avanzato
# ============================================================================
# Uso: bash ci/scripts/status.sh
#
# Mostra status do site, ultimos deploys e backups.
# ============================================================================
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m'
CONFIG_FILE="/var/ci/config.env"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
fi
DEPLOY_PATH="${DEPLOY_PATH:-/var/www/avanzato}"
BACKUP_PATH="${BACKUP_PATH:-/var/ci/backups}"
LOG_PATH="${LOG_PATH:-/var/ci/logs}"
echo -e "${BLUE}============================================================${NC}"
echo -e "${BLUE} Avanzato - Status do Ambiente${NC}"
echo -e "${BLUE}============================================================${NC}"
echo ""
# Status do site
echo -e "${GREEN}SITUACAO DO SITE${NC}"
echo " URL: ${SITE_URL:-https://avanzato.com.br}"
echo " Caminho: $DEPLOY_PATH"
echo " Tamanho: $(du -sh "$DEPLOY_PATH" 2>/dev/null | cut -f1 || echo 'N/A')"
echo ""
# Status do Nginx
echo -e "${GREEN}NGINX${NC}"
systemctl is-active nginx 2>/dev/null && \
echo -e " Status: ${GREEN}Ativo${NC}" || \
echo -e " Status: ${RED}Inativo${NC}"
echo ""
# Ultimo deploy
echo -e "${GREEN}ULTIMOS DEPLOYS${NC}"
if [ -f "${LOG_PATH}/last-deploy.log" ]; then
echo " Log: ${LOG_PATH}/last-deploy.log"
echo " Data: $(stat -c %y "${LOG_PATH}/last-deploy.log" | cut -d'.' -f1)"
else
echo -e " ${YELLOW}Nenhum deploy registrado.${NC}"
fi
echo ""
# Backups
echo -e "${GREEN}BACKUPS${NC}"
echo " Caminho: $BACKUP_PATH"
echo " Quantidade: $(ls "${BACKUP_PATH}"/*.tar.gz 2>/dev/null | wc -l)"
echo " Tamanho total: $(du -sh "$BACKUP_PATH" 2>/dev/null | cut -f1 || echo '0')"
echo ""
# Ultimos logs
echo -e "${GREEN}ULTIMOS LOGS${NC}"
ls -t "${LOG_PATH}"/*.log 2>/dev/null | head -5 | while read log; do
echo " $(basename "$log") - $(stat -c %y "$log" | cut -d'.' -f1)"
done
echo ""
# Assets preservados
echo -e "${GREEN}ASSETS PRESERVADOS${NC}"
echo " Caminho: ${ASSETS_PATH:-/var/ci/assets}"
echo " Conteudo:"
ls -la "${ASSETS_PATH:-/var/ci/assets}" 2>/dev/null || echo " (vazio)"
echo ""
echo -e "${BLUE}============================================================${NC}"