3-2-1 backup rule — три копии, два разных носителя, одна offsite. "Offsite" в 2026 обычно = S3-совместимое объектное хранилище: AWS S3, Backblaze B2, Cloudflare R2, Wasabi, MinIO. Дёшево (€0.005/ГБ/мес), надёжно, доступно из любой точки.
restic — де-факто стандарт для incremental encrypted backup на 2026: дедупликация на уровне блоков, шифрование AES-256, snapshot-based, работает поверх S3 нативно.
Ниже — рабочий конфиг на Ubuntu VPS: ежедневный бэкап /home + /etc + /var/www в Backblaze B2 (€0.006/ГБ), retention 7d+4w+12m, проверка восстановления.
Шаг 1. Установить restic
Пакет restic в основных репах Ubuntu, но версия часто старая. Актуальную качаем с GitHub-releases.
# вариант 1: apt
sudo apt install -y restic
# вариант 2: последняя версия
curl -sL https://github.com/restic/restic/releases/latest/download/restic_0.17.0_linux_amd64.bz2 \
| bunzip2 > /usr/local/bin/restic
chmod +x /usr/local/bin/restic
restic versionШаг 2. Создать bucket в B2
На backblaze.com → B2 → Create Bucket. Приватный, регион — выбираете по цене/латентности. Затем — Application Keys → Add New Key → restic-vps-1 с правами Read+Write на этот bucket. Копируем keyID и applicationKey.
Шаг 3. Сохранить переменные окружения
Кладём в /root/.restic-env (chmod 600). Пароль репозитория — сгенерируйте сильный (24+ символа), сохраните в password-менеджере: без него бэкапы неснимаемы.
# /root/.restic-env
export B2_ACCOUNT_ID="004abc...def"
export B2_ACCOUNT_KEY="K00...xyz"
export RESTIC_REPOSITORY="b2:my-bucket-name:vps-01"
export RESTIC_PASSWORD="your-strong-password-here"RESTIC_PASSWORD — единственный способ расшифровать бэкапы. Потеряете — данные потеряны. Дублируйте в password-manager (1Password, Bitwarden, Vaultwarden) + бумажную копию в сейф.
Шаг 4. Инициализировать репозиторий
Один раз, при первом запуске.
source /root/.restic-env
restic init
# created restic repository ... at b2:my-bucket-name:vps-01Шаг 5. Первый бэкап
Бэкапим /etc (конфиги), /home (пользовательские данные), /var/www (сайты). Исключаем ненужное.
# /root/.restic-excludes
/var/log
/var/cache
/tmp
node_modules
*.log
*.pid
.cache/
.npm/
# запуск
restic backup /etc /home /var/www \
--exclude-file=/root/.restic-excludes \
--tag daily
restic snapshots # список снапшотов
restic stats # размер репозиторияШаг 6. Cron для ежедневного запуска
Скрипт-обёртка + cron. Кладём в /root/backup.sh.
#!/bin/bash
set -euo pipefail
source /root/.restic-env
# бэкап
restic backup /etc /home /var/www \
--exclude-file=/root/.restic-excludes \
--tag daily
# retention: 7 ежедневных + 4 еженедельных + 12 месячных
restic forget \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--prune
# проверка целостности раз в неделю
if [ "$(date +%u)" = "7" ]; then
restic check --read-data-subset=5%
fi
# ---------- crontab (после chmod +x /root/backup.sh) ----------
# sudo crontab -e
# 0 3 * * * /root/backup.sh >> /var/log/restic.log 2>&1Шаг 7. Восстановление (учения)
Раз в квартал делайте учения: восстанавливаете один файл + одну папку из старого снапшота. Backup, который вы не проверяете — не backup.
source /root/.restic-env
# список снапшотов
restic snapshots
# восстановить конкретный файл
restic restore latest --target /tmp/restore --include /etc/nginx/nginx.conf
# восстановить папку
restic restore latest --target /tmp/restore --include /var/www/example.com
# mount как FS (удобно для explore)
mkdir /mnt/backup
restic mount /mnt/backup &
ls /mnt/backup/snapshots/latest/etc/Шаг 8. Мониторинг
Backup обязательно мониторить — иначе месяц отсутствия бэкапов заметите только при инциденте.
- cron output → email: [email protected] в crontab + любой stderr шлётся письмом.
- Healthchecks.io: ping-URL из скрипта после успеха — если 24 ч нет — телеграм-алерт.
- Prometheus: экспортер
restic-exporterметрики размера + возраста последнего snapshot. - Grafana dashboard: график роста репо + last successful backup — мгновенно видно проблемы.