Script de backup para Onedrive, DropBox e similares via rclone

Sugestão de script para automatizar o backup do banco de dados em um outro servidor através do rclone.

Exemplo de configuração no cron (diariamente as 05:00 AM)

0 5 * * * /opt/backup_rclone.sh >> /var/log/backup_rclone.log 2>&1

Script base, ajustar as variáveis com os dados de acesso corretos.

#!/bin/bash
#
#  Para configurar o rclone com OneDrive (necessário uma única vez no servidor):
#
#  * Instalar rclone
#  curl https://rclone.org/install.sh | sudo bash
#
#  * Configurar o remote OneDrive interativamente
#  rclone config
#  Escolha: n (new remote) - nome: onedrive - tipo: onedrive - siga o OAuth
# 
#  Após a autenticação, o script já funcionará sem mais configurações.
  
DB_HOST="localhost"
DB_USER="root"
DB_PASS=""

ONEDRIVE_REMOTE="onedrive"
ONEDRIVE_DIR="/backups"

#------------------------------------------------------------------------------------------
# Não mexer abaixo deste ponto a não ser que saiba exatamente o que esteja fazendo
#------------------------------------------------------------------------------------------

DATABASES=("vigo_erp" "mikrotik_erp" "mail")
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="backup_${TIMESTAMP}.sql.gz"
TMP_DIR=$(mktemp -d)
TMP_FILE="${TMP_DIR}/${BACKUP_FILE}"
DUMP_ARGS=(
    -h "${DB_HOST}"
    -u "${DB_USER}"
    -p"${DB_PASS}"
    --default-character-set=latin1
    --quick
    --force
    --hex-blob
    --max-allowed-packet=200M
    --single-transaction
    --routines
    --triggers
    --databases "${DATABASES[@]}"
)

check_dependencies() {
    local missing=()
    for cmd in mysqldump gzip rclone; do
        if ! command -v "${cmd}" &>/dev/null; then
            missing+=("${cmd}")
        fi
    done
    if [ ${#missing[@]} -gt 0 ]; then
        echo "[ERRO] Dependências ausentes: ${missing[*]}" >&2
        echo "       Instale as dependências faltantes e tente novamente." >&2
        exit 1
    fi
}

check_rclone_remote() {
    if ! rclone listremotes 2>/dev/null | grep -q "^${ONEDRIVE_REMOTE}:"; then
        echo "[ERRO] Remote '${ONEDRIVE_REMOTE}' não configurado no rclone." >&2
        echo "       Execute 'rclone config' para configurar o acesso ao OneDrive." >&2
        exit 1
    fi
}

cleanup() {
    [ -n "${TMP_DIR}" ] && [ -d "${TMP_DIR}" ] && rm -rf "${TMP_DIR}"
}
trap cleanup EXIT

check_dependencies
check_rclone_remote

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Iniciando dump dos bancos de dados..."

if ! mysqldump "${DUMP_ARGS[@]}" | gzip > "${TMP_FILE}"; then
    echo "[ERRO] Falha ao gerar o dump." >&2
    exit 1
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Dump gerado: ${BACKUP_FILE} ($(du -sh "${TMP_FILE}" | cut -f1))"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Enviando para o OneDrive..."

if ! rclone copy "${TMP_FILE}" "${ONEDRIVE_REMOTE}:${ONEDRIVE_DIR}" --log-level INFO 2>&1; then
    echo "[ERRO] Falha ao enviar para o OneDrive." >&2
    exit 1
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Backup enviado com sucesso: ${ONEDRIVE_REMOTE}:${ONEDRIVE_DIR}/${BACKUP_FILE}"