Автоматичний бекап 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 для додаткової надійності. Але це вже тема окремої статті.
