- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
Этот скрипт представляет собой автоматизированную систему резервного копирования «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 "=== Работа скрипта успешно завершена ==="
Инструкция по установке:
- Создайте файл скрипта, например, в /root/scripts/site_backup.sh:
Bash:mkdir -p /root/scripts ee /root/scripts/site_backup.sh [*]Сделайте скрипт исполняемым: chmod +x /root/scripts/site_backup.sh - Добавьте его в планировщик cron, чтобы он выполнялся, например, каждый день в 3 часа ночи. Откройте системный cron:
Bash:crontab -e Добавьте строку в конец файла: 0 3 * * * /root/scripts/site_backup.sh > /dev/null 2>&1
