psj-notes
~/home ~/series ~/archive

11. Бэкапы: резервное копирование

21.07.2026 Серия: Настройка VDS сервера с VPN "backup" "резервное-копирование"

Цена потери данных

Жёсткие диски умирают. Ошибки случаются. Скрипт 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-туннелем, автоматическими обновлениями и бекапами.

Комментарии

Комментарии пока не подключены.