Post

Автоматичний бекап VPS на домашній сервер через rsync

Автоматичний бекап VPS на домашній сервер через rsync

Моніторинг є, Fail2ban є, сайт працює — але якщо диск на VPS здохне, все зникне за секунду. Час налаштувати бекап.

У мене є Ubuntu server в домашній локалці з виділеною IP — ідеальне місце для бекапів з VPS. Використовую rsync по SSH і cron для автоматизації.

Що бекапимо

  • /home/ — всі сайти, включно з WordPress
  • /etc/ — всі конфіги (Fail2ban, SSH, Nginx)
  • MySQL — дамп всіх баз даних
  • Docker volumes — дані Uptime Kuma та інших контейнерів

Налаштування SSH ключів

Бекап має працювати без пароля — через SSH ключі. Генеруємо окремий ключ спеціально для бекапу:

1
2
ssh-keygen -t ed25519 -C "vps-backup" -f ~/.ssh/backup_key -N ""
cat ~/.ssh/backup_key.pub

Копіюємо публічний ключ на домашній сервер:

1
ssh-copy-id -i ~/.ssh/backup_key.pub root@home.com

Або вручну — на Ubuntu server:

1
2
echo "ssh-ed25519 AAAA...ключ..." >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Перевіряємо підключення:

1
2
ssh -i ~/.ssh/backup_key root@home.com "echo OK"
# OK

Створюємо папки для бекапів на Ubuntu:

1
2
ssh -i ~/.ssh/backup_key root@home.com  \
  "mkdir -p ~/backups/vps/{home,etc,db,docker}"

Скрипт бекапу

1
nano /root/backup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#!/bin/bash

# === Налаштування ===
REMOTE_USER="root"
REMOTE_HOST="home.com"
REMOTE_PORT="22"
REMOTE_DIR="/home/nd/backups/vps"
SSH_KEY="/root/.ssh/backup_key"
DATE=$(date +%Y-%m-%d)
LOG="/var/log/backup.log"

echo "=== Бекап розпочато: $(date) ===" >> $LOG

# === База даних ===
echo "Дамп БД..." >> $LOG
mkdir -p /tmp/backup_db
mysqldump --all-databases > /tmp/backup_db/all-databases-$DATE.sql
gzip /tmp/backup_db/all-databases-$DATE.sql

# === Rsync /home/ ===
echo "Rsync /home/..." >> $LOG
rsync -avz --delete \
  -e "ssh -i $SSH_KEY -p $REMOTE_PORT" \
  /home/ \
  $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/home/

# === Rsync /etc/ ===
echo "Rsync /etc/..." >> $LOG
rsync -avz --delete \
  -e "ssh -i $SSH_KEY -p $REMOTE_PORT" \
  /etc/ \
  $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/etc/

# === Бекап БД ===
echo "Копіюємо дамп БД..." >> $LOG
rsync -avz \
  -e "ssh -i $SSH_KEY -p $REMOTE_PORT" \
  /tmp/backup_db/ \
  $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/db/

# === Docker volumes ===
echo "Бекап Docker volumes..." >> $LOG
rsync -avz --delete \
  -e "ssh -i $SSH_KEY -p $REMOTE_PORT" \
  /var/lib/docker/volumes/ \
  $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/docker/

# === Очищення ===
rm -rf /tmp/backup_db

echo "=== Бекап завершено: $(date) ===" >> $LOG

Робимо виконуваним і тестуємо:

1
2
chmod +x /root/backup.sh
bash /root/backup.sh

Результат першого запуску

Лог бекапу Перший запуск — бекап завершено за 2.5 хвилини

Перевіряємо що є на Ubuntu:

1
2
ssh -i ~/.ssh/backup_key root@home.com \
  "ls -lh ~/backups/vps/"

Структура бекапів Чотири папки — home, etc, db, docker

Автоматизація через cron

Запускаємо бекап щодня о 3:00 ночі:

1
crontab -e

Додаємо:

0 3 * * * /root/backup.sh » /var/log/backup.log 2>&1

Перевіряємо:

1
crontab -l

Тепер бекап працює автоматично щодня без участі людини.

Корисні команди

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Запустити бекап вручну
bash /root/backup.sh

# Переглянути лог
tail -f /var/log/backup.log

# Перевірити що є на Ubuntu
ssh -i ~/.ssh/backup_key root@home.com \
  "du -sh ~/backups/vps/*"

# Відновити конкретний файл
rsync -avz \
  -e "ssh -i ~/.ssh/backup_key" \
  root@home.com:~/backups/vps/home/sedunlab.com/ \
  /home/sedunlab.com/

Висновок

Rsync ідеальний для інкрементальних бекапів — копіює тільки змінені файли, тому кожен наступний запуск набагато швидший за перший. З cron це повністю автоматично.

Наступний крок — додати бекап на Google Drive через rclone для додаткової надійності. Але це вже тема окремої статті.

This post is licensed under CC BY 4.0 by the author.