Блог
DevOps · бэкапDevOps 9 мин чтения

Автоматический бэкап VPS в S3 через restic: конфиг и cron

Практический гайд: как настроить ежедневный инкрементальный бэкап /home /etc /var/www на S3-совместимое хранилище через restic. Шифрование, retention, cron, проверка восстановления.

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 — мгновенно видно проблемы.

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

Стоимость B2 vs S3 vs R2?
B2 — $0.006/ГБ/мес + $0.01/ГБ egress (первые 3× storage бесплатно). S3 — $0.023/ГБ + $0.09/ГБ egress. R2 — $0.015/ГБ + 0 egress. Для бэкапа с редким восстановлением R2 и B2 существенно дешевле.
Как быстро восстанавливать 500 ГБ?
Ограничение — скорость download из S3 + скорость восстановления restic. Обычно 100-500 Мбит/с. 500 ГБ = 2-12 часов. Для быстрого DR — держите горячую копию на локальном диске тоже.
Дедупликация действительно работает?
Да, на content-defined chunks (авг 1 MB). После первого бэкапа 50 ГБ каждый следующий инкремент обычно 100-500 МБ (только реально изменённые блоки).
restic на Windows-сервере?
Да, есть Windows-бинарник. Логика та же, синтаксис путей меняется на `C:\Users\...`.