240 lines
6.6 KiB
Bash
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 ""
|