notby.NET Logo

Резервное копирование 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
Запущен скрипт бэкапа “./create_backup.sh” из каталога /usr/local/fsbackup. Резервная копия FreeBSD настроек успешно создана и загружена на FTP сервер.

Резервная копия успешно создана и загружена на удаленный 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
Открыт файл /etc/crontab через nano в FreeBSD, добавлена строка “30 4 * * 6 root /usr/local/fsbackup/create_backup.sh.sh” в конец файла

Сохраняем файл и закрываем его.

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
Запущен скрипт бэкапа “./create_websites_backup.sh” из каталога /usr/local/fsbackup. Резервная копия файлов сайтов и их баз данных успешно создана и загружена на SSH сервер.

Резервная копия успешно создана и загружена на удаленный 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
Открыт файл /etc/crontab через nano в FreeBSD, добавлена строка “30 4 * * 6 root /usr/local/fsbackup/create_websites_backup.sh.sh” в конец файла

Сохраняем файл и закрываем его.

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 в зависимости от типа хранилища бэкапа.