Резервное копирование всех сайтов с консоли


Но возникает и вопрос резервирования самих сайтов. Веб-панель ISPConfig (актуальная версия) имеет встроенные возможности бэкапа, однако они не всегда достаточно гибкие:

Резервное копирование можно настроить только на один интервал (месяц, неделя или год);

Можно задать только одно условие для каждого сайта;

Отсутствует возможность хранить самый старый дамп (что важно, если нужно восстановить данные спустя долгое время);

Архивы создаются в формате ZIP, а мне предпочтительнее использовать более эффективный формат tar.bz2 по ряду причин.

Побродив по просторам интернета в поисках готового скрипта, я не нашел подходящего — большинство либо избыточны, либо не отвечают моим требованиям. В итоге пришлось написать собственный.


Основные задачи скрипта:

Делать резервные копии всех папок сайтов в отдельные архивы;

Автоматически подхватывать новые сайты при добавлении;

Хранить как свежие, так и старые бэкапы;

Сжимать файлы с помощью эффективного архиватора (bzip2);

Исключать временные и кэшированные папки;

Быть максимально простым для понимания и поддержки;

Не прерываться при ошибках и логировать все ошибки.


Тестовая конфигурация

ОС: Debian 12 (или новее)

Веб-панель: ISPConfig (актуальная версия)

Количество сайтов: 185

Общий объём данных: 470 Гб

Количество файлов на сайт: от 5 до 150 тысяч


Что делает скрипт:

Создает структуру папок по текущему году и месяцу для хранения резервных копий.

Выполняет обход папки с сайтами и поочерёдно архивирует каждый сайт в отдельный файл .tar.bz2.

Исключает из архива временные и кэшированные каталоги (backup, managed_cache, stats, resize_cache).

Загружает архивы на удаленный FTP сервер с ограничением скорости передачи.

Удаляет локальные временные архивы после успешной загрузки.

Автоматически удаляет бэкапы старше 2 лет.

Логирует ошибки и предупреждения.

вставляем скрипт:
крипт
#!/bin/bash

# Настройки FTP
FTPUSER="your_ftp_username"
FTPPASS="your_ftp_password"
FTPHOST="ftp.example.com"
FTPDIR="/backup/sites/"

# Пути к сайтам и временным файлам
SITEDIR="/var/www"
TMPDIR="/var/backup/site"

# Текущие дата, год и месяц
DATE=$(date +"%Y-%m-%d")
YEAR=$(date +"%Y")
MONTH=$(date +"%m")

# Проверяем и создаем директорию для бэкапов
mkdir -p "$TMPDIR/$YEAR/$MONTH"

# Получаем список сайтов (только папки)
cd "$SITEDIR" || exit 1
SITES=$(ls -d */ | sed 's#/##')

# Архивируем и заливаем каждый сайт
for SITE in $SITES; do
    echo "Архивируется сайт $SITE"

    ARCHIVE_PATH="$TMPDIR/$YEAR/$MONTH/${SITE}-${DATE}.tar.bz2"

    # Создаем архив с исключениями
    tar --exclude='backup' \
        --exclude='managed_cache' \
        --exclude='stats' \
        --exclude='resize_cache' \
        -cjf "$ARCHIVE_PATH" "$SITE"

    if [ $? -ne 0 ]; then
        echo "Ошибка архивации сайта $SITE" >> /var/log/file_backup.err
        continue
    fi

    # Загружаем на FTP с помощью lftp (альтернатива wput)
    lftp -u "$FTPUSER","$FTPPASS" "$FTPHOST" <<EOF
    set net:limit-rate 60000000
    cd $FTPDIR
    put "$ARCHIVE_PATH"
    bye
EOF

    if [ $? -eq 0 ]; then
        echo "Загрузка $ARCHIVE_PATH успешна, удаляем локальный архив"
        rm -f "$ARCHIVE_PATH"
    else
        echo "Ошибка загрузки $ARCHIVE_PATH" >> /var/log/file_backup.err
    fi
done

# Удаляем бэкапы старше 750 дней (~2 года)
find "$TMPDIR" -type f -mtime +750 -exec rm -f {} \;

# Удаляем пустые папки
find "$TMPDIR" -type d -empty -delete

Настройка cron для автоматического запуска
Добавьте в планировщик задач (crontab):
0 5 1 * * nice -n 18 /bin/filebackup.sh >> /var/log/file_backup.log 2>&1
Это запустит бэкап 1-го числа каждого месяца в 5 утра с низким приоритетом.

Теперь о результатах: 

Исключены временные и кеширующие папки, что уменьшает размер архива.

Используется современный и поддерживаемый инструмент lftp вместо устаревшего wput.

Скрипт устойчив к ошибкам и логирует их.

Автоматически удаляет старые бэкапы, освобождая место.

Можно легко расширять и адаптировать под любые задачи.


Оставить комментарий