Автоматическое резервное копирование веб-сайтов на Ubuntu 24.04
Дата публикации: 2024-09-12T20:43:43
Теги: ["Ubuntu", "Cron", "Rsync"]
В этом руководстве описывается, как создавать автоматизированные резервные копии корневого каталога документов веб-сервера и файлов конфигурации Nginx с помощью утилит `tar`, `rsync` и `cron`. Пример расписания выполняется ежедневно, а резервные копии сохраняются в течение одного года.
Предпосылки
- Сервер с Ubuntu 24.04 в качестве ОС
- Права пользователя: пользователь root или обычный пользователь с привилегиями sudo
Вы можете адаптировать это руководство для других веб-серверов и дистрибутивов Linux с небольшими изменениями. Используемые команды являются стандартными для большинства дистрибутивов Linux.
Конвенции
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo. $ - данные команды должны выполняться от имени обычного пользователя
Обновите систему
Свежая установка Ubuntu 24.04 требует обновления пакетов до последних доступных версий.
$ sudo apt-get update -y && sudo apt-get upgrade -y
Правило 3-2-1
Правило резервного копирования 3-2-1 гласит, что вам нужны три копии ваших данных. В дополнение к основной рабочей копии вам нужны две резервные копии, хранящиеся на разных типах носителей, одна из которых должна быть вне офиса. С этой системой вы вряд ли потеряете свои данные.
1. Подготовка к резервному копированию
Перед созданием резервной копии убедитесь, что на веб-сервере достаточно места на диске.
$ df -h
Сравните это с размером корневого каталога вашего веб-сайта и файлов конфигурации Nginx, а также любых других каталогов, которые вы хотите создать:
$ du -sh /var/www $ du -sh /etc/nginx
Убедившись, что для выполнения резервного копирования достаточно места, создайте каталог для локальной резервной копии.
$ sudo mkdir /var/web_backup
2. Выполнение резервного копирования
Создайте резервную копию корневого каталога документов веб-сервера и каталога конфигурации Nginx с помощью `tar`. Назовите этот файл `web-server.tar.gz`.
$ 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/`, используйте:
$ 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. Тестирование восстановления
Перед автоматизацией процесса убедитесь, что вы можете восстановить файлы. Сначала создайте тестовый каталог для восстановления.
$ sudo mkdir /var/web_backup/restored/
Восстановите архив в каталог.
$ sudo tar -xvzpf /var/web_backup/web-server.tar.gz -C /var/web_backup/restored/
Команда extract имеет несколько новых аргументов:
- `x` - Извлечь архив
- `z` - Распаковать архив
Проверьте, что восстановление прошло успешно, выведя список содержимого.
$ ls -lh /var/web_backup/restored/
После проверки удалите тестовый каталог:
$ sudo rm -r /var/web_backup/restored/
4. Автоматизация с помощью Cron
Утилита `cron` планирует выполнение команд в определенное время. В этом примере ежедневное резервное копирование будет запланировано на 02:00, и будет сохраняться по одной резервной копии на каждый день недели, а также будет использоваться команда `date` для присвоения архиву имени в соответствии с днем недели, когда он был создан.
$ 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`, когда выполнять команду, а звездочка означает «все».
* * * * * команда, которая должна быть выполнена - - - - - | | | | | | | | | ----- День недели (0 - 7) (воскресенье = 0 или 7) | | | ------- Месяц (1 - 12) | | --------- День месяца (1 - 31) | ----------- Час (0 - 23) -------------- Минута (0 - 59)
Чтобы отредактировать crontab, выполните:
$ sudo crontab -e
Добавьте команду `tar` в конец файла, включая расписание в начале:
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` для их вывода:
$ echo `date +\%b`
Добавьте это в новую строку в `crontab`:
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 и может быть установлен вручную с помощью:
$ sudo apt install rsync
Войдите на внешний сервер и создайте каталог для хранения резервных копий:
$ mkdir server_backup
Запустите `rsync`, чтобы загрузить резервные копии с веб-сервера. Добавьте завершающий слеш после удаленного каталога, чтобы перенести только содержимое каталога.
$ 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/` в своей команде. Например, если вы хотите исключить резервную копию среды из передачи:
$ 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`:
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/your_home/.ssh/id_rsa):
Назовите ключ `id_rsa_rsync` и не вводите парольную фразу.
Добавьте новый открытый ключ на веб-сервер.
$ ssh-copy-id -i ~/.ssh/id_rsa_rsync username@remote_host
Внешний сервер должен иметь возможность загружать файлы с веб-сервера без пароля. На внешнем сервере проверьте команду.
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Если кто-то получит доступ к внешнему серверу, пара ключей предоставит ему доступ для входа на веб-сервер. Можно ограничить ключ и запретить удаленный вход.
Найдите точную команду, выполняемую на веб-сервере, с помощью `grep`, включив подробный флаг `-v` в `ssh`.
$ 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`:
$ sudo nano ~/.ssh/authorized_keys
Найдите открытый ключ, который вы добавили ранее. Например:
ssh-rsa AAAAB3Nza...[множество символов]...LiPk== user@example.com
Вставьте директиву команды перед `ssh-rsa`, используя команду из шага 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` с помощью ключа:
$ rsync -azP --delete -e 'ssh -i ~/.ssh/id_rsa_rsync' username@remote_host:/var/web_backup/ /path/to/offsite/server_backup
Попробуйте войти с помощью ключа и убедитесь, что доступ для интерактивного входа запрещен.
$ ssh -i ~/.ssh/id_rsa_rsync username@remote_host
7. Автоматизируйте процесс
Откройте `crontab` на сервере вне сайта.
$ sudo crontab -e
Добавьте команду rsync в конец файла.
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! Автоматические резервные копии вашего веб-сайта создаются ежедневно и отправляются на удаленное местоположение с сохранением в течение одного года.
Вы также можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья, или просто оставить комментарий ниже. Спасибо.