В этом руководстве описывается, как создавать автоматизированные резервные копии корневого каталога документов веб-сервера и файлов конфигурации Nginx с помощью утилит tar, rsync и cron. Пример расписания выполняется ежедневно, а резервные копии сохраняются в течение одного года.

Предпосылки

  • Сервер с Ubuntu 24.04 в качестве ОС
  • Права пользователя: пользователь root или обычный пользователь с привилегиями sudo

Вы можете адаптировать это руководство для других веб-серверов и дистрибутивов Linux с небольшими изменениями. Используемые команды являются стандартными для большинства дистрибутивов Linux.

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя

Обновите систему

Свежая установка Ubuntu 24.04 требует обновления пакетов до последних доступных версий.

1
$ sudo apt-get update -y && sudo apt-get upgrade -y

Правило 3-2-1

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

1. Подготовка к резервному копированию

Перед созданием резервной копии убедитесь, что на веб-сервере достаточно места на диске.

1
$ df -h

Сравните это с размером корневого каталога вашего веб-сайта и файлов конфигурации Nginx, а также любых других каталогов, которые вы хотите создать:

1
2
$ du -sh /var/www
$ du -sh /etc/nginx

Убедившись, что для выполнения резервного копирования достаточно места, создайте каталог для локальной резервной копии.

1
$ sudo mkdir /var/web_backup

2. Выполнение резервного копирования

Создайте резервную копию корневого каталога документов веб-сервера и каталога конфигурации Nginx с помощью tar. Назовите этот файл web-server.tar.gz.

1
$ sudo tar -cvzpf /var/web_backup/web-server.tar.gz -C /var/ www -C /etc/ nginx

Аргументы (-cvpzf -C) в команде указывают следующее:

  • c - Создать архив
  • v - Подробно
  • z - Сжать файл с помощью gzip
  • p - Сохранение прав доступа к файлам
  • f - Путь и имя файла архива
  • C - Изменить каталог

Обратите внимание на пробел после /var/ и /etc/ в команде перед указанием имени каталога для резервного копирования. Включите любые другие каталоги, которые вы хотите сделать резервными, с помощью дополнительных аргументов -C в команде.

Как исключить файлы

Чтобы исключить файл или каталог из архива, используйте --exclude=path/to/file/. Например, если вы хотите исключить каталог /var/www/example.com/junk/, используйте:

1
$ sudo tar -cvpzf /var/web_backup/web-server.tar.gz --exclude=www/example.com/junk -C /var/ www -C /etc/ nginx

Примечание: не включайте полный путь при указании того, что следует исключить, используйте относительный путь. Например, используйте www/example.com/junk вместо /var/www/example.com/junk. Используйте несколько директив --exclude=path/to/file/ при исключении нескольких файлов и каталогов. Вы также можете использовать файл исключения, если у вас много каталогов для исключения.

3. Тестирование восстановления

Перед автоматизацией процесса убедитесь, что вы можете восстановить файлы. Сначала создайте тестовый каталог для восстановления.

1
$ sudo mkdir /var/web_backup/restored/

Восстановите архив в каталог.

1
$ sudo tar -xvzpf /var/web_backup/web-server.tar.gz -C /var/web_backup/restored/

Команда extract имеет несколько новых аргументов:

  • x - Извлечь архив
  • z - Распаковать архив

Проверьте, что восстановление прошло успешно, выведя список содержимого.

1
$ ls -lh /var/web_backup/restored/

После проверки удалите тестовый каталог:

1
$ sudo rm -r /var/web_backup/restored/

4. Автоматизация с помощью Cron

Утилита cron планирует выполнение команд в определенное время. В этом примере ежедневное резервное копирование будет запланировано на 02:00, и будет сохраняться по одной резервной копии на каждый день недели, а также будет использоваться команда date для присвоения архиву имени в соответствии с днем ​​недели, когда он был создан.

1
$ sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ nginx

Переменная +\%a указывает, что дата должна быть возвращена как сокращенный день недели. Например, «Пн», «Вт» и т.д. Команда tar перезапишет ежедневный архив предыдущей недели.

Добавьте задание в crontab

Расписания cron хранятся в файле с именем crontab. Типичная запись crontab начинается с пяти значений (или звездочек), за которыми следует команда. Значения сообщают cron, когда выполнять команду, а звездочка означает «все».

1
2
3
4
5
6
7
8
* * * * * команда, которая должна быть выполнена
- - - - -
| | | | |
| | | | ----- День недели (0 - 7) (воскресенье = 0 или 7)
| | | ------- Месяц (1 - 12)
| | --------- День месяца (1 - 31)
| ----------- Час (0 - 23)
-------------- Минута (0 - 59)

Чтобы отредактировать crontab, выполните:

1
$ sudo crontab -e

Добавьте команду tar в конец файла, включая расписание в начале:

1
00 02 * * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%a`.tar.gz -C /var/ www -C /etc/ nginx

Это запланирует cron для запуска команды в 02:00, каждый день любого месяца.

12-месячное хранение

Чтобы сохранять ежемесячные резервные копии, используйте другое расписание, которое добавляет к имени файла сокращенное название месяца с помощью параметра +\%b к команде. Чтобы проверить команды date перед тем, как вставлять их в имя файла, используйте echo для их вывода:

1
$ echo `date +\%b`

Добавьте это в новую строку в crontab:

1
0 0 1 * * sudo tar -cvpzf /var/web_backup/web-server.`date +\%b`.tar.gz -C /var/ www -C /etc/ nginx

Это запланирует cron для запуска ежемесячного резервного копирования в 00:00, в первый день месяца. Через год старые архивы будут перезаписаны.

5. Резервное копирование вне сайта

Чтобы выполнить правило резервного копирования 3-2-1, внешний сервер будет использовать rsync для загрузки резервных копий с веб-сервера. Убедитесь, что и на веб-сервере, и на внешнем сервере установлен rsync. Он установлен по умолчанию в системах Ubuntu и может быть установлен вручную с помощью:

1
$ sudo apt install rsync

Войдите на внешний сервер и создайте каталог для хранения резервных копий:

1
$ mkdir server_backup

Запустите rsync, чтобы загрузить резервные копии с веб-сервера. Добавьте завершающий слеш после удаленного каталога, чтобы перенести только содержимое каталога.

1
$ rsync -azP --delete username@remote_host:/var/web_backup/ /path/to/offsite/server_backup

rsync принимает ряд аргументов:

  • a - Архивировать, рекурсивно синхронизировать, сохраняя символические ссылки, разрешения файлов и т.д.
  • z - Сжимать данные файлов во время передачи
  • P - Сокращение от --partial и --progress, сохранять частично переданные файлы при прерывании и отображать ход передачи
  • --delete - Удалять посторонние файлы из целевого каталога

Будьте осторожны с --delete. Сначала протестируйте свою команду с опцией --dry-run, чтобы предотвратить потерю данных.

Исключение файлов

Вы можете исключить файлы из rsync. Чтобы исключить файл из передачи, используйте аргумент --exclude=relative/path/to/file/ в своей команде. Например, если вы хотите исключить резервную копию среды из передачи:

1
$ rsync -azP --delete --exclude=web-server.Wed.tar.gz username@remote_host:/var/web_backup/ /path/to/offsite/server_backup

Повторите --exclude=relative/path/to/file/ для каждого файла или каталога, которые вы хотите исключить.

Примечание: не включайте полный путь при указании того, что следует исключить, исключаемые пути должны быть относительными к исходному пути. Например, чтобы исключить резервную копию среды, хранящуюся в /var/web_backup/daily/, используйте daily/web-server.Wed.tar.gz, а не /var/web_backup/daily/web-server.Wed.tar.gz.

6. Вход в систему Rsync без пароля

Чтобы автоматизировать процесс, настройте rsync для подключения к веб-серверу с внешнего сервера без пароля.

На внешнем сервере создайте пару ключей для rsync:

1
2
3
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/your_home/.ssh/id_rsa):

Назовите ключ id_rsa_rsync и не вводите парольную фразу.

Добавьте новый открытый ключ на веб-сервер.

1
$ ssh-copy-id -i ~/.ssh/id_rsa_rsync username@remote_host

Внешний сервер должен иметь возможность загружать файлы с веб-сервера без пароля. На внешнем сервере проверьте команду.

1
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup

Если кто-то получит доступ к внешнему серверу, пара ключей предоставит ему доступ для входа на веб-сервер. Можно ограничить ключ и запретить удаленный вход.

Найдите точную команду, выполняемую на веб-сервере, с помощью grep, включив подробный флаг -v в ssh.

1
2
3
4
$ rsync -azP --delete -e 'ssh -vi ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup 2>&1 | grep "Sending command"

Output:
debug1: Sending command: rsync --server --sender -vlogDtprz . /var/web_backup/

Подключитесь к веб-серверу по SSH и отредактируйте файл authorized_keys:

1
$ sudo nano ~/.ssh/authorized_keys

Найдите открытый ключ, который вы добавили ранее. Например:

1
ssh-rsa AAAAB3Nza...[множество символов]...LiPk== user@example.com

Вставьте директиву команды перед ssh-rsa, используя команду из шага 1. Строка будет выглядеть так, например:

1
command="rsync --server --sender -vlogDtprz . /var/web_backup/",no-pty,no-agent-forwarding,no-port-forwarding ssh-rsa AAAAB3Nza...[множество символов]...LiPk== user@example.com

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

Проверьте команду rsync с помощью ключа:

1
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup

Попробуйте войти с помощью ключа и убедитесь, что доступ для интерактивного входа запрещен.

1
$ ssh -i ~/.ssh/id_rsa_rsync username@remote_host

7. Автоматизируйте процесс

Откройте crontab на сервере вне сайта.

1
$ sudo crontab -e

Добавьте команду rsync в конец файла.

1
00 03 * * * rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup

Это запланирует cron для запуска команды rsync в 03:00 каждый день.

Завершение

У вас есть рабочая стратегия резервного копирования 3-2-1! Автоматические резервные копии вашего веб-сайта создаются ежедневно и отправляются на удаленное местоположение с сохранением в течение одного года.

Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.