Автоматизиране на резервни копия с Bash скрипт и cron задачи

Автоматизиране на резервни копия с Bash скрипт и cron задачи

Резервните копия са критичен аспект от администрирането на всяка ИТ инфраструктура, особено когато се работи с важни данни. В тази статия ще разгледаме как можете да автоматизирате процеса на синхронизация и архивиране на файлове между локален и отдалечен сървър с помощта на Bash скрипт и cron задача.

Какво ще направим:

  1. Автоматизирано архивиране на файлове с rsync – ще създадем Bash скрипт, който ще синхронизира файлове между локален и отдалечен сървър.
  2. Изпращане на уведомления в Telegram – ще добавим функция за известяване, когато процесът на архивиране приключи успешно или се появи грешка.
  3. Автоматично изтриване на стари архиви – ще добавим функция за изтриване на файлове по-стари от 3 дни, за да спестим място.
  4. Настройване на cron задача за автоматизация – ще настроим скрипта да се изпълнява автоматично всеки ден в 03:00 ч.

Скрипт за синхронизация и резервно копие

Първо, нека създадем Bash скрипт, който ще се грижи за синхронизацията на файловете. Той ще използва rsync за копиране на файловете от отдалечен сървър към локален, ще проверява дали директориите съществуват, ще изпраща уведомления и ще изтрива стари файлове.

#!/bin/bash

REMOTE_USER="root"
REMOTE_HOST="10.110.110.100"
REMOTE_DIR="/backups/dump"
LOCAL_DIR="/backup_storage/big_proxmox/dump"
SSH_KEY="/root/.ssh/id_rsa"
EXCLUDE_FILE="/root/exclude-list.txt"

# Telegram настройки
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN_HERE"
TELEGRAM_CHAT_ID="YOUR_CHAT_ID_HERE"

# Функция за изпращане на съобщение в Telegram
send_telegram_message() {
    local message="$1"
    curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
        -d chat_id="${TELEGRAM_CHAT_ID}" \
        -d text="${message}" \
        -d parse_mode="HTML" > /dev/null
}

# Лог функция
log_message() {
    local message="$1"
    local log_file="/var/log/backup.log"
    echo "$(date '+%Y-%m-%d %H:%M:%S') - ${message}" >> "${log_file}"
}

# Проверка дали локалната директория съществува, ако не - създай я
if [ ! -d "$LOCAL_DIR" ]; then
    mkdir -p "$LOCAL_DIR"
    if [ $? -ne 0 ]; then
        error_message="Грешка: Не може да се създаде директорията ${LOCAL_DIR}"
        log_message "${error_message}"
        send_telegram_message "${error_message}"
        exit 1
    fi
fi

# Проверка за достъп до отдалечения сървър
ssh -i "$SSH_KEY" -o ConnectTimeout=10 "$REMOTE_USER@$REMOTE_HOST" exit 2>/dev/null
if [ $? -ne 0 ]; then
    error_message="Грешка: Не може да се осъществи връзка с отдалечения сървър ${REMOTE_HOST}"
    log_message "${error_message}"
    send_telegram_message "${error_message}"
    exit 1
fi

# Изпълнение на rsync с логване
rsync_output=$(rsync -avz --progress -e "ssh -i $SSH_KEY" --exclude-from="$EXCLUDE_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" "$LOCAL_DIR/" 2>&1)
rsync_status=$?

if [ $rsync_status -eq 0 ]; then
    success_message="Rsync завърши успешно"
    log_message "${success_message}"
    # Uncomment the line below if you want notifications on success too
    # send_telegram_message "${success_message}"
else
    error_message="Rsync се провали с код на грешка ${rsync_status}. Детайли: ${rsync_output}"
    log_message "${error_message}"
    send_telegram_message "${error_message}"
    exit 1
fi

# Изтриване на файлове по-стари от 3 дни
find_output=$(find "$LOCAL_DIR" -type f -mtime +3 -exec rm -f {} \; 2>&1)
find_status=$?

if [ $find_status -ne 0 ]; then
    error_message="Не можаха да се изтрият старите файлове. Грешка: ${find_output}"
    log_message "${error_message}"
    send_telegram_message "${error_message}"
    exit 1
fi

exit 0

Как да персонализирате скрипта:

  1. Параметри за отдалечения сървър:
    • Заменете стойностите на променливите REMOTE_USER, REMOTE_HOST, REMOTE_DIR, LOCAL_DIR и SSH_KEY, за да съответстват на вашата инфраструктура и конфигурация.
      • REMOTE_USER: Потребителското име за достъп до отдалечения сървър (например root или друг потребител).
      • REMOTE_HOST: IP адрес или домейн на отдалечения сървър.
      • REMOTE_DIR: Пътят до директорията, от която искате да архивирате данни на отдалечения сървър.
      • LOCAL_DIR: Локална директория, където ще се съхраняват резервните копия.
      • SSH_KEY: Пътят до вашия SSH ключ, който се използва за удостоверяване.
  2. Telegram настройки:
    • Заменете стойностите на TELEGRAM_BOT_TOKEN и TELEGRAM_CHAT_ID с вашите реални стойности за Telegram бота и chat ID. Това ще ви позволи да получавате уведомления за статус на резервното копие.

Добавяне на Cron задача

След като имате готовия скрипт, следващата стъпка е да го добавите към cron, за да го изпълнявате автоматично на редовни интервали. Това ще гарантира, че резервните копия се правят без нужда от ръчно вмешателство.

За да настроите cron задача, изпълнете следните стъпки:

  1. Отворете crontab редактора:
crontab -e

Добавете следния ред, за да стартирате скрипта всяка нощ в 04:00 ч.:

0 4 * * * /root/backup-sync.sh >> /var/log/backup-sync.log 2>&1

Това означава:

  • 0 4 * * *: Скриптът ще се изпълнява всеки ден в 04:00 ч.
  • /root/backup-sync.sh: Пътят до вашия Bash скрипт.
  • >> /var/log/backup-sync.log 2>&1: Всички изходни съобщения ще се записват в лог файл (/var/log/backup-sync.log).

Заключение

Автоматизирането на резервните копия с помощта на Bash скрипт и cron задача е удобен и ефективен начин за осигуряване на сигурността на данните. С този подход можете да минимизирате риска от загуба на важна информация, като същевременно спестите време и усилия при управлението на архивите.

Ако имате въпроси или искате да подобрите скрипта, не се колебайте да добавите нови функционалности и да го настроите според нуждите на вашата система.

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:

×