Files
octto-engenharia/scripts/restore-from-cloud.sh

240 lines
6.6 KiB
Bash

#!/bin/bash
#######################################################
# Script de Restauração de Backup do Occto Engenharia
#
# Uso:
# bash restore-from-cloud.sh \
# --backup-url "http://minio:9000/backups/backup-2025-11-29.tar.gz" \
# --backup-file "backup-2025-11-29.tar.gz" \
# --postgres-password "sua_senha" \
# --postgres-db "occto_db" \
# --postgres-host "postgres"
#######################################################
set -e
# Cores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Variáveis padrão
BACKUP_URL=""
BACKUP_FILE=""
POSTGRES_PASSWORD="adminpassword"
POSTGRES_USER="admin"
POSTGRES_DB="occto_db"
POSTGRES_HOST="postgres"
POSTGRES_PORT="5432"
MINIO_ENDPOINT="minio"
MINIO_PORT="9000"
MINIO_ACCESS_KEY="admin"
MINIO_SECRET_KEY="adminpassword"
PROJECT_DIR=$(pwd)
TEMP_DIR="/tmp/occto-restore-$$"
# Parsing de argumentos
while [[ $# -gt 0 ]]; do
case $1 in
--backup-url)
BACKUP_URL="$2"
shift 2
;;
--backup-file)
BACKUP_FILE="$2"
shift 2
;;
--postgres-password)
POSTGRES_PASSWORD="$2"
shift 2
;;
--postgres-db)
POSTGRES_DB="$2"
shift 2
;;
--postgres-host)
POSTGRES_HOST="$2"
shift 2
;;
--postgres-user)
POSTGRES_USER="$2"
shift 2
;;
--minio-endpoint)
MINIO_ENDPOINT="$2"
shift 2
;;
*)
echo -e "${RED}Opção desconhecida: $1${NC}"
exit 1
;;
esac
done
# Validações
if [ -z "$BACKUP_FILE" ]; then
echo -e "${RED}Erro: --backup-file é obrigatório${NC}"
exit 1
fi
if [ -z "$BACKUP_URL" ] && [ ! -f "$BACKUP_FILE" ]; then
echo -e "${RED}Erro: --backup-url é obrigatório se o arquivo não existir localmente${NC}"
exit 1
fi
# Funções
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[✓]${NC} $1"
}
log_error() {
echo -e "${RED}[✗]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[!]${NC} $1"
}
cleanup() {
log_info "Limpando arquivos temporários..."
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
# ============ INÍCIO ============
echo -e "${BLUE}"
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ Restauração de Backup - Occto Engenharia ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
log_info "Configurações:"
log_info " Banco de Dados: $POSTGRES_DB"
log_info " Host PostgreSQL: $POSTGRES_HOST"
log_info " MinIO: $MINIO_ENDPOINT:$MINIO_PORT"
log_info " Arquivo: $BACKUP_FILE"
echo ""
# 1. Preparar diretório temporário
log_info "Criando diretório temporário..."
mkdir -p "$TEMP_DIR"
log_success "Diretório criado: $TEMP_DIR"
# 2. Baixar backup se necessário
if [ -z "$BACKUP_URL" ] && [ -f "$BACKUP_FILE" ]; then
log_info "Usando arquivo local: $BACKUP_FILE"
cp "$BACKUP_FILE" "$TEMP_DIR/"
else
log_info "Baixando backup de $BACKUP_URL..."
cd "$TEMP_DIR"
curl -# -O "$BACKUP_URL"
log_success "Backup baixado"
fi
# 3. Extrair arquivo
BACKUP_PATH="$TEMP_DIR/$BACKUP_FILE"
if [ ! -f "$BACKUP_PATH" ]; then
log_error "Arquivo não encontrado: $BACKUP_PATH"
exit 1
fi
log_info "Extraindo arquivo ($BACKUP_FILE)..."
cd "$TEMP_DIR"
tar -xzf "$BACKUP_FILE"
log_success "Arquivo extraído"
# 4. Restaurar PostgreSQL
log_info "Conectando ao PostgreSQL ($POSTGRES_HOST:$POSTGRES_PORT)..."
DB_FILE="$TEMP_DIR/database.sql"
if [ ! -f "$DB_FILE" ]; then
log_error "database.sql não encontrado no backup!"
exit 1
fi
log_info "Terminando conexões do banco de dados..."
PGPASSWORD="$POSTGRES_PASSWORD" psql \
-h "$POSTGRES_HOST" \
-p "$POSTGRES_PORT" \
-U "$POSTGRES_USER" \
-tc "SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = '$POSTGRES_DB'
AND pid <> pg_backend_pid();" 2>/dev/null || true
log_info "Removendo banco antigo..."
PGPASSWORD="$POSTGRES_PASSWORD" dropdb \
-h "$POSTGRES_HOST" \
-p "$POSTGRES_PORT" \
-U "$POSTGRES_USER" \
--if-exists "$POSTGRES_DB" 2>/dev/null || true
log_info "Criando novo banco de dados..."
PGPASSWORD="$POSTGRES_PASSWORD" createdb \
-h "$POSTGRES_HOST" \
-p "$POSTGRES_PORT" \
-U "$POSTGRES_USER" \
"$POSTGRES_DB"
log_info "Restaurando dados do PostgreSQL (pode levar alguns minutos)..."
PGPASSWORD="$POSTGRES_PASSWORD" psql \
-h "$POSTGRES_HOST" \
-p "$POSTGRES_PORT" \
-U "$POSTGRES_USER" \
-d "$POSTGRES_DB" \
-f "$DB_FILE" > /dev/null 2>&1
log_success "PostgreSQL restaurado com sucesso!"
# 5. Restaurar MinIO (se arquivo existir)
MINIO_DATA_DIR="$TEMP_DIR/minio-data"
if [ -d "$MINIO_DATA_DIR" ]; then
log_info "Restaurando dados do MinIO..."
# Procurar containers Docker do MinIO
MINIO_CONTAINER=$(docker ps --filter "name=$MINIO_ENDPOINT" -q 2>/dev/null || echo "")
if [ -n "$MINIO_CONTAINER" ]; then
log_info "Copiando dados para container MinIO ($MINIO_CONTAINER)..."
docker cp "$MINIO_DATA_DIR/." "$MINIO_CONTAINER:/data/" 2>/dev/null || {
log_warning "Erro ao copiar para MinIO. Você pode fazer manualmente:"
log_warning "docker cp $MINIO_DATA_DIR/. seu-container-minio:/data/"
}
log_info "Reiniciando MinIO..."
docker restart "$MINIO_CONTAINER" > /dev/null 2>&1
log_success "MinIO restaurado!"
else
log_warning "Container MinIO não encontrado. Copie os dados manualmente:"
log_warning "cp -r $MINIO_DATA_DIR/* /seu/minio/data/"
fi
else
log_warning "Pasta minio-data não encontrada no backup"
fi
# 6. Resumo final
echo ""
echo -e "${GREEN}"
echo "╔════════════════════════════════════════════════════════════════╗"
echo "║ Restauração Concluída com Sucesso! ║"
echo "╚════════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
log_success "PostgreSQL restaurado"
[ -d "$MINIO_DATA_DIR" ] && log_success "MinIO restaurado"
echo ""
log_info "Próximos passos:"
echo " 1. Reinicie seus containers: docker-compose restart"
echo " 2. Verifique se a aplicação está funcionando"
echo " 3. Acesse http://seu-dominio.com para confirmar"
echo ""