Бэкапы есть у всех — пока не попробуешь что-нибудь восстановить. Каталог оказывается пустым, cron-задача умерла ещё в марте, а архив лежит на том самом диске, который только что отказал. restic закрывает почти все эти проблемы: шифрует на вашей стороне, хранит каждый кусок данных один раз и позволяет восстановить один файл так же просто, как забэкапить весь сервер.
Вот настройка, которой мы бы доверились сами, на Ubuntu или Debian.
1. Ставим restic
apt update && apt install -y restic
restic self-update
Пакеты в дистрибутивах отстают; self-update подтянет актуальную версию.
2. Выбираем место для репозитория
Репозиторий не должен жить на сервере, который вы защищаете. Два частых варианта:
- Другой сервер по SFTP:
sftp:backup@203.0.113.20:/srv/restic/web1 - S3-совместимое объектное хранилище:
s3:https://s3.example.com/my-bucket/web1
3. Сохраняем учётные данные
Держим всё в одном файле, доступном только root, чтобы таймер и ваша оболочка использовали одни настройки:
cat > /root/.restic-env <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/my-bucket/web1"
export RESTIC_PASSWORD_FILE="/root/.restic-pass"
export AWS_ACCESS_KEY_ID="your-key-id"
export AWS_SECRET_ACCESS_KEY="your-secret"
EOF
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-env /root/.restic-pass
Теперь скопируйте содержимое /root/.restic-pass в менеджер паролей. Без него бэкапы не расшифровать — ни вам, ни кому-то ещё.
4. Инициализируем и делаем первый бэкап
source /root/.restic-env
restic init
restic backup /etc /home /root /srv /var/www \
--exclude-caches --exclude '/root/.cache'
restic snapshots
Поправьте пути под то, где реально лежат ваши данные. Тома Docker находятся в /var/lib/docker/volumes, данные приложений часто — в /srv или /opt.
5. Базы данных: сначала дамп, потом бэкап
Не бэкапьте сырые файлы работающей базы. Сделайте дамп прямо перед бэкапом:
mkdir -p /var/backups/db
sudo -u postgres pg_dump -Fc mydb > /var/backups/db/mydb.dump
Добавьте /var/backups/db в пути бэкапа. Подробнее о дампах — в нашей инструкции по PostgreSQL.
6. Расписание через systemd
Таймер здесь лучше cron: он пишет в журнал и догоняет пропущенный запуск, если сервер был выключен.
# /etc/systemd/system/restic-backup.service
[Unit]
Description=restic backup
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'source /root/.restic-env && restic backup /etc /home /root /srv /var/www /var/backups/db --exclude-caches && restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune'
# /etc/systemd/system/restic-backup.timer
[Unit]
Description=Daily restic backup
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now restic-backup.timer
systemctl list-timers restic-backup.timer
forget --prune оставляет 7 ежедневных, 4 еженедельных и 6 ежемесячных снимков, остальное удаляет. Если нужен дамп базы, вынесите его в строку ExecStartPre=.
7. Действительно восстановите что-нибудь
Этот шаг превращает «бэкапы у нас есть» в факт. Вытащите один каталог во временную папку и посмотрите на него:
source /root/.restic-env
restic restore latest --target /tmp/restore-test --include /etc/nginx
ls -la /tmp/restore-test/etc/nginx
restic check
Сделайте это сейчас и потом повторяйте раз в несколько месяцев. restic check проверяет структуру репозитория, а восстановление доказывает, что данные там действительно есть.
restic и Managed Backups
Они не конкурируют. Managed Backups делают ежедневную точку восстановления всего сервера с откатом из личного кабинета — быстрое лекарство после неудачного обновления. Стоят $2 в месяц и бесплатно входят в любой годовой тариф. restic даёт копии на уровне файлов в хранилище, которым управляете вы, — это важно, когда пропал файл с прошлого вторника или хочется иметь копию полностью вне нашей инфраструктуры.
Если храните чувствительные данные, добавьте полное шифрование диска, а для собственного хранилища бэкапов посмотрите сценарий с зашифрованным хранилищем. Большинству небольших серверов вместе с бэкапами хватает тарифа Micro.
Комментарии
Пока нет комментариев. Будьте первым.