Воскресенье, 03 Июнь 2012 22:14

Настройка резервного копирования домашнего сервера.

Автор
Оцените материал
(6 голосов)

Настройка резервного копирования домашнего сервера.

Не так давно мне, наконец то, посчастливилось настроить дома сервер для сайта, почты и фтп — об этом я рассказывал тут. И, первое время, я этим был так доволен, что совсем не подумал про резервное копирование данных этого сервера. А данные эти, постепенно, разрастались и разрастались Улыбаюсь . К сайту постепенно прикручивались новые компоненты, постепенно выкладывался свежий материал; почтовый ящик начал заполняться письмами; дополнялась структура фтп-папок, правились права на эти папки; да и конфиги изредка, бывало, подкручивались. Всё это терять очень не хотелось.

Ну, и чтобы подстраховаться на авральный случай, я решил продумать алгоритм восстановления сервера, если он упадёт совсем-совсем. А первое, что надо восстановить при авральном случае — это, конечно же, саму систему. Поскольку, сервер домашний, и ни о каких резервных серверах речь идти не может, то я просто сделал образ с твердотельного накопителя, на котором у меня и стоит система. Образ делается очень просто:

dd if=/dev/sde of=server-system.iso

Где /dev/sde — твердотельный диск, присоединённый к домашнему Linux-компу. Да, всё правильно: чтобы сделать резервную копию самой системы, мне пришлось снять диск с сервера и сделать его образ. Вариант не джедайский, но, в домашних условиях, я пока не нахожу другого способа.

Второе, что надо восстанавливать при авральном случае — это конфигурационные файлы и MySQL-базы данных. И третье — это сайт, почту и прочие важные файлы (например из фтп-хранилища). И вот это самое «второе» и «третье» я бы хотел рассмотреть более подробно. Для начала, распишу, что именно (в своём случае) я собираюсь бэкапить:

1. Конфиг фаервола ipfw
2. Конфиги и сертификаты вэб-сервера Nginx
3. Конфиги php и php-fpm
4. Конфиги и сертификаты postfix
5. Конфиги dovecot
6. Конфиги spamassassin
7. Конфиги ProFTPd
8. Конфигурацию Webmin
9. Некоторые нужные файлы из ФТП-хранилища или из другого места
10. Почтовые каталоги mailbox
11. Каталог с сайтом (сайтами)
12. Базы MySQL

Последние три пункта наиболее важны.

Для того, чтобы это всё бэкапить, хотелось бы иметь всего один скрипт. Причём, чтобы конечный результат выглядел как один файл, лежащий в какой-нибудь расшаренной папке. Посмотрев, что имеется в портах и погуглив, я решил попробовать программку fsbackup.

Устанавливаю:

cd /usr/ports/sysutils/fsbackup
make install clean

При установке появляются вопросы. Я на них отвечаю так:

Do you want to modify/update your configuration (y|n) ? [no] y
Do you want me to perform hostname lookups (y|n) ? [yes] y
Enter a list of available NNTP hosts : [] # просто нажал enter, оставив пустым
Enter a list of available SMTP hosts : [] localhost
Enter a list of available POP3 hosts : [] # просто нажал enter, оставив пустым
Enter a list of available SNPP hosts : [] # просто нажал enter, оставив пустым
Enter a list of available PH Hosts : [] # просто нажал enter, оставив пустым
Enter a list of available TIME Hosts : [] # просто нажал enter, оставив пустым
Enter a list of available DAYTIME Hosts : [] # просто нажал enter, оставив пустым

Do you have a firewall/ftp proxy between your machine and the internet
If you use a SOCKS firewall answer no
(y|n) ? [no] n

Should all FTP connections be passive (y|n) ? [yes] # просто нажал enter, оставив пустым
What is your local internet domain name : [] example.com # впишите свой домен
Do you want me to run these tests (y|n) ? [yes] # просто нажал enter, чтобы посмотреть этот тест (ради интереса). Но можно на тест и не соглашаться.
What host can I use : [] localhost

Установка зависимостей:

В настройке fsbackup мне помогли вот эти статьи:

http://www.unix.ck.ua/content/rezervirovanie-dannykh-s-pomoshchyu-fsbackup
http://adw0rd.ru/2009/freebsd-fsbackup
http://www.opennet.ru/dev/fsbackup

Сначала определюсь, куда будет складываться бэкап. Пусть это будет следующая директория:

mkdir /usr/home/backup

Затем, настраиваю fsbackup. Перехожу в каталог /usr/local/fsbackup и, находясь в нём, делаю копию конфига-примера:

cp cfg_example backup.conf

Потом открываю полученный файл для редактирования. Очень удобно, что в нём есть русские комментарии. Вот такой конфиг у меня получился:

# Example of configuration file.
# Пример файла конфигурации.
#
# http://www.opennet.ru/dev/fsbackup/
# Copyright (c) 2001 by Maxim Chirkov. <mc@tyumen.ru>
#

#-------------------
# Name of backup, single word.
# Имя для бэкапа, строка состоящая из латинских букв, цифр и символа подчеркивания.
#-------------------

$cfg_backup_name = "example_com";


#-------------------
# Path of internal cache directory for local backup method.
# Директория для помещения текущих хэшей для локального метода бэкапа, или
# временных хешей для других методов.
#-------------------

$cfg_cache_dir = "/usr/local/fsbackup/cache";


#-------------------
# Full path of some external program running from C<fsbackup.pl>.
# $prog_gzip = "" - not use compression, $prog_pgp = "" - not use encryption.
# Пути к запускаемым в процессе выполнения бэкапа программам. Рекомендуется
# не полениться и прописать полный путь к каждой программе.
# Внимание ! При использовании шифрования через gpg, рекомендуется
# установить значение $prog_gzip="", так как gpg перед шифрованием сжимает
# данные, использование gzip приведет к двойному сжатию и лишней нагрузке на CPU.
#-------------------

$prog_md5sum = "md5sum -b";
$prog_tar = "/usr/bin/tar";
$prog_ssh = "/usr/bin/ssh";
$prog_rm = "/bin/rm";
$prog_gzip = "/usr/bin/gzip"; # Если равно "", то не использовать сжатие.
# $prog_pgp = "/usr/local/bin/gpg"; # Если равно "", то не применять шифрование.
$prog_pgp = "";


#-------------------
# Checksum method:
# timesize - checksum of file attributes (default, best speed)
# md5 - checksum of file attributes + MD5 checksum of file content.
# Метод вычисления контрольных сумм для определения изменений в файле.
# timesize - учитывается время последнего изменения файла, его размер,
# атрибуты файла, но не учитывается содержимое. Как правило
# учета данных факторов достаточно для определения необходимости
# обновления файла в бэкапе. Наиболее быстрый метод.
# md5 - все параметры timesize + контрольная сумма содержимого
# файла. Наиболее ресурсоемкий и медленный метод.
#-------------------

$cfg_checksum = "timesize";


#-------------------
# Backup style:
# backup - incremental backup (copy only new and changed files).
# full_backup - full backup (copy all files).
# sync - file tree synchronization.
# hash - hash creation without storing archive (spying for new or changed files).
# Определение типа операции, вида бэкапа.
# backup - инкрементальный бэкап в архив (т.е. копируются только
# изменившиеся с момента последнего бэкапа файлы)..
# full_backup - полный бэкап в архив, без хэша (т.е. всегда копируются
# все файлы).
# sync - синхронизация дерева (только для типа хранилища ssh или local).
# hash - только генерация хэша, без помещения файлов в архив
# (пометка помещения файлов в бэкап, без физического перемещения)
#-------------------

$cfg_backup_style = "full_backup";


#-------------------
# Incremental level (after how many incremental copy make full refresh of backup)
# Число копий бэкапа, при инкрементальном бэкапе, после которых производится
# полный бэкап. Например, при = 7 - 6 раз будут помещаться только изменения,
# на 7 раз бэкап будет объединен в один файл. 0 - сколько угодно раз.
#-------------------

$cfg_increment_level = 7;


#-------------------
# Save previous backup to OLD directory before rotation or before storing
# full backup.
# 0 - don't save old backup
# 1 - save old backup.
# Сохранение предыдущей версии полного бэкапа перед инкрементальной ротацией или
# заменой текущего неинкрементального бэкапа новой версией.
# Старая версия помещается в подкаталог OLD.
# 0 - не сохранять предыдущую версию.
# 1 - сохранять предыдущую версию
#-------------------

$cfg_save_old_backup = 0;


#-------------------
# Type of backup storage:
# local - store backup on local file system.
# remote_ssh - store backup on remote host over SSH connection.
# remote_ftp - store backup on remote FTP server.
# Тип хранилища для бэкапа. Описание см. в файле README.
# local - хранение бэкапа в локальной файловой системе.
# remote_ssh - копирование бэкапа на удаленную машину с использованием SSH
# remote_ftp - копирование бэкапа на удаленную машину по FTP
#-------------------

$cfg_type = "local";


#-------------------
# Connection parameters for remote_ssh storage type.
# Параметры необходимые для копирования бэкапа через ssh и ftp:
#-------------------

$cfg_remote_host = "backup-server.test.ru";
$cfg_remote_login = "backup_login";
$cfg_remote_path = "/home/backup_login/backup";

#-------------------
# FTP transfer mode. If set to a non-zero value then all data transfers will
# be done using passive mode. This is not usually required except for some dumb
# servers, and some firewall configurations.
# Режим соединения с FTP сервером (пассивный или активный).
# 0 - Active режим.
# 1 - Passive режим (для специфичных ftp серверов или особых настроек фаерволов).
#-------------------

$cfg_remote_ftp_mode = 0;

#-------------------
# Password of remote login for remote_ftp storage type.
# Параметры необходимые для копирования бэкапа по ftp:
#-------------------

$cfg_remote_password = "Test1234";


#-------------------
# Path of directory to store backup on local file system for local storage type.
# Параметры необходимые для хранения бэкапа на локальной ФС:
# Бэкап не должен быть в одной директории с кэшем. Создайте отдельную директорию,
# например, archive.
#-------------------

$cfg_local_path = "/usr/home/backup";


#-------------------
# Limit of file creation time in days.
# If not 0, don't backup files created or modified later then $cfg_time_limit days.
# Время в днях, файлы созданные ранее которого не будут помещаться в бэкап.
# 0 - помещаем все фалы независимо от времени их создания.
#-------------------

$cfg_time_limit = 0;


#-------------------
# Limit of maximum file size.
# If not 0, don't backup files witch size more then $cfg_time_limit kilobytes.
# Максимально допустимый размер файла в Kb для помещения в бэкап.
# 0 - помещаем все фалы независимо от их размера.
#-------------------

$cfg_size_limit = 0;

#-------------------
# Size of maximum size (in KiloBytes) of single unpacked archive file (volume).
# 0 - unlimited file size.
# Максимальный размер (в Kb) несжатого архива с бэкапом, размещенного в одном
# файле, т.е. размер тома. Полезно при создании гиганских архивов не влезающих
# в ограничение файловой системы или при последующей записи архивов на CD-ROM
# или другие накопители небольшого размера.
# При превышении заданного размера, запись продолжается в следующий файл c
# идентификатором '-2', '-3' и т.д.
# 0 - размер архива не ограничен.
#-------------------

$cfg_maximum_archive_size = 0;


#-------------------
# Root path for initial chdir.
# Корневая директория, относительно которой файлы помещаются в бэкап и
# относительно которой описаны пути для помещения файлов.
#-------------------

$cfg_root_path = "/";


#-------------------
# Name of user in public key ring with public key will be used for PGP encryption.
# Not use encryption if not set.
# Шифрования бэкапа с помощью PGP.
# Если поле не заполнено, то pgp не применяется.
# Иначе поле содержит UserId записи в public key ring.
#-------------------

# $cfg_pgp_userid = "backup";


#-------------------
# Verbose level.
# 0 - Silent mode, suspend all output, except fatal configuration
# errors.
# 1 - Output errors and warnings.
# 2 - Output all the available data.
#
# Уровень "говорливости", регулирует объем выводимых программой сообщений.
# 0 - Подавить вывод любых сообщений.
# 1 - Выводить сообщения об ошибках и предупреждения
# 2 - Выводить все сообщения
#-------------------

$cfg_verbose = 1;

#-------------------
# Recursive review of the prohibited directories.
# 0 - Recursively to view all contents of directories marked for
# backup, including contents of directories prohibited by
# '!', '!d' and '=! rules.
# 1 - not use a recursive entrance to directory prohibited for
# backup (speed is increased, reduces flexibility of customization).
#
# Рекурсивный просмотр запрещенных директорий.
# 0 - рекурсивно просматривать все содержимое директорий помеченных
# для бэкапа, в том числе и содержимое директорий запрещенных
# правилами '!', '!d' и '=!'.
# 1 - не использовать рекурсивный вход в запрещенные для
# бэкапа директории (увеличивается скорость бэкапа, уменьшает
# гибкость настройки).
#-------------------

$cfg_stopdir_prune=0;

1;
#-------------------
# List of backuped path and regexp mask.
# /dir[/file] - backup file or directory.
# !/dir[/file] - NOT include this file or directory to backup.
# # - ignore this line.
# Mask:
# =~ - regexp mask for include file or directory to backup.
# f~ - regexp file mask for include file to backup.
# d~ - regexp directory mask for include directory to backup.
# =! - regexp mask for NOT include file or directory to backup.
# f! - regexp file mask for NOT include file to backup.
# d! - regexp directory mask for NOT include directory to backup.
#
#
#
# Список файлов и условий для помещения в бэкап.
# (описываются после директивы __DATA__):
# /dir[/file] - путь к файлу/директории для бэкапа.
# !/dir[/file] - отрицание пути, не помещать в бэкап. Не маска, а реальный путь.
# # - комментарий
# Маски:
# =~ - маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f~ - маска для файла. Первый или второй символ.
# d~ - маска для директории. Первый или второй символ.
# Маски отрицания:
# =! - "НЕ" маска для файла или директории, а не абсолютный путь. Первый или второй символ.
# f! - "НЕ" маска для файла. Первый или второй символ.
# d! - "НЕ" маска для директории. Первый или второй символ.
#
#
# Бэкап проходит только в рамках директорий и файлов описанных в путях.
# Отрицания путей имеют более высокий приоритет чем пути.
# Маски имеют более высокий приоритет, чем пути или отрицание путей,
# маски "НЕ" имеют более высокий приоритет, чем обычные маски:
#
#
# Таблица приоритетов:
# Operation priority:
#
# 1. =!
# 2. f!
# 3. f~
# 4. d!
# 5. =~
# 6. d~
# 7. !
# 8. path
#
# Пример:
# /usr/home # Объявляем /usr/home как пустой путь,
# !/usr/home # для работы масок.
# d~public_html
# /var
# d!var/log
# f~netconf\.log.*
#
# при этом только /usr/home/*/public_html будет добавлено в архив,
# а файлы директории /var/log/var/log/, за исключением messages, нет.
# Но, /usr/local/home/user/public_html добавлено в
# архив не будет ! Для поиска только по маскам нужно объявить:
# /
# !/
# d~public_html
# d~cgi-bin
# d~/etc/
#-------------------

__DATA__
# Ниже, указываю каталоги, которые хочу бэкапить
/usr/local/fsbackup
!/usr/local/fsbackup/cache
/etc/ipfw.rules
/usr/local/etc/nginx
/usr/local/etc/php.ini
/usr/local/etc/php-fpm.conf
/usr/local/etc/php
/usr/local/etc/postfix
/usr/local/etc/dovecot
/usr/local/etc/mail
/usr/home/spamassassin
/usr/local/etc/proftpd.conf
/usr/local/etc/proftpd
/usr/local/etc/webmin
/usr/home/vmail
/usr/local/www/mysite

Сохраняем изменения. Затем, надо настроить конфиг для бэкапирования mysql-баз. Находим файл /usr/local/fsbackup/scripts/mysql_backup.sh. В нём я поправил лишь несколько строчек:

backup_method="full"
backup_mysqluser="root"
backup_mysqlpassword="ваш_пароль_на_скульного_рута"
backup_path="/usr/home/backup_mysql"

И не забудем создать папку backup_mysql:

mkdir /usr/home/backup_mysql

И, после этого, редактируем последний файл /usr/local/fsbackup/create_backup.sh. В нём мы указываем путь до созданного нами конфига и включаем опцию бэкапирования mysql-баз:

config_files="backup.conf"
backup_mysql=1

После чего, пробуем запустить процесс бэкапа и посмотреть, нормально ли он отработает:

./create_backup.sh

Если бэкап-скрипт отработает, то в папках /usr/home/backup и /usr/home/backup_mysql должны появиться файлы example_com-0.tar.gz и example_com-mysql.gz соответственно. В первом файле забэкаплены файлы и каталоги, а во втором — базы mysql. Однако, меня очень смутило, что бэкап с mysql-базами весил всего 20 байт, т.е. Это была пустышка. Немного поковырявшись в скрипте mysql_backup.sh я нашёл строчку, которая, собственно, и должна дампить базы. Я попробовал запустить её вручную и получил вот такую ошибку:

mysqldump: ambiguous option '--all' (all-databases, allow-keywords)

Насколько я понял, этот параметр '--all' используется в более ранних версиях MySQL, а в версии 5.5 он не используется уже. Поэтому я его удалил в во всех строчках, начинающихся на «${backup_progdump_path}mysqldump» внутри скрипта mysql_backup.sh. Затем, снова попробовал запустить скрипт бэкапа. На этот раз, mysql-базы сдампились нормально.

Теперь надо настроить, чтоб бэкап срабатывал автоматически в заданное время. В самый конец файла /etc/crontab я добавил две строчки:

1 0 * * 6 root /usr/local/fsbackup/create_backup.sh | mail -s "`uname -n` backup report" root
30 0 * * 6 root /usr/home/rename

Первая означает, что бэкап будет делаться каждую субботу в 00 часов 01 минуту. Также, на ящик root будут посылаться уведомления о бэкапе. А вторая запустит скрипт, который к названию файлов подставит текущую дату. Его содержимое будет вот таким:

#!/bin/sh
/bin/mv /usr/home/backup/example_com-0.tar.gz /usr/home/backup/`/bin/date+%d.%m.%y`example_com-0.tar.gz
/bin/mv /usr/home/backup_mysql/example_com-mysql.gz /usr/home/backup_mysql/`/bin/date+%d.%m.%y`example_com-mysql.gz

Почему то, разработчики Fsbackup не добавили возможность подставления даты создания архива к его названию. Поэтому вот пришлось эту проблему решать таким костылём.

Объясню, почему у меня всё именно так: дело в том, что далее я хочу настроить автоматическое сбрасывание бэкапа с сервера на домашний комп. А в будни я домашний комп включаю редко, а вот в субботу включаю его почти всегда. Поэтому как раз к субботе всегда будет готов свежий бэкап. Ну, а если будут случаи, что бэкап надо сделать срочно вне расписания, то просто буду запускать все скрипты вручную и всё.

Итак, чтобы бэкапы складывались на домашний компьютер, я сделаю следующую схемку: настрою на сервере NFS-хранилище, которое будет из себя представлять расшаренную папку /usr/home. А на домашнем компе пропишу монтирование этого хранилища в fstab. Ну, и при загрузке компа будет запускаться скриптик, который будет перекладывать бэкапы из хранилища на домашний комп.

Для настройки NFS мне помогли вот эти статьи:

http://www.opennet.ru/base/net/nfs_setup.txt.html
http://www.freebsd.org.ru/handbook/nfs.html
и вот эта ветка форума лисяры:
http://forum.lissyara.su/viewtopic.php?f=53&t=33667

Итак, настраиваем хранилище NFS на сервере. Создаём файл /etc/exports и пишем в него вот такую строчку:

/usr/home -maproot=0 192.168.0.2

В этой строчке я расшарил весь home каталог для своего домашнего компа с адресом 192.168.0.2. Затем, в файл /etc/rc.conf добавляем строчки:

rpcbind_enable="YES"
nfs_server_enable="YES"
nfs_server_flags="-u -t -n 4"
mountd_enable="YES"
mountd_flags="-r -p 3333"
potmap_enable="YES"

А в фаервол ipfw добавляем вот такие строчки:

add 00185 pass tcp from 192.168.0.0/24 to me nfsd in setup
add 00186 pass udp from 192.168.0.0/24 to me nfsd in keep-state
add 00187 pass tcp from 192.168.0.0/24 to me sunrpc in setup
add 00188 pass udp from 192.168.0.0/24 to me sunrpc in keep-state
add 00189 pass tcp from 192.168.0.0/24 to me 3333 in setup
add 00190 pass udp from 192.168.0.0/24 to me 3333 in keep-state

Затем, перезагружаем сервер. Когда он загрузится, то на своём линуксовом компе я пробую примонтировать NFS-шару командой:

mount 192.168.0.100:/usr/home /mnt

И если, после этого, в каталоге /mnt появились файлы и каталоги, лежащие на сервере в /usr/home, то всё работает как надо. Чтобы монтирование этого каталога происходило при загрузке системы, я у себя на компе в /etc/fstab добавляю строчку:

192.168.0.100:/usr/home /homeserv nfs rsize=8192,wsize=8192,timeo=14,intr

Затем, пишу вот такой скриптик:

#!/bin/sh
#
# chkconfig: - 97 83
#
# processname: move-backup
#
echo "Starting move backups"
mv /homeserv/backup/*example_com*gz /data/Backups/
mv /homeserv/backup_mysql/*example_com*gz /data/Backups/

Назвал я его move-backup. Его надо положить в папку /etc/init.d, а затем выполнить команду:

chkconfig move-backup on

Этот скрипт начнёт стартовать при загрузке системы и будет перемещать бэкапы с сервера на домашний комп.

Вот и всё. На этом настройка резервного копирования завершена. Возможно, потом что-нибудь дополню. 

Прочитано 12718 раз Последнее изменение Суббота, 30 Март 2013 16:40

You have no rights to post comments

Вы здесь: Home Мои статьи FreeBSD Настройка резервного копирования домашнего сервера.