#!/bin/bash # ========================================== # BACKUP MONGODB - PRODUÇÃO # ========================================== # Suporta MongoDB nativo ou Docker # Uso: ./backup-mongodb.sh # # Adicionar ao crontab (deployuser): # 0 2 * * * cd /var/www/iciv && ./docker/production/backup-mongodb.sh >> ~/backup-mongodb.log 2>&1 set -e # ========================================== # CONFIGURAÇÕES # ========================================== SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" BACKUP_DIR="${BACKUP_DIR:-$PROJECT_DIR/backups/mongodb}" RETENTION_DAYS="${RETENTION_DAYS:-7}" CONTAINER_NAME="${MONGO_CONTAINER:-course-plat-mongodb}" ENV_FILE="${ENV_FILE:-$PROJECT_DIR/.env.production}" if [ -f "$ENV_FILE" ]; then set -a source <(grep -v '^\s*#' "$ENV_FILE") set +a fi MONGO_USERNAME="${MONGO_USERNAME:-admin}" MONGO_PASSWORD="${MONGO_PASSWORD:-password}" MONGO_DB="${MONGO_DB:-course-plat}" # ========================================== # FUNÇÕES # ========================================== log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" } error() { log "ERROR: $1" >&2 exit 1 } build_mongo_uri() { if [ -n "$MONGO_USERNAME" ] && [ -n "$MONGO_PASSWORD" ]; then echo "mongodb://${MONGO_USERNAME}:${MONGO_PASSWORD}@127.0.0.1:27017/${MONGO_DB}?authSource=admin" else echo "mongodb://127.0.0.1:27017/${MONGO_DB}" fi } # ========================================== # DETECÇÃO: Docker ou nativo # ========================================== DOCKER_CMD="$(command -v docker 2>/dev/null || true)" USE_DOCKER=false if [ -n "$DOCKER_CMD" ] && "$DOCKER_CMD" ps 2>/dev/null | grep -q "$CONTAINER_NAME"; then USE_DOCKER=true log "Modo: Docker (container: $CONTAINER_NAME)" else MONGODUMP="$(command -v mongodump 2>/dev/null || true)" if [ -z "$MONGODUMP" ]; then error "mongodump nao encontrado. Instale: sudo apt install mongo-tools" fi log "Modo: MongoDB nativo" fi # ========================================== # INÍCIO # ========================================== log "Iniciando backup do MongoDB..." mkdir -p "$BACKUP_DIR" TIMESTAMP=$(date +%Y%m%d-%H%M%S) BACKUP_FILE="$BACKUP_DIR/mongodb-$TIMESTAMP.gz" MONGO_URI=$(build_mongo_uri) log "Executando mongodump..." if [ "$USE_DOCKER" = true ]; then "$DOCKER_CMD" exec "$CONTAINER_NAME" mongodump \ --uri="$MONGO_URI" \ --archive \ --gzip \ > "$BACKUP_FILE" 2>&1 || error "Falha no mongodump (docker)" else "$MONGODUMP" \ --uri="$MONGO_URI" \ --archive="$BACKUP_FILE" \ --gzip \ 2>&1 || error "Falha no mongodump" fi if [ ! -f "$BACKUP_FILE" ]; then error "Arquivo de backup nao foi criado" fi BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) log "Backup concluido: $BACKUP_FILE ($BACKUP_SIZE)" # ========================================== # LIMPEZA # ========================================== log "Removendo backups antigos (mais de $RETENTION_DAYS dias)..." REMOVED=$(find "$BACKUP_DIR" \ -name "mongodb-*.gz" \ -type f \ -mtime +$RETENTION_DAYS \ -print -delete 2>/dev/null | wc -l) log "Backups removidos: $REMOVED" # ========================================== # RESUMO # ========================================== TOTAL_BACKUPS=$(find "$BACKUP_DIR" -name "mongodb-*.gz" -type f | wc -l) TOTAL_SIZE=$(du -sh "$BACKUP_DIR" 2>/dev/null | cut -f1) log "Resumo:" log " - Backup atual: $BACKUP_FILE" log " - Total de backups: $TOTAL_BACKUPS" log " - Tamanho total: $TOTAL_SIZE" log "Backup do MongoDB concluido com sucesso!"