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