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

Но возникает и вопрос резервирования самих сайтов. Веб-панель 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.
Скрипт устойчив к ошибкам и логирует их.
Автоматически удаляет старые бэкапы, освобождая место.
Можно легко расширять и адаптировать под любые задачи.
Оставить комментарий