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-UUIDHealthchecks.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 шифрованного). Комбинация закрывает все сценарии.