11. Бэкапы: резервное копирование
Цена потери данных
Жёсткие диски умирают. Ошибки случаются. Скрипт rm -rf может уйти не туда. Без бэкапов потеря единственного сервера — это потеря всего: блога, конфигов, пользовательских данных.
Мы настроим автоматическое резервное копирование с помощью tar и rsync. Бекапы будут храниться локально (для быстрого восстановления) и отправляться на удалённый сервер или в облако.
Что бэкапим
Для типичного сервера список выглядит так:
| Что | Где находится | Важность |
|---|---|---|
| Сайт (Grav) | /var/www/vds.example.com |
Критично |
| Конфиги Nginx | /etc/nginx/ |
Высокая |
| Конфиги Xray | /etc/x-ui/ |
Высокая |
| Конфиги системы | /etc/ |
Средняя |
| Базы данных (если есть) | дамп SQL | Критично |
| Grav user data | /var/www/vds.example.com/user/ |
Критично |
Создание скрипта бэкапа
Создаём директорию для скриптов:
sudo mkdir -p /opt/backup
Создаём скрипт /opt/backup/backup.sh:
sudo nano /opt/backup/backup.sh
#!/bin/bash
# Конфигурация
BACKUP_DIR="/var/backups"
DATE=$(date +%Y-%m-%d_%H%M%S)
SITE_DIR="/var/www/vds.example.com"
BACKUP_NAME="vds-full-$DATE.tar.gz"
RETENTION_DAYS=30
REMOTE_USER="backup"
REMOTE_HOST="backup.example.com"
REMOTE_PATH="/backups/vds"
# Создаём директорию для бекапов
mkdir -p "$BACKUP_DIR"
# Создаём дамп MySQL, если есть
if command -v mysqldump &> /dev/null; then
mysqldump --all-databases --single-transaction > /tmp/db_dump.sql 2>/dev/null || true
fi
# Архивируем
tar -czf "$BACKUP_DIR/$BACKUP_NAME" \
$SITE_DIR \
/etc/nginx \
/etc/x-ui \
/etc/ufw \
/tmp/db_dump.sql \
2>/dev/null
# Удаляем дамп
rm -f /tmp/db_dump.sql
# Шифруем (опционально)
# gpg --encrypt --recipient your@email.com "$BACKUP_DIR/$BACKUP_NAME"
# rm "$BACKUP_DIR/$BACKUP_NAME"
# Удаляем старые бекапы
find "$BACKUP_DIR" -name "vds-full-*.tar.gz" -mtime +$RETENTION_DAYS -delete
# Отправляем на удалённый сервер
rsync -avz --delete "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"
# Логируем
logger "Backup completed: $BACKUP_NAME ($(du -h "$BACKUP_DIR/$BACKUP_NAME" | cut -f1))"
Делаем скрипт исполняемым:
sudo chmod +x /opt/backup/backup.sh
Настройка cron
Открываем crontab для root:
sudo crontab -e
Добавляем строку для ежедневного запуска в 4:00 утра:
0 4 * * * /opt/backup/backup.sh
Проверяем, что cron запущен:
sudo systemctl status cron
Пробный запуск
Запускаем скрипт вручную:
sudo /opt/backup/backup.sh
Проверяем результат:
ls -lh /var/backups/
tar -tzf /var/backups/vds-full-*.tar.gz | head -10
Последняя команда покажет содержимое архива — убедитесь, что там есть нужные файлы.
Настройка удалённого rsync
Если у вас есть второй сервер или NAS, создайте пользователя для бекапов на удалённой машине и настройте SSH-ключи:
sudo ssh-keygen -t ed25519 -f /root/.ssh/backup_key -N ""
Скопируйте публичный ключ на удалённый сервер:
sudo ssh-copy-id -i /root/.ssh/backup_key.pub backup@backup.example.com
Обновите скрипт, указав ключ:
rsync -avz --delete -e "ssh -i /root/.ssh/backup_key" "$BACKUP_DIR/" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/"
Тестирование восстановления
Бэкап, который не восстановили, — не бэкап. Обязательно проверьте процедуру восстановления:
# Распаковать архив
tar -xzf /var/backups/vds-full-*.tar.gz -C /tmp/restore_test/
# Проверить сайт
ls -la /tmp/restore_test/var/www/vds.example.com/
# Проверить конфиги
diff /etc/nginx/sites-available/vds.example.com /tmp/restore_test/etc/nginx/sites-available/vds.example.com
Если diff не выдал отличий — конфиги сохранены корректно.
Восстановление на новом сервере
В критической ситуации делаем:
# Развернуть свежую Ubuntu
# Установить Nginx, PHP, MySQL
# Скопировать бэкап
scp backup@backup.example.com:/backups/vds/vds-full-*.tar.gz .
# Распаковать
sudo tar -xzf vds-full-*.tar.gz -C /
# Перезапустить сервисы
sudo systemctl restart nginx php8.3-fpm
Все данные и конфиги окажутся на своих местах.
Итог
Автоматические бэкапы настроены: архивация на диск и репликация на удалённый сервер. Система не требует ручного вмешательства — cron делает своё дело каждый день. Процедура восстановления проверена и работает.
Это была заключительная статья цикла «Настройка VDS-сервера с VPN». Сервер готов к полноценной работе: с блоговой CMS, защищённым VPN-туннелем, автоматическими обновлениями и бекапами.
Комментарии
Комментарии пока не подключены.