Как настроить резервное копирование файлов в Linux с помощью Borg Backup

0
8509
Обложка статьи: Как настроить резервное копирование файлов в Linux с помощью Borg Backup

Это инструкция по инструменту. Как построить схему копирования целиком и проверить восстановление: резервное копирование 3-2-1.

Borg делает дедуплицированные архивы с шифрованием. Пока не сработал borg extract и ключ лежит отдельно от сервера — это ещё не бэкап, а каталог на диске.

Зачем Borg, а не только rsync

rsync удобен для зеркала. Borg даёт дедупликацию, шифрование и точки во времени: украденный диск без ключа и фразы не читается. Один репозиторий на том же сервере — не резерв. Восстановление данных в CIS Controls и резервное копирование в NIST SP 800-53 (CP-9) — международная практика, не замена вашего регламента.

Что нужно заранее

  • Linux-хост-источник и место под репозиторий: другой диск, другой сервер по SSH или съёмный том.
  • Отдельная учётка ОС для задания бэкапа, не повседневный root-логин админа.
  • Понимание, что ключ и парольная фраза — отдельные секреты. Документация прямо пишет: копия ключа только на том же хосте, который бэкапите, недостаточна.

1. Установка Borg 1.4

Debian / Ubuntu:

sudo apt update
sudo apt install -y borgbackup
borg --version

Ожидание: borg 1.4.5 или соседний патч 1.4. Если репозиторий отдаёт 1.2 или 2.x — остановитесь и сверьте документацию своей ветки. Дальше — только 1.4. На RHEL-подобных часто пакет borgbackup из EPEL:

sudo dnf install -y epel-release
sudo dnf install -y borgbackup
borg --version

2. Репозиторий с шифрованием

Официальный quick start требует режим шифрования при init:

sudo mkdir -p /mnt/backup/borg
sudo chown backup:backup /mnt/backup/borg
borg init --encryption=repokey-blake2 /mnt/backup/borg

repokey-blake2 кладёт ключ внутрь репозитория и закрывает его парольной фразой. Это удобно, но парольная фраза обязательна и её нельзя хранить в том же git, что и плейбуки, без отдельного секрета. Режим keyfile хранит ключ в ~/.config/borg/keys на клиенте: тогда без выгрузки ключа потеря клиента = потеря всех архивов.

Удалённый репозиторий по SSH, если Borg стоит и на приёмнике:

borg init --encryption=repokey-blake2 backup@backup.example.org:/srv/borg/server01

3. Выгрузить ключ сразу

borg key export /mnt/backup/borg /root/borg-key-server01.txt

Файл унесите с хоста-источника: печать, сейф, отдельный секрет-хранилище. Документация называет хранение ключа только на бэкапируемой машине ошибкой «оставили ключи в машине». Проверка: ключ можно восстановить, не включая исходный сервер.

4. Первый архив

borg create --stats --progress \
  /mnt/backup/borg::server01-{now:%Y-%m-%d} \
  /etc /var/www /home

Подставьте свои каталоги. Не кладите в архив сам репозиторий и не копируйте секреты в открытый /tmp. Пример --stats после первого прогона:

------------------------------------------------------------------------------
Archive name: server01-2026-10-11
This archive: 1.12 GB
All archives: 1.12 GB
Unique chunks: 1.12 GB
------------------------------------------------------------------------------

Второй прогон тех же файлов обычно пишет меньше Unique chunks — дедупликация. borg list /mnt/backup/borg должен показать архив с сегодняшней датой:

server01-2026-10-11  Sat, 2026-10-11 03:15:02

5. Хранение: prune и compact

borg prune --list --keep-daily=7 --keep-weekly=4 --keep-monthly=6 /mnt/backup/borg
borg compact /mnt/backup/borg

prune удаляет старые архивы по политике, compact возвращает место. Без compact диск может не сжаться. Политику keep утверждает владелец данных, не «как в примере».

6. Восстановление — обязательный шаг

Официальный extract пишет в текущий каталог. Для проверки возьмите пустой каталог, не корень системы:

mkdir -p /tmp/borg-restore-test
cd /tmp/borg-restore-test
borg list /mnt/backup/borg
borg extract --dry-run /mnt/backup/borg::ИМЯ_АРХИВА
borg extract /mnt/backup/borg::ИМЯ_АРХИВА etc/hostname

Путь в extract — без ведущего /. Пример сверки:

diff -u /etc/hostname /tmp/borg-restore-test/etc/hostname
# пустой вывод diff — файлы совпали

Вытащить один сайт, не весь /var/www:

borg extract /mnt/backup/borg::server01-2026-10-11 var/www/example.com

--dry-run читает и проверяет целостность, но не пишет данные — удобно как регулярная проверка.

Пока extract или сверка контрольной суммы не сделаны, в отчётности писать «бэкап настроен» нельзя. Это авторское правило приёмки, не пункт man, и его стоит закрепить во внутреннем стандарте.

7. Расписание

Пример systemd timer от имени учётки backup. Не кладите парольную фразу в юнит в открытом виде: используйте BORG_PASSCOMMAND или секрет ОС.

# /etc/systemd/system/borg-create.service
[Service]
Type=oneshot
User=backup
Environment=BORG_REPO=/mnt/backup/borg
ExecStart=/usr/bin/borg create --stats ${BORG_REPO}::server01-%Y-%m-%d /etc /var/www /home
ExecStart=/usr/bin/borg prune --keep-daily=7 ${BORG_REPO}

Юнит выше — каркас. BORG_PASSPHRASE в файле юнита не ставьте. Рядом таймер раз в сутки:

# /etc/systemd/system/borg-create.timer
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now borg-create.timer
systemctl list-timers borg-create.timer
journalctl -u borg-create --since today

Ожидание: в list-timers есть следующее срабатывание, в журнале нет ошибки за последние сутки.

Как проверить

  • Репозиторий инициализирован с шифрованием, не none.
  • Ключ выгружен и лежит вне исходного хоста.
  • Есть хотя бы один архив и политика prune.
  • Зафиксирован успешный extract контрольного файла (дата, кто делал, что сравнивали).
  • Задание запускается не вручную «когда вспомнили».

Ограничения и ошибки

  • Репозиторий на том же диске, что и данные — не переживает отказ диска.
  • Потеря парольной фразы или keyfile без export — архивы нечитаемы. Borg это не лечит.
  • extract в непустой корень системы — не «откат сервера», а риск перемешать дерево. Официальный текст предупреждает, что extract не превращает непустой каталог в снимок архива.
  • Borgmatic и Borg 2 — другие обёртки и CLI. Не копируйте флаги 1.4 в 2.x.

Источники

Оставьте свой ответ