Автоматический бэкап VPS в S3 с помощью restic

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

4 ноября 2026 г.·2 мин чтения·backup, restic, s3, systemd

restic — бесплатная программа для бэкапов, которая шифрует данные до отправки, хранит только изменённые блоки (дедупликация) и работает с любым S3-совместимым хранилищем: Backblaze B2, Hetzner Object Storage, Cloudflare R2, MinIO и так далее. Настройка занимает около 20 минут, дальше всё происходит само.

Если сервера ещё нет, VPS на tanaka.host создаётся за минуту с Ubuntu или Debian, а списание идёт по дням — удобно, чтобы просто попробовать.

Как это устроено: репозиторий — это бакет в S3. Каждый запуск создаёт снимок, в хранилище уходят только новые блоки. Всё зашифровано паролем, который знаете только вы. Таймер systemd запускает копирование каждую ночь и удаляет старые снимки по правилам хранения.

Держите бакет у другого провайдера, не там, где сервер. Смысл копии в том, чтобы она пережила проблему с сервером.

1. Бакет и ключи

В панели хранилища:

  1. Создайте приватный бакет, например vps-backups.
  2. Создайте ключ доступа с правами только на этот бакет.
  3. Запишите адрес 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. Если ночью копия не прошла, утром придёт уведомление, а не через полгода, когда она понадобится.