Itnull

Команда форума
Администратор
Регистрация
22.05.13
Сообщения
28.414
Реакции
13.118
Веб-сайт
itnull.me
Этот скрипт представляет собой автоматизированную систему резервного копирования «all-in-one» (всё в одном), специально оптимизированную для операционной системы FreeBSD 14.

Он разработан по принципу «настроил и забыл» для защиты веб-ресурсов в условиях ограниченных системных ресурсов.

Основные возможности и функции скрипта​

1. Интеллектуальная защита от перегрузки (Бережное отношение к CPU и Диску)​

Это ключевая фишка скрипта. Он не «вешает» сервер и не замедляет работу сайта для пользователей во время резервного копирования.

  • Управление CPU (nice): Скрипт запускает архивацию с самым низким приоритетом. Если серверу понадобятся ресурсы для обработки запросов к сайту, бэкап мгновенно уступит им очередь.
  • Управление вводом-выводом (idprio): Использует специфичную для FreeBSD утилиту для перевода процесса в класс Idle. Архиватор будет читать и писать на диск только тогда, когда дисковая подсистема полностью свободна от других задач.

2. Умная проверка свободного места перед стартом​

Скрипт защищает сервер от критической ошибки «Disk Full» (когда из-за бэкапа забивается весь диск и падают все сервисы, включая базы данных).

  • Перед началом работы он измеряет точный размер папки сайта (du) и проверяет доступное место в целевом разделе (df).
  • Если места на диске меньше, чем весит сайт, скрипт безопасно останавливает работу, не засоряя систему недописанными файлами.

3. Фильтрация "мусора" (Исключения / Exclude)​

Скрипт экономит место на диске и ускоряет процесс, отсекая файлы, которые не имеют ценности для восстановления:

  • Автоматически пропускает временные файлы (tmp).
  • Игнорирует кэш сайта (cache), который всё равно пересоздается автоматически.
  • Не включает в архив объемные логи (.log), которые только раздувают размер бэкапа.

4. Автоматическая ротация (Хранение ровно 2 копий)​

Вам не нужно вручную чистить старые архивы.

  • Скрипт сам считает количество созданных им бэкапов.
  • Как только появляется свежий архив (третий по счету), скрипт находит самый старый из существующих и безвозвратно удаляет его, строго поддерживая лимит в 2 копии.

5. Полноценное логирование (Журнал работы)​

Все действия скрипта детально записываются в системный лог-файл /var/log/site_backup.log. В нем фиксируется:

  • Точное время старта и завершения.
  • Размер сайта и объем свободного места перед началом.
  • Имя созданного файла архива.
  • Имена старых файлов бэкапов, которые были удалены в процессе ротации.
  • Любые ошибки, если они возникли.

6. Мгновенные уведомления в Telegram​

Скрипт умеет быть автономным, но держать вас в курсе:

  • В случае успеха он отработает молча (чтобы не спамить).
  • В случае критической ошибки (например, закончилось место на диске или сломался архиватор tar), скрипт мгновенно отправит уведомление в ваш Telegram-канал или чат с описанием проблемы, чтобы вы могли оперативно вмешаться.

Кому подойдет этот скрипт?​

Администраторам и владельцам сайтов на FreeBSD, которые арендуют небольшие или средние VPS/VDS (где критичен каждый мегабайт оперативной памяти и важна стабильная работа процессора), желающим иметь надежную локальную страховку на случай сбоя в работе сайта.


Bash:
#!/bin/sh

# --- НАСТРОЙКИ ---
SOURCE_DIR="/usr/local/www/apache24/data"
BACKUP_DIR="/var/backups/site"
BACKUP_NAME="site_backup"
KEEP_COPIES=2

# Путь к лог-файлу
LOG_FILE="/var/log/site_backup.log"

# Настройки Telegram (заполните своими данными, если нужно)
TG_TOKEN="YOUR_BOT_TOKEN"
TG_CHAT_ID="YOUR_CHAT_ID"
# ------------------

# Функция для логирования
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "${LOG_FILE}"
}

# Функция отправки уведомлений в Telegram
send_tg() {
    if [ "${TG_TOKEN}" != "YOUR_BOT_TOKEN" ]; then
        curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
            -d "chat_id=${TG_CHAT_ID}" \
            -d "text=⚠️ Бэкап сервера: $1" > /dev/null
    fi
}

mkdir -p "${BACKUP_DIR}"
log "=== Запуск резервного копирования ==="

# --- ПРОВЕРКА СВОБОДНОГО МЕСТА ---
SOURCE_SIZE=$(du -sk "${SOURCE_DIR}" | awk '{print $1}')
AVAILABLE_SPACE=$(df -k "${BACKUP_DIR}" | tail -1 | awk '{print $4}')

if [ "${AVAILABLE_SPACE}" -lt "${SOURCE_SIZE}" ]; then
    MSG="ОШИБКА: Недостаточно места! Требуется: $((SOURCE_SIZE / 1024))MB, свободно: $((AVAILABLE_SPACE / 1024))MB."
    log "${MSG}"
    send_tg "${MSG}"
    exit 1
fi

# --- СОЗДАНИЕ БЭКАПА С ИСКЛЮЧЕНИЯМИ ---
DATE=$(date +%Y-%m-%d_%H%M)
TARGET_FILE="${BACKUP_DIR}/${BACKUP_NAME}_${DATE}.tar.gz"

log "Запуск архивации (размер данных: $((SOURCE_SIZE / 1024)) MB)..."

# Ограничиваем нагрузку и исключаем кэш/логи
# --exclude задается относительно SOURCE_DIR
idprio 29 nice -n 20 tar -czf "${TARGET_FILE}" \
    --exclude="*cache*" \
    --exclude="*tmp*" \
    --exclude="*.log" \
    -C "${SOURCE_DIR}" .

# Проверяем статус выполнения tar
if [ $? -eq 0 ]; then
    log "Архив успешно создан: ${TARGET_FILE}"
else
    MSG="КРИТИЧЕСКАЯ ОШИБКА: Ошибка при создании архива tar!"
    log "${MSG}"
    send_tg "${MSG}"
    exit 1
fi

# --- РОТАЦИЯ ---
TOTAL_BACKUPS=$(ls -1t ${BACKUP_DIR}/${BACKUP_NAME}_*.tar.gz 2>/dev/null | wc -l)

if [ "$TOTAL_BACKUPS" -gt "$KEEP_COPIES" ]; then
    log "Удаление старых копий..."
    # Удаляем и пишем в лог, что именно удалили
    ls -1t ${BACKUP_DIR}/${BACKUP_NAME}_*.tar.gz | tail -n +$(($KEEP_COPIES + 1)) | while read old_backup; do
        rm -f "${old_backup}"
        log "Удален старый бэкап: ${old_backup}"
    done
fi

log "=== Работа скрипта успешно завершена ==="


Инструкция по установке:​

  1. Создайте файл скрипта, например, в /root/scripts/site_backup.sh:

    Bash:
    mkdir -p /root/scripts
    ee /root/scripts/site_backup.sh
    [*]Сделайте скрипт исполняемым:
    chmod +x /root/scripts/site_backup.sh
  2. Добавьте его в планировщик cron, чтобы он выполнялся, например, каждый день в 3 часа ночи. Откройте системный cron:

    Bash:
    crontab -e
    
    Добавьте строку в конец файла:
    
    0 3 * * * /root/scripts/site_backup.sh > /dev/null 2>&1
 

Создайте аккаунт или войдите в систему, чтобы комментировать

Вы должны быть зарегистрированным, чтобы оставить комментарий

Создать аккаунт

Создайте аккаунт в нашем сообществе.

Войти

У вас уже есть аккаунт? Войдите здесь.

Назад
Сверху Снизу