Резервное копирование FreeBSD и сайта через FSBackup
Файлы конфигурации и настроек приложений и операционной системы FreeBSD необходимо периодически резервировать. Файлы веб-сайтов и их базы данных также необходимо бэкапить (создавать резервные копии). Можно написать свой скрипт, но я решил использовать программу FSBackup. Утилита FSBackup имеет множество настроек и возможность загружать резервные копии на удаленный FTP или SSH сервер.
1. Установка FSBackup
1.1. Установка через пакеты / из портов
Устанавливаем через пакеты
pkg install fsbackup
Или устанавливаем из портов
cd /usr/ports/security/fsbackup/ && make install clean
В репозиториях FreeBSD внутри файлов fsbackup описание параметров на русском языке находится в неверной кодировки, из-за этого невозможно прочитать описание.
1.2. Установка из архива вручную
Программа FSBackup является набором PERL скриптов, можно скачать архив FSBackup.zip и распаковать в удобный каталог. В архиве исправлена проблема с кодировкой русского языка.
Для работы FSBackup необходим Perl, устанавливаем Perl 5
pkg install perl5
Создаем каталог для FSBackup
mkdir /usr/local/fsbackup/
Переходим в созданный каталог
cd /usr/local/fsbackup/
Загружаем архив с FSBackup
fetch https://notby.net/files/fsbackup.zip
Извлекаем содержимое скаченного архива
tar -xf fsbackup.zip
2. Резервное копирование FreeBSD
Всю систему копировать долго и нет необходимости. В резервную копию будут вносится настройки и параметры системы FreeBSD и программ , список установленных пакетов и конфигурации портов, журналы событий. Резервное копирование будет запускатся периодически по расписанию. Резервная копия базы данных и файлов сайтов будет создаватся отдельным скриптом, так как она требует более частного бэкапа.
Переходим в каталог куда была установлена программа FSBackup
cd /usr/local/fsbackup/
2.1. Скрипт запуска резервирования FreeBSD
Открываем основной скрипт запуска create_backup.sh
nano create_backup.sh
Изменяем необходимые параметры
#!/bin/sh
# Скрипт для запуска backup подсистемы из crontab.
# Директория где установлена программа.
backup_path="/usr/local/fsbackup"
# Список файлов конфигурации, разделенных пробелом.
# Директории для сохранения бэкапа в каждом конфигурационном файле должны
# отличаться ($cfg_remote_path, $cfg_local_path), сохранение в одной и тойже
# директории нескольких, описанных разными .conf файлами, бэкапов не допустимо.
# Указываем имя файла конфигурации, например freebsd_backup.conf, который позже создадим.
config_files="freebsd_backup.conf"
# Флаг бэкапа MySQL таблиц, запускается требующий предварительной настройки
# скрипт ./scripts/mysql_backup.sh, 1 - запускать, 0 - не запускать.
backup_mysql=0
# Флаг бэкапа PostgreSQL таблиц, запускается требующий предварительной настройки
# скрипт ./scripts/pgsql_backup.sh, 1 - запускать, 0 - не запускать.
backup_pgsql=0
# Флаг бэкапа SQLite таблиц, запускается требующий предварительной настройки
# скрипт ./scripts/sqlite_backup.sh, 1 - запускать, 0 - не запускать.
backup_sqlite=0
# Флаг бэкапа параметров системы, запускается требующий предварительной
# настройки скрипт ./scripts/sysbackup.sh, 1 - запускать, 0 - не запускать.
backup_sys=0
#############################################################################
cd $backup_path
# Оставил ulimit после тестирования, на всякий случай.
#ulimit -f 512000;ulimit -d 20000;ulimit -c 100;ulimit -m 25000;ulimit -l 15000
# Сохраняем MySQL базы
if [ $backup_mysql -eq 1 ]; then
./scripts/mysql_backup.sh
fi
# Сохраняем PostgreSQL базы
if [ $backup_pgsql -eq 1 ]; then
./scripts/pgsql_backup.sh
fi
# Сохраняем SQLite базы
if [ $backup_sqlite -eq 1 ]; then
./scripts/sqlite_backup.sh
fi
# Сохраняем системные параметры
if [ $backup_sys -eq 1 ]; then
./scripts/sysbackup.sh
fi
# Бэкап.
for cur_conf in $config_files; do
./fsbackup.pl ./$cur_conf
next_iter=`echo "$config_files"| grep "$cur_conf "`
if [ -n "$next_iter" ]; then
sleep 600 # Засыпаем на 10 минут, даем процессору остыть :-)
fi
done
Сохраняем файл и добавляем права для его выполнения, если они не установлены
chmod +x create_backup.sh
2.2. Настройка резервного копирования FreeBSD
Теперь необходимо создать файл конфигурации резервного копирования системы FreeBSD с именем, что указали в параметре config_files файла create_backup.sh.
На основе примера файла конфигурации cfg_example, можно создать свой файл конфигурации.
cp cfg_example freebsd_backup.conf
Редактируем или создаем файл конфигурации freebsd_backup.conf
nano freebsd_backup.conf
Файл конфигурации freebsd_backup.conf настроен под меня и мои требования, если необходимо вноси изменения в него.
Каталоги указанные в параметрах $cfg_remote_path и $cfg_local_path для сохранения бэкапа в каждом конфигурационном файле должны отличаться и существовать. Указание одного каталога в нескольких конфигурационных файлов приведет к перезаписыванию резервных копий друг другом.
# Файл конфигурации резервной копии параметров и настроек FreeBSD.
# Имя для бэкапа (строка состоящая из латинских букв, цифр и символа подчеркивания).
$cfg_backup_name = "freebsd_backup"; # Можно назвать как имя файла.
# Каталог для хешей локального метода бэкапа или временных хешей других методов.
$cfg_cache_dir = "/usr/local/fsbackup/cache";
# Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется
# не полениться и прописать полный путь к каждой программе.
# Внимание ! При использовании шифрования через gpg, рекомендуется
# установить значение $prog_gzip="", так как gpg перед шифрованием сжимает
# данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU.
$prog_md5sum = "/sbin/md5sum -b"; # -b — читать файл в бинарном режиме.
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip"; # Если равно "", то без сжатия.
$prog_pgp = ""; # Если равно "", то без шифрования.
# Метод вычисления контрольных сумм для определения изменений в файле:
# timesize - учитывается время последнего изменения файла, его размер, атрибуты файла.
# md5 - все параметры timesize + контрольная сумма содержимого файла.
$cfg_checksum = "timesize"; # Так как бэкап делается полный, параметр игнорируется
# Определение типа резервной копии (backup):
# backup - инкрементальный бэкап в архив (т.е. копируются только изменившиеся файлы с последнего бэкапа);
# full_backup - полный бэкап в архив, без хеша (т.е. всегда копируются все файлы);
# sync - синхронизация дерева (только для типа хранилища ssh или local);
# hash - только генерация хеша, без помещения файлов в архив.
$cfg_backup_style = "full_backup"; #Всегда делаем полный бэкап.
# Число копий бэкапа, при инкрементальном бэкапе, после которых производится
# полный бэкап. Например, при = 7, 6 раз будут помещаться только изменения,
# на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз.
$cfg_increment_level = 7; # При full_backup параметр игнорируется.
# Сохранение предыдущей версии полного бэкапа.
# Старая версия помещается в подкаталог OLD.
# 0 - не сохранять, 1 - сохранять
$cfg_save_old_backup = 1;
# Тип хранилища для резервной копии (backup):
# local - хранение бэкапа в локальной файловой системе;
# remote_ssh - копирование бэкапа с использованием SSH;
# remote_ftp - копирование бэкапа по FTP.
$cfg_type = "remote_ftp"; # Пусть будет FTP сервер.
# Параметры необходимые для копирования бэкапа через ssh и ftp:
$cfg_remote_host = "10.200.0.10"; # IP-адрес или домен удаленной машины.
$cfg_remote_login = "user"; # Логин FTP или пользователь SSH.
$cfg_remote_path = "/backup/freebsd/"; # Путь внутри FTP или SSH (Абсолютный путь).
# Режим соединения с FTP сервером (пассивный или активный).
# 0 - Active mode, 1 - Passive mode.
$cfg_remote_ftp_mode = 0;
# Пароль пользователя FTP сервера. (SSH подключается через сертификаты).
$cfg_remote_password = "Сложный_Пароль";
# Каталог для локальной версии бэкапа (local), не должен быть в каталоге cache.
# Каталог можно настроить для синхронизации через облачное файловое хранилище.
$cfg_local_path = "/mnt/ubs-flash-drive/freebsd_backup/";
# Время в днях, файлы созданные ранее которого не будут помещаться в бэкап.
$cfg_time_limit = 0; # 0 - помещать все файлы.
# Максимально допустимый размер файла в Kb для помещения в бэкап.
$cfg_size_limit = 0; # 0 - помещать все файлы.
# Максимальный размер (в Kb) несжатого архива с бэкапом.
# При превышении, запись продолжается отдельные архивы '*-1', '*-2' и т.д.
$cfg_maximum_archive_size = 0; # 0 - размер архива неограничен.
# Корневая директория, относительно которой файлы помещаются в бэкап и
# относительно которой описаны пути для помещения файлов.
$cfg_root_path = "/";
# Шифрования резервную копию (backup) с помощью PGP.
# Если поле не заполнено, то pgp не применяется.
# Иначе поле содержит UserId записи в public key ring.
# $cfg_pgp_userid = "backup"; # Мне оно не нужно.
# Уровень выводимых программой сообщений:
# 0 - Подавить вывод любых сообщений;
# 1 - Выводить сообщения об ошибках и предупреждения;
# 2 - Выводить все сообщения;
$cfg_verbose = 2; # Вначале необходимо выводить все.
# Рекурсивный просмотр запрещенных директорий.
# 0 - рекурсивно просматривать все содержимое директорий помеченных для бэкапа,
# в том числе и содержимое директорий запрещенных правилами '!', '!d' и '=!'.
# 1 - не использовать рекурсивный вход в запрещенные для бэкапа директории
# (увеличивается скорость бэкапа, уменьшает гибкость настройки).
$cfg_stopdir_prune=0;
1; # Конец параметров конфигурации, '1;' - обязательно.
# Список файлов и условий для помещения в резервную копию (backup).
# Путь:
# /dir[/file] - путь к файлу/директории для бэкапа.
# !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь.
# Маски:
# =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f~ - маска для файла. Первый или второй символ.
# d~ - маска для директории. Первый или второй символ.
# Маски отрицания:
# =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f! - "НЕ" маска для файла. Первый или второй символ.
# d! - "НЕ" маска для директории. Первый или второй символ.
# Приоритет выполнения: 1. =!, 2. f!, 3. f~, 4. d!, 5. =~, 6. d~, 7. !, 8. путь.
# Начало описание копируемых файлов и каталогов в резервную копию (backup):
__DATA__
# каталог программы FSBackup, за исключением cache
/usr/local/fsbackup
!/usr/local/fsbackup/cache
# База установленных пакетов
/var/db/pkg
# Конфигурации портов
/var/db/ports
# Конфигурация ядра FreeBSD (x86-64)
/usr/src/sys/amd64/conf
# Каталог логов
/var/log
# Домашний каталог пользователей и root
/home
/root
# Конфигурации и настройки
/etc
/var/cron/tabs
/var/spool/cron
/usr/local/etc
# Это основные каталоги, можно добавить все что нужно, хоть всю систему.
# Я особо смысла в масках под свои задачи не вижу, поэтому с ними не разбирался.
Больше читай в файлах README, FAQ, cfg_example которые находятся в каталоге установки FSBackup (/usr/local/fsbackup/).
Сохраняем файл и устанавливаем права чтения и редактирования только для root
chmod 0600 freebsd_backup.conf
Так как это файл содержит пароль от FTP сервера в открытом виде, а скрипт бэкапа запускается от root, то только он должен иметь возможность читать содержимое файла.
2.3. Проверка резервного копирования FreeBSD
Запускаем скрипт резервного копирования конфигурации и настроек программ и системы FreeBSD
./create_backup.sh
Резервная копия успешно создана и загружена на удаленный FTP сервер.
Этой же командой ./create_backup.sh
можно делать бэкап вручную и не добавлять в crontab, если система редко изменяется.
2.4. Автоматическое создание резервной копии FreeBSD (crontab)
Логично создавать резервную копию конфигурации, настроек и журнала событий (логов) после выполнения события periodic weekly, а оно проходит по субботам в 4 часа 15 минут.
Открываем файл /etc/crontab
nano /etc/crontab
Добавляем следующею строку:
30 4 * * 6 root /usr/local/fsbackup/create_backup.sh
Скрипт create_backup.sh будет запускатся каждую субботу в 4 часа 30 минут, через 15 минут после события periodic weekly. Вывод работы скрипта будет присылатся на почту root пользователю.
Если нет необходимости в уведомлениях работы скрипта, его вывод можно отправить в null
30 4 * * 6 root /usr/local/fsbackup/create_backup.sh > /dev/null
Сохраняем файл и закрываем его.
3. Резервное копирование базы данных и файлов сайта
Веб-сайт в зависимости от его типа необходимо делать резервную копию чаще чем системы. Будет создаватся резервную копию только новых файлов и базы данных сайта каждый день, если были изменения от предыдущего бэкапа. Раз в 10 дней будет полная резервная копия всех файлов и базы данных сайта в одном архиве.
Переходим в каталог установки программы FSBackup
cd /usr/local/fsbackup/
3.1. Скрипт запуска резервирования сайта
Создаем скрип запуска резервной копии для сайтов, например скрипт будет иметь имя create_websites_backup.sh
nano create_websites_backup.sh
Скрипт запуска create_websites_backup.sh будет настроек на резервную копию всех сайтов и их баз данных на сервере.
#!/bin/sh
# Скрипт резервной копии файлов сайта и базы данных MariaDB (MySQL).
# Каталог, где установлена программа.
backup_path="/usr/local/fsbackup"
# Файл конфигурации бэкапа для сайтов. Позже, его создадим.
# Можно указать несколько файлов через пробел, для раздельного бэкапа сайтов.
config_files="websites_backup.conf"
# Создавать бэкапа MariaDB (MySQL) таблиц.
# Запускает скрипт ./scripts/mysql_backup.sh, необходимо настроить его.
backup_mysql=1
#############################################################################
cd $backup_path
# Сохраняем MySQL (MariaDB) базы данных
if [ $backup_mysql -eq 1 ]; then
./scripts/mysql_backup.sh
fi
# Запуск резервного копирования (backup).
for cur_conf in $config_files; do
./fsbackup.pl ./$cur_conf
done
Сохраняем файл и добавляем права для его выполнения
chmod +x create_websites_backup.sh
3.2. Настройка скрипта MySQL (MariaDB)
Открываем файл настройки резервного копирования MySQL (MariaDB) баз данных и таблиц.
nano scripts/mysql_backup.sh
#!/bin/sh
# Скрипт резервного копирования MySQL (MariaDB) баз данных и таблиц.
##### Параметры скрипта резервного копирования MariaDB (MySQL) #####
# Имя бэкапа.
backup_name="websites_all_db"
# Метод резервного копирования:
# full - полный бэкап всех баз (рекомендуется).
# db - бэкап только указанных в backup_db_list баз данных.
# notdb - бэкап всех баз, кроме указанных в backup_db_list баз данных.
#
# Возможно исключение из бэкапа выборочных таблиц, тогда формат выглядит так:
# "db_first_site db_second_site:cache db_second_site:sessions". Будет сделал бэкап всех баз,
# коме базы db_first_site и таблиц cache и sessions базы db_second_site
backup_method="db" # Укажу список баз данных сайтов.
# Список включаемых (db) или исключаемых (notdb) из бэкапа баз, через пробел.
# Таблицы указываются в виде: имя_базы или имя_базы:имя_таблицы
backup_db_list="db_first_site db_second_site"
# Имя пользователя и пароль для соединения с MariaDB (MySQL).
backup_mysqluser="root" # Можно создать отдельного пользователя только для бэкапа.
backup_mysqlpassword="" # Возможна авторизация без пароля через unix_socket.
# Каталог куда будет помещен бэкап данных с SQL сервера.
# Должно быть достаточно свободного места для бэкапа всех выбранных БД.
backup_path="/usr/local/fsbackup/db_websites" # Необходимо создать каталог.
# Путь к программам mysql / mariadb
backup_progdump_path="/usr/local/bin"
# Дополнительные параметры mysqldump (mariadb-dump) через пробел.
extra_mysqldump_flag="--complete-insert"
####################################################################
if [ -n "$backup_progdump_path" ]; then
backup_progdump_path="$backup_progdump_path/"
fi
# Далее идут настройки параметров для mysqldump и скрипты выполнения.
# Опции "--all" более невалидна, ее необходимо удалить, если она есть.
#-------------------------------------------------------------------------
# Полный бэкап для MySQL (MariaDB).
if [ "_$backup_method" = "_full" ]; then
echo "Creating full backup of all MySQL databases."
${backup_progdump_path}mysqldump --all-databases --add-drop-table --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
${backup_progdump_path}mysqldump --all-databases --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser |gzip > $backup_path/$backup_name-mysql.gz
exit
fi
#-------------------------------------------------------------------------
# Бэкап указанных баз для MySQL (MariaDB)
if [ "_$backup_method" = "_db" ]; then
echo "Creating full backup of $backup_db_list MySQL databases."
${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
cat /dev/null > $backup_path/$backup_name-mysql
for cur_db in $backup_db_list; do
echo "Dumping $cur_db..."
cur_db=`echo "$cur_db" | awk -F':' '{if (\$2 != ""){print \$1, \$2}else{print \$1}}'`
${backup_progdump_path}mysqldump --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql
done
gzip -f $backup_path/$backup_name-mysql
exit
fi
#-------------------------------------------------------------------------
# Бэкап всех баз кроме указанных для MySQL (MariaDB)
if [ "_$backup_method" = "_notdb" ]; then
echo "Creating full backup of all MySQL databases except databases $backup_db_list."
${backup_progdump_path}mysqldump --add-drop-table --all-databases --force --no-data $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser > $backup_path/$backup_name-struct-mysql
cat /dev/null > $backup_path/$backup_name-mysql
for cur_db in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser| tr -d ' |'|grep -v -E '^Databases$|^\+\-\-\-'`; do
grep_flag=`echo " $backup_db_list"| grep " $cur_db:"`
if [ -n "$grep_flag" ]; then
# Исключение таблиц для данной базы
for cur_db_table in `${backup_progdump_path}mysqlshow --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db| tr -d ' |'|grep -v -E '^Tables$|^Database\:|^\+\-\-\-'`; do
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db:$cur_db_table" ]; then
flag=0
fi
done
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db:$cur_db_table..."
${backup_progdump_path}mysqldump --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db $cur_db_table >> $backup_path/$backup_name-mysql
else
echo "Skiping $cur_db:$cur_db_table..."
fi
done
else
# Исключение базы
flag=1
for cur_ignore in $backup_db_list; do
if [ "_$cur_ignore" = "_$cur_db" ]; then
flag=0
fi
done
if [ $flag -gt 0 ]; then
echo "Dumping $cur_db..."
${backup_progdump_path}mysqldump --add-drop-table --force $extra_mysqldump_flag --password=$backup_mysqlpassword --user=$backup_mysqluser $cur_db >> $backup_path/$backup_name-mysql
else
echo "Skiping $cur_db..."
fi
fi
done
gzip -f $backup_path/$backup_name-mysql
exit
fi
echo "Configuration error. Not valid parameters in backup_method or backup_sqltype."
Вносим измерения и сохраняем файл.
Создаем каталог указанный в параметре backup_path для резервной копии базы данных веб-сайтов с правами только для root.
mkdir -m 0700 /usr/local/fsbackup/db_websites/
3.3. Настройка резервного копирования файлов сайта
Создаем файл конфигурации резервного копирования для сайтов с именем указанном в параметре config_files скрипта запуска create_websites_backup.sh.
nano websites_backup.conf
Каталоги указанные в параметрах $cfg_remote_path и $cfg_local_path для сохранения бэкапа в каждом конфигурационном файле должны отличаться и существовать. Указание одного каталога в нескольких конфигурационных файлов приведет к перезаписыванию резервных копий друг другом.
# Файл конфигурации резервной копии файлов сайтов в FreeBSD
# Имя для бэкапа.
$cfg_backup_name = "websites_backup"; # Можно назвать как имя файла.
# Каталог для хешей локального метода бэкапа или временных хешей других методов.
$cfg_cache_dir = "/usr/local/fsbackup/cache";
# Пути к запускаемым в процессе выполнения бэкапа программам.
$prog_md5sum = "/sbin/md5sum -b"; # -b — читать файл в бинарном режиме.
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip"; # Если равно "", то без сжатия.
$prog_pgp = ""; # Если равно "", то без шифрования.
# Метод вычисления контрольных сумм для определения изменений в файле:
# timesize - учитывается время последнего изменения файла, его размер, атрибуты файла.
# md5 - все параметры timesize + контрольная сумма содержимого файла.
$cfg_checksum = "timesize"; # Это быстрее и менее затратно по ресурсам.
# Определение типа резервной копии (backup):
# backup - инкрементальный бэкап в архив (т.е. копируются только изменившиеся файлы с последнего бэкапа);
# full_backup - полный бэкап в архив, без хеша (т.е. всегда копируются все файлы);
# sync - синхронизация дерева (только для типа хранилища ssh или local);
# hash - только генерация хеша, без помещения файлов в архив.
$cfg_backup_style = "backup"; # Делаем бэкап только измененных файлов.
# Число копий бэкапа, при частичном бэкапе, после которых производится полный бэкап.
$cfg_increment_level = 10; # Раз в 10 дней делать полный бэкап в архив.
# Сохранение предыдущей версии полного бэкапа.
# Старая версия помещается в подкаталог OLD.
# 0 - не сохранять, 1 - сохранять
$cfg_save_old_backup = 1;
# Тип хранилища для резервной копии (backup):
# local - хранение бэкапа в локальной файловой системе;
# remote_ssh - копирование бэкапа с использованием SSH;
# remote_ftp - копирование бэкапа по FTP.
# Настройка SSH через ключ: https://notby.net/avtorizatsiya-ssh-cherez-klyuch
$cfg_type = "remote_ssh"; # Пусть будет SSH сервер.
# Параметры необходимые для копирования бэкапа через ssh и ftp:
$cfg_remote_host = "10.200.0.10"; # IP-адрес или домен удаленной машины.
$cfg_remote_login = "user"; # Пользователь SSH или логин FTP.
$cfg_remote_path = "/home/user/backup/websites/"; # Путь внутри FTP или SSH (Абсолютный путь).
# Режим соединения с FTP сервером (пассивный или активный).
# 0 - Active mode, 1 - Passive mode.
$cfg_remote_ftp_mode = 0;
# Пароль пользователя FTP сервера. (SSH подключается через сертификаты).
$cfg_remote_password = "Сложный_Пароль";
# Каталог для локальной версии бэкапа (local), не должен быть в каталоге cache.
# Каталог можно настроить для синхронизации через облачное файловое хранилище.
$cfg_local_path = "/mnt/ubs-flash-drive/websites_backup/";
# Время в днях, файлы созданные ранее которого не будут помещаться в бэкап.
$cfg_time_limit = 0; # 0 - помещать все файлы.
# Максимально допустимый размер файла в Kb для помещения в бэкап.
$cfg_size_limit = 0; # 0 - помещать все файлы.
# Максимальный размер (в Kb) несжатого архива с бэкапом.
# При превышении, запись продолжается отдельные архивы '*-2', '*-3' и т.д.
$cfg_maximum_archive_size = 0; # 0 - размер архива неограничен.
# Корневая директория, относительно которой файлы помещаются в бэкап и
# относительно которой описаны пути для помещения файлов.
$cfg_root_path = "/"; # Можно оставить как есть или заменить на /usr/local/www/
# Уровень выводимых программой сообщений:
# 0 - Подавить вывод любых сообщений;
# 1 - Выводить сообщения об ошибках и предупреждения;
# 2 - Выводить все сообщения;
$cfg_verbose = 2; # Вначале необходимо выводить все.
# Рекурсивный просмотр запрещенных директорий.
# 0 - рекурсивно просматривать все содержимое директорий помеченных для бэкапа,
# в том числе и содержимое директорий запрещенных правилами '!', '!d' и '=!'.
# 1 - не использовать рекурсивный вход в запрещенные для бэкапа директории
# (увеличивается скорость бэкапа, уменьшает гибкость настройки).
$cfg_stopdir_prune=1;
1; # Конец параметров конфигурации, '1;' - обязательно.
# Начало описание копируемых файлов и каталогов в резервную копию (backup).
__DATA__
# Копируем все файлы сайтов, за исключением /usr/local/www/third_site/
/usr/local/www/
!/usr/local/www/third_site/
# Каталог с резервными копиями MariaDB (MySQL)
/usr/local/fsbackup/db_websites/
Сохраняем файл и устанавливаем права чтения и редактирование только для root
chmod 0600 websites_backup.conf
Так как это файл может содержать пароль от FTP сервера в открытом виде, а скрипт бэкапа запускается от root, то только он должен иметь возможность читать содержимое файла.
3.4. Проверка резервного копирования сайта
Запускаем скрипт резервного копирования файлов сайтов и базы данных
./create_websites_backup.sh
Резервная копия успешно создана и загружена на удаленный SSH сервер.
3.5. Автоматическое создание резервной копии сайта (crontab)
Резервная копия базы данных и файлов сайтов будет создаватся каждые сутки в ночное время когда нагрузка меньше всего на сайты.
Открываем файл /etc/crontab
nano /etc/crontab
Добавляем следующею строку:
30 2 * * * root /usr/local/fsbackup/create_websites_backup.sh
Скрипт create_websites_backup.sh будет запускатся каждую ночь в 2 часа 30 минут. Вывод работы скрипта будет присылатся на почту root пользователю.
Если нет необходимости в уведомлениях работы скрипта, его вывод можно отправить в null
30 2 * * * root /usr/local/fsbackup/create_websites_backup.sh > /dev/null
Сохраняем файл и закрываем его.
4. Модифицирование FSBackup
Меня не устраивает следующие в работе FSBackup:
- при full_backup не указывается дата и время в имени файла резервной копии;
- каталог OLD всегда очищается перед помещением в него предпоследний копии.
Переходим в каталог куда была установлена программа FSBackup
cd /usr/local/fsbackup/
4.1. Добавление даты и времени для full_backup
Открываем файл fsbackup.pl
nano fsbackup.pl
В текстовом редакторе nano нажимаем Ctrl + W и находим строку:
if ($cfg_backup_style eq "backup"){
Заменяем ее на следующею строку:
if ($cfg_backup_style eq "backup" || "full_backup"){
Сохраняем файл.
Теперь при создании полной резервной копии к имени файла будет дописыватся дата и время.
4.2. Хранение всех резервных копий при full_backup
Программа FSBackup работает следующим образом: очищается каталог OLD, в каталог OLD перемещается предыдущая копия бэкапа, в каталог указанный в параметре $cfg_remote_path или $cfg_local_path записывается новая версия бэкапа. То есть в таком виде может существовать только две версии бэкапа.
В основном файле fsbackup.pl есть скрытый параметр который позволяет включить неограниченное количество копий в основном каталоге для бэкапа без создания OLD каталога.
Открываем файл fsbackup.pl
nano fsbackup.pl
Находим строки:
if ($cfg_backup_style eq "full_backup" || $cfg_backup_style eq "hash"){
$cfg_new_flag=1;
$cfg_clean_flag=1;
}
Изменяем значение параметра cfg_clean_flag на 0
if ($cfg_backup_style eq "full_backup" || $cfg_backup_style eq "hash"){
$cfg_new_flag=1;
$cfg_clean_flag=0;
}
Для типа full_backup это имеет смысл, если сделана модификация Добавление даты и времени для full_backup (без модификации имя файла резервных копий всегда одинаковое).
Сохраняем файл.
Теперь все резервные копий full_backup будет находится в каталоге указанного в параметре $cfg_remote_path или $cfg_local_path и удалятся никогда не будет.
4.3. Хранение всех промежуточных и полных резервных копий
Если поступить также как в модификации для full_backup, то полный архив никогда создан не будет и всегда будут создаватся промежуточные копии. То есть, если бы параметр $cfg_increment_level имел ∞ в качестве значения.
Необходимо будет закомментировать строки удаления каталога OLD в зависимости от типа хранилища (local, remote_ssh, remote_ftp) резервной копии.
Открываем файл fsbackup.pl
nano fsbackup.pl
Не очищать каталог OLD при типе хранилища local
В текстовом редакторе nano нажимаем Ctrl + W и находим строку:
system( "$prog_rm -f $cfg_local_path/OLD/*");
И добавляем # перед строкой:
#system( "$prog_rm -f $cfg_local_path/OLD/*");
Не очищать каталог OLD при типе хранилища remote_ssh
В текстовом редакторе nano нажимаем Ctrl + W и находим строку:
system( "$prog_ssh -l $cfg_remote_login $cfg_remote_host rm -f $cfg_remote_path/OLD/*");
И добавляем # перед строкой:
#system( "$prog_ssh -l $cfg_remote_login $cfg_remote_host rm -f $cfg_remote_path/OLD/*");
Не очищать каталог OLD при типе хранилища remote_ftp
Тут немного сложнее, так как необходимая строка не уникальна для поиска.
В текстовом редакторе nano нажимаем Ctrl + W и находим строку:
$ftp->cwd("$cfg_remote_path/OLD");
Комментируем строку $ftp->delete($cur_dir); которая находится на 2 строки ниже:
$ftp->cwd("$cfg_remote_path/OLD");
foreach $cur_dir ($ftp->ls()){
#$ftp->delete($cur_dir);
}
Сохраняем файл.
Теперь все предыдущие резервные копии (промежуточные и полные) будет находится в каталоге OLD, а последние резервные копии в каталоге указанного в параметре $cfg_remote_path или $cfg_local_path в зависимости от типа хранилища бэкапа.