Блог
DevOps · практикаDevOps 7 мин чтения

rsync + cron: incremental backup за 15 минут

Минимальная схема резервного копирования без restic/borg: rsync + hard-links = дедупликация. 200 строк bash, работает годами, восстанавливается тривиально.

Restic и Borg — прекрасны, но иногда нужно проще. Rsync + hard-links + cron дают полноценный incremental backup с дедупликацией, работающий 20 лет без обновлений. Особенно хорош для малых серверов или backup между своими машинами.

Разберём минимальный настрой, преимущества/недостатки, и когда всё-таки лучше брать restic.

Как это работает: hard-link magic

Идея простая: каждую ночь rsync копирует изменённые файлы, неизменённые — просто добавляются в новый каталог как hard-link на предыдущий.

Что даёт:

  • Каждый бэкап — самостоятельная копия каталога, читается как обычная папка.
  • Занимает место только для реально изменённых файлов (дедупликация через inode).
  • Восстановление = cp -a. Никаких специальных утилит.
  • Работает на любой ФС, поддерживающей hard-links (ext4, xfs, zfs, btrfs).

Минимальный скрипт

Основа schemы — rsync --link-dest:

#!/bin/bash
# /usr/local/bin/backup-rsync.sh
set -euo pipefail

SRC="/var/www /etc /home"
DST="/backup"
DATE=$(date +%Y-%m-%d_%H%M)
LAST="$DST/latest"
NEW="$DST/$DATE"

# --link-dest = все неизменённые файлы будут hard-links на LAST
rsync -a --delete \
  --link-dest="$LAST" \
  $SRC "$NEW"

# Обновить симлинк latest
rm -f "$LAST"
ln -s "$NEW" "$LAST"

# Retention: удалить бэкапы старше 30 дней
find "$DST" -maxdepth 1 -type d -name '20*' -mtime +30 -exec rm -rf {} \;

echo "Backup done: $NEW ($(du -sh "$NEW" | cut -f1))"

Cron и уведомления

Ставим в cron с обёрткой в flock (чтобы не наложился):

# /etc/cron.d/backup
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

30 3 * * * root flock -n /var/lock/backup.lock /usr/local/bin/backup-rsync.sh >>/var/log/backup.log 2>&1 && curl -s https://hc-ping.com/YOUR-UUID
Совет

Healthchecks.io пингуется только при успехе — если бэкап упал, вы получите alert. Free-план поддерживает 20 checks.

Offsite — критически важно

Локальный --link-dest не защитит от смерти VPS. Нужна вторая копия в другом месте. Варианты:

  • rsync -e ssh на другой VPS (другой хостер, другой регион).
  • rclone → S3-совместимое (BackBlaze B2 самый дешёвый).
  • Своя NAS дома через VPN.
# Дополнительно к локальному backup:
# Каждую ночь синхронизируем latest на удалённый:
rsync -az --delete --link-dest=/backup/latest \
  /backup/latest/ \
  [email protected]:/backup/mysite/

# Или в S3:
rclone sync /backup/latest/ b2:mybucket/mysite/latest/
Осторожно

Backup на «второй диск того же VPS» — не offsite. При компрометации/удалении VPS пропадёт всё.

БД — отдельная песня

rsync-ать живую MySQL/PostgreSQL — плохая идея (несогласованный дамп). Стандарт:

# В backup-rsync.sh перед rsync:
DB_DUMP="/var/backups/db-$(date +%Y-%m-%d).sql.gz"
mysqldump --single-transaction --routines --triggers \
  --all-databases | gzip > "$DB_DUMP"

# Только последние 7 дней
find /var/backups -name 'db-*.sql.gz' -mtime +7 -delete

# rsync подхватит /var/backups как часть SRC

Плюсы vs restic

Когда rsync-hard-links лучше:

  • Backup в открытом виде (можно ls, cd, cat) — удобно на dev-серверах.
  • Нет зависимости от одного инструмента (restic обновит формат — старые бэкапы придётся мигрировать).
  • Проще restore: cp вместо restic restore --path.
  • Работает без интернета — full локально.
Когда restic лучше:
✅ Шифрование бэкапа (rsync + hard-link — без шифра)
✅ Deduplication на уровне блоков (rsync — только на уровне файла)
✅ Efficient S3 upload (restic понимает блоки, rsync — файлы)
✅ Snapshot browser (`restic mount`)
✅ Retention с политиками (keep-daily N, keep-weekly M)

Итого — что выбрать

rsync + link-dest — идеален для внутренних машин (dev, staging, home lab). Быстро, просто, надёжно.

restic — для production, offsite, шифрованных бэкапов в S3. См. гайд по restic.

Часто вижу в проде: локально rsync + hard-link (для быстрого отката), плюс restic на S3 (для offsite шифрованного). Комбинация закрывает все сценарии.

Частые вопросы

Место на диске быстро закончится?
Нет, hard-links занимают ~0 байт. 30 дней бэкапов сайта на 5 GB — обычно ~7-10 GB на диске.
Как проверить, что hard-link работает?
`du -sh /backup/*` — если размер каждой папки одинаковый, hard-link не сработал. Нормально: первая полная, следующие крошечные.
Восстановление одного файла?
`cp /backup/2026-07-04_0330/var/www/html/wp-config.php /var/www/html/`. Всё.
Работает на btrfs/zfs?
Работает, но там есть родные snapshot-механизмы, часто удобнее. rsync-hard-links остаётся полезен для offsite.