Введение / Зачем это нужно
Ручное создание резервных копий — утомительная и ненадёжная задача. Автоматизация через cron позволяет вам «забыть» о бэкапах, будучи уверенным, что важные данные (конфиги, базы данных, веб-проекты) регулярно сохраняются. Этот гайд покажет, как настроить простой, но эффективный механизм резервного копирования на любой Linux-системе.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к терминалу Linux (через SSH или локально).
- Установлен планировщик
cron(обычно есть по умолчанию). - Определите:
- Какие данные бэкапить (например,
/etc/,/var/www/, домашние директории). - Куда сохранять (локальная папка, отдельный диск, сетевой ресурс).
- С какой периодичностью (ежедневно, еженедельно).
- Какие данные бэкапить (например,
- Достаточно свободного места на целевом диске.
Шаг 1: Создайте bash-скрипт для бэкапа
Создайте файл скрипта, например, /usr/local/bin/backup.sh (требует sudo), или в домашней директории ~/scripts/backup.sh.
#!/bin/bash
# Переменные
BACKUP_DIR="/var/backups/myapp"
SOURCE_DIRS="/etc /var/www /home"
LOG_FILE="/var/log/backup.log"
DATE=$(date +"%Y-%m-%d_%H-%M-%S")
ARCHIVE="backup_$DATE.tar.gz"
# Создаём директорию для бэкапов, если её нет
mkdir -p $BACKUP_DIR
# Создаём архив с логированием
tar -czf $BACKUP_DIR/$ARCHIVE $SOURCE_DIRS 2>> $LOG_FILE
# Проверяем, успешно ли создался архив
if [ $? -eq 0 ]; then
echo "[$DATE] Успех: архив $ARCHIVE создан." >> $LOG_FILE
else
echo "[$DATE] ОШИБКА: не удалось создать архив $ARCHIVE." >> $LOG_FILE
exit 1
fi
# (Опционально) Удаляем старые бэкапы старше 30 дней
find $BACKUP_DIR -type f -name "*.tar.gz" -mtime +30 -delete
Пояснение:
tar -czf— создаёт сжатый tar-архив.2>> $LOG_FILE— перенаправляет сообщения об ошибках в лог.find ... -mtime +30 -delete— удаляет файлы, которым более 30 дней.
Дайте скрипту права на выполнение:
chmod +x ~/scripts/backup.sh
Шаг 2: Проверьте работоспособность скрипта вручную
Запустите скрипт от вашего пользователя (или с sudo, если скрипт в системной папке):
~/scripts/backup.sh
- Убедитесь, что в
$BACKUP_DIRпоявился файлbackup_YYYY-MM-DD_HH-MM-SS.tar.gz. - Проверьте лог
tail -f /var/log/backup.logна наличие ошибок.
Если скрипт не работает — исправьте пути, права или команды перед настройкой cron.
Шаг 3: Добавьте задание в crontab
Откройте редактор crontab для вашего пользователя:
crontab -e
Добавьте строку (в данном примере — ежедневно в 2:00 ночи):
0 2 * * * /home/ваш_пользователь/scripts/backup.sh
Формат crontab: минуты часы день_месяца месяц день_недели команда
0 2 * * *— 2:00 каждый день.- Используйте полный путь к скрипту.
Для выполнения от root (если нужно бэкапировать системные файлы) выполните sudo crontab -e и добавьте туда же.
Шаг 4: Настройте ротацию старых бэкапов
Мы уже добавили команду find ... -delete в сам скрипт. Вы можете настроить срок хранения, изменив +30 на другое число дней (например, +7 для недели).
Альтернативно, можно настроить ротацию через logrotate для более гибкого управления, но для простых бэкапов find достаточно.
Шаг 5: Проверьте работу автоматического бэкапа
- Временно измените время в crontab на ближайшие минуты (например,
*/2 * * * *— каждые 2 минуты) для теста. - Дождитесь срабатывания.
- Проверьте:
- Появился ли новый архив в
$BACKUP_DIR? - Добавилась ли запись в
/var/log/backup.log?
- Появился ли новый архив в
- Верните исходное расписание.
Проверка результата
- Архивы создаются? —
ls -lh /var/backups/myapp/ - Логи пишутся? —
tail -f /var/log/backup.log - Cron запускает задание? —
grep CRON /var/log/syslog(илиjournalctl -u cronна systemd). - Место на диске не заканчивается? —
df -h
Если всё работает, ваша система теперь автоматически защищает данные.
Возможные проблемы
Ошибка «Permission denied» при создании архива или записи в лог
- Причина: Пользователь, от которого работает cron, не имеет прав на чтение исходных директорий или запись в
$BACKUP_DIR/$LOG_FILE. - Решение:
- Запускайте скрипт от пользователя с нужными правами (например, root через
sudo crontab -e). - Или настройте права на файлы/директории:
chmodиchown. - Убедитесь, что целевая директория существует (
mkdir -p).
- Запускайте скрипт от пользователя с нужными правами (например, root через
Архив создаётся пустым или неполным
- Причина: В
tarуказаны некорректные пути или недостаточно места на диске. - Решение:
- Проверьте пути
SOURCE_DIRSв скрипте (отсутствие trailing slash у директории может повлиять на структуру архива). - Убедитесь, что на целевом диске достаточно места (
df -h).
- Проверьте пути
Cron не запускает скрипт, но вручную работает
- Причина: Cron использует минимальное окружение. В скрипте могут быть использованы относительные пути или переменные, недоступные в cron.
- Решение:
- В скрипте всегда указывайте полные абсолютные пути (как в примере выше).
- Если нужно, задавайте переменные окружения в самом скрипте или в crontab (например,
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin).
Слишком много старых бэкапов, диск переполнен
- Причина: Не работает команда удаления или срок хранения слишком велик.
- Решение:
- Проверьте синтаксис
findи путь$BACKUP_DIR. - Уменьшите срок хранения (параметр
-mtime +N). - Рассмотрите сжатие архивов (уже есть
gzipвtar -czf) или вынос бэкапов на внешний диск/облако.
- Проверьте синтаксис