Автоматический бэкап VPS в S3 с помощью restic
Шифрованные ночные копии в любое S3-хранилище: установка restic, репозиторий, таймер systemd с ротацией и проверка восстановления.

restic — бесплатная программа для бэкапов, которая шифрует данные до отправки, хранит только изменённые блоки (дедупликация) и работает с любым S3-совместимым хранилищем: Backblaze B2, Hetzner Object Storage, Cloudflare R2, MinIO и так далее. Настройка занимает около 20 минут, дальше всё происходит само.
Если сервера ещё нет, VPS на tanaka.host создаётся за минуту с Ubuntu или Debian, а списание идёт по дням — удобно, чтобы просто попробовать.
Как это устроено: репозиторий — это бакет в S3. Каждый запуск создаёт снимок, в хранилище уходят только новые блоки. Всё зашифровано паролем, который знаете только вы. Таймер systemd запускает копирование каждую ночь и удаляет старые снимки по правилам хранения.
Держите бакет у другого провайдера, не там, где сервер. Смысл копии в том, чтобы она пережила проблему с сервером.
1. Бакет и ключи
В панели хранилища:
- Создайте приватный бакет, например
vps-backups. - Создайте ключ доступа с правами только на этот бакет.
- Запишите адрес endpoint, Access Key ID и Secret Key.
2. Установка restic
sudo apt install -y restic
restic version
В репозиториях Debian и Ubuntu версия может отставать; свежую можно скачать с GitHub или обновить саму программу: sudo restic self-update.
3. Пароль и доступы
sudo mkdir -p /etc/restic
sudo chmod 700 /etc/restic
openssl rand -base64 32 | sudo tee /etc/restic/password >/dev/null
sudo chmod 600 /etc/restic/password
sudo nano /etc/restic/env
RESTIC_REPOSITORY=s3:https://АДРЕС_ENDPOINT/vps-backups
RESTIC_PASSWORD_FILE=/etc/restic/password
AWS_ACCESS_KEY_ID=ВАШ_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=ВАШ_SECRET_KEY
sudo chmod 600 /etc/restic/env
Для некоторых хранилищ нужна ещё строка AWS_DEFAULT_REGION=... — смотрите в их документации.
Сохраните пароль из
/etc/restic/passwordв менеджер паролей. Без него копии не расшифровать, а сервер, на котором лежит файл, может быть недоступен именно тогда, когда копия понадобится.
4. Инициализация репозитория
set -a; . /etc/restic/env; set +a
sudo -E restic init
Строка с set -a загружает переменные из файла в текущую сессию; -E передаёт их в sudo.
5. Первая копия
sudo -E restic backup --one-file-system --exclude-caches /etc /root /home /var/www
sudo -E restic snapshots
Перечисляйте только существующие папки. Первый запуск загрузит всё, следующие — только изменения.
Базы данных копируйте дампом, а не файлами: добавьте в cron mysqldump или pg_dumpall в /var/backups и включите эту папку в список. Как делать дампы — в статье про ручные копии.
6. Таймер systemd
Служба /etc/systemd/system/restic-backup.service:
[Unit]
Description=restic backup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
EnvironmentFile=/etc/restic/env
ExecStart=/usr/bin/restic backup --one-file-system --exclude-caches /etc /root /home /var/www /var/backups
ExecStart=/usr/bin/restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
Nice=10
IOSchedulingClass=idle
Хранятся 7 дневных, 4 недельных и 6 месячных снимков, остальное удаляется. Nice и IOSchedulingClass не дают бэкапу мешать сайту.
Таймер /etc/systemd/system/restic-backup.timer:
[Unit]
Description=Nightly restic backup
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=30m
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now restic-backup.timer
sudo systemctl start restic-backup.service
sudo journalctl -u restic-backup.service -n 50
systemctl list-timers restic-backup.timer
7. Проверьте восстановление
set -a; . /etc/restic/env; set +a
sudo -E restic restore latest --target /tmp/restore-test --include /etc/ssh
ls -la /tmp/restore-test/etc/ssh
sudo rm -r /tmp/restore-test
Раз в месяц запускайте restic check — он проверяет целостность репозитория.
Восстановление на новый сервер: установить restic, скопировать /etc/restic/env и пароль, затем restic restore latest --target / или только нужные пути через --include.
Мониторинг
Добавьте в конец службы ещё одну строку ExecStart с curl на push-адрес вашего монитора — например, Uptime Kuma. Если ночью копия не прошла, утром придёт уведомление, а не через полгода, когда она понадобится.