Бэкап и восстановление BorgBackup
Если вы гоняете tar и rsync в cron, то знаете эту боль: полный бэкап каждую ночь съедает диск за пару недель, инкрементальные копии путаются, а восстановить нужно ровно один файл — и приходится распаковывать гигабайты архива целиком. BorgBackup решает это иначе: он режет данные на блоки, хранит только уникальные, сжимает и по желанию шифрует — и после первого полного бэкапа каждый следующий занимает разумные мегабайты вместо гигабайт.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое BorgBackup и почему дедупликация меняет экономику
Borg — это консольная программа для бэкапов с content-defined chunking: файл делится на блоки переменного размера по содержимому, а не по фиксированным границам. Если вы добавили строку в середину лога на 500 МБ, Borg пересчитает контрольные суммы блоков и увидит, что 499 МБ данных не изменились — в репозиторий уйдёт только новый блок. Для БД-дампов, логов, VM-образов и вообще любых данных, где между снимками меняется малая доля, экономия места — в разы, иногда на порядок.
Три вещи, которые отличают Borg от связки tar + rsync:
- Дедупликация на уровне блоков, а не файлов — работает, даже если файл переименовали или сдвинули часть содержимого.
- Сжатие (lz4, zstd, zlib, lzma) применяется к уже дедуплицированным блокам, экономия складывается.
- Аутентифицированное шифрование (AES-256 + HMAC или BLAKE2) прямо в репозитории — не нужен отдельный
gpgили LUKS-контейнер.
Расплата — Borg держит индекс чанков в памяти клиента при бэкапе, и на первом полном снимке большого датасета это может быть заметно по RAM. Для типичного веб-проекта или пары баз данных это не проблема, для десятков терабайт — стоит закладывать сервер с запасом по памяти.
Установка на сервере
Пакет есть в репозиториях всех популярных дистрибутивов, ставить из исходников не нужно.
# Debian / Ubuntu
apt update && apt install -y borgbackup
# AlmaLinux / RHEL (EPEL)
dnf install -y epel-release
dnf install -y borgbackup
# проверка версии
borg --version
На момент написания в репозиториях Debian 12 и Ubuntu 24.04 идёт ветка 1.2.x — этого достаточно для всех сценариев ниже. Если нужна свежая 1.4 с улучшениями по скорости, ставьте через pipx install borgbackup — это не сломает системный пакет.
Для восстановления через borg mount дополнительно понадобится FUSE:
apt install -y fuse3
# или на системах с fuse2
apt install -y fuse
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверИнициализация репозитория и первый бэкап
Репозиторий — это каталог, куда Borg складывает чанки и метаданные. Он может быть локальным (второй диск, смонтированный NAS) или удалённым по SSH — синтаксис одинаковый.
# локальный репозиторий с шифрованием repokey (ключ хранится внутри репозитория)
borg init --encryption=repokey-blake2 /mnt/backup/repo
# Borg спросит пароль — сохраните его отдельно, без него данные не расшифровать
Пароль репозитория никогда не хранится в открытом виде на сервере, только его хеш. Потеряете пароль — потеряете доступ ко всем архивам, даже имея файлы репозитория на руках. Для автоматизации пароль передают переменной окружения:
export BORG_PASSPHRASE='ваш-длинный-пароль'
# или, безопаснее — команда, которая печатает пароль в stdout
export BORG_PASSCOMMAND='cat /root/.borg-passphrase'
Первый бэкап — полный по объёму данных, но это единственный раз, когда так будет:
borg create \
--stats --progress \
--compression zstd,6 \
--exclude-caches \
/mnt/backup/repo::'{hostname}-{now:%Y-%m-%d_%H:%M}' \
/etc /home /var/www /var/lib/mysql-dump
{hostname} и {now} — плейсхолдеры Borg, каждый запуск создаёт архив с уникальным именем внутри общего репозитория. --exclude-caches пропускает каталоги с файлом CACHEDIR.TAG (типично для node_modules, кешей сборки). Второй и все последующие запуски той же командой будут читать те же файлы, но в репозиторий уйдут только изменившиеся блоки — обычно счётчик "This archive: X MB" резко падает уже со второго прогона.
Автоматизация: cron и ротация через prune
Голый borg create в cron быстро завалит диск архивами, если не чистить старые. За это отвечает borg prune — он не трогает уникальные данные, а лишь помечает архивы на удаление и освобождает больше не нужные чанки:
#!/bin/bash
# /usr/local/bin/borg-backup.sh
set -e
export BORG_PASSCOMMAND='cat /root/.borg-passphrase'
REPO=/mnt/backup/repo
borg create --stats --compression zstd,6 \
"$REPO::{hostname}-{now:%Y-%m-%d_%H:%M}" \
/etc /home /var/www
borg prune --list \
--keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
"$REPO"
# схлопнуть освободившееся место в самом репозитории
borg compact "$REPO"
chmod +x /usr/local/bin/borg-backup.sh
# crontab -e
0 3 * * * /usr/local/bin/borg-backup.sh >> /var/log/borg-backup.log 2>&1
Обратите внимание на borg compact отдельным шагом — без него prune только помечает данные как удалённые, а физическое освобождение места в репозитории (для локального или SSH-репозитория с поддержкой compact) происходит именно на этой команде. Если у вас параллельно настроен мониторинг выполнения задач по расписанию, полезно обернуть скрипт пингом на внешний сервис — это подробно разобрано в статье про мониторинг cron-задач через healthchecks.io: если бэкап ночью не отработал, вы узнаете об этом утром, а не через неделю при попытке восстановиться.
Восстановление данных
Тут Borg удобнее большинства альтернатив — можно вытащить как весь архив, так и один файл, не разворачивая остальное.
# список архивов в репозитории
borg list /mnt/backup/repo
# полное восстановление конкретного архива в текущий каталог
cd /restore
borg extract /mnt/backup/repo::server1-2026-08-30_03:00
# восстановить один путь из архива
borg extract /mnt/backup/repo::server1-2026-08-30_03:00 var/www/site/wp-config.php
Ещё один способ — смонтировать архив как обычную файловую систему через FUSE и найти нужный файл вручную, без заранее известного пути:
mkdir -p /mnt/borg-mount
borg mount /mnt/backup/repo::server1-2026-08-30_03:00 /mnt/borg-mount
# смотрите, копируйте, что нужно
ls /mnt/borg-mount/var/www/
# после работы обязательно отмонтировать
borg umount /mnt/borg-mount
Перед тем как полагаться на бэкап в критический момент, стоит время от времени проверять целостность репозитория — битые чанки на диске или в сети иногда случаются:
borg check --verify-data /mnt/backup/repo
Это не быстрая операция на больших репозиториях (Borg перечитывает и пересчитывает контрольные суммы), поэтому --verify-data разумно гонять не в каждом cron-прогоне, а раз в неделю отдельным заданием. Общие принципы самой процедуры восстановления и то, что стоит проверять заранее, а не в момент аварии, разобраны в статье восстановление базы данных из бэкапа на практике.
Удалённый репозиторий и офсайт-копия
Локальный бэкап на том же сервере защищает от испорченного файла или неудачного деплоя, но не от отказа диска или потери сервера целиком. Borg одинаково работает с репозиторием по SSH — синтаксис меняется только в адресе:
borg init --encryption=repokey-blake2 \
ssh://backup-user@backup-host.example:22/~/repo
borg create --stats --compression zstd,6 \
ssh://backup-user@backup-host.example:22/~/repo::'{hostname}-{now}' \
/etc /home /var/www
На стороне принимающего сервера должен быть установлен тот же Borg (передаётся команда borg serve), а для безопасности имеет смысл ограничить SSH-ключ бэкап-пользователя через command="borg serve --restrict-to-path /home/backup-user/repo" в authorized_keys — тогда с этим ключом ничего, кроме приёма бэкапов, сделать нельзя.
Дедупликация здесь особенно выгодна: если у вас несколько серверов с похожим окружением (одна и та же ОС, одинаковые системные файлы), можно писать в общий репозиторий и получать дедупликацию не только между снимками одной машины, но и между машинами — Borg не знает разницы, чанки есть чанки. Для отдельного VPS под роль бэкап-хранилища стоит закладывать не столько CPU, сколько дисковое пространство и приличный объём RAM под индекс — ориентиры по ресурсам разобраны в статье сколько ресурсов нужно VPS для бэкапов и архива, а пошаговая настройка такого сервера — в статье пошаговая настройка VPS под бэкапы и архив с нуля.
Если шифрование и compliance для вас критичны, а не просто "на всякий случай", посмотрите отдельно разбор нюансов шифрованных бэкапов — бэкап с шифрованием: частые ошибки и решения: там про хранение ключей, доступ при смене персонала и типичные промахи, которые не всегда очевидны из документации Borg.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Чем Borg лучше связки rsync + hardlinks?
Rsync с hardlink-снимками (как в classic rsnapshot) дедуплицирует только целиком неизменившиеся файлы: поменяли байт в середине большого файла — хранится вся новая копия целиком. Borg режет на блоки по содержимому, так что для файлов, которые меняются частично (логи, БД-дампы, VM-образы), экономия места заметно выше.
Можно ли сжать уже существующий репозиторий сильнее задним числом?
Нет напрямую — уровень сжатия задаётся при borg create и применяется к новым чанкам. Старые архивы пересжать без пересоздания репозитория нельзя, но это не критично: для новых бэкапов просто меняете флаг --compression.
Что будет, если я потеряю пароль от репозитория с repokey?
Данные останутся физически на диске, но расшифровать их без пароля невозможно — это by design, не баг. Обязательно храните пароль отдельно от сервера (менеджер паролей, зашифрованная заметка), а не в текстовом файле рядом с бэкап-скриптом.
Нужен ли отдельный сервер под Borg-репозиторий или можно писать бэкап на тот же VPS?
Локальный бэкап на том же диске защищает от логических ошибок (не туда скопировали, снёс не тот каталог), но не от отказа диска целиком. Для реальной защиты нужна хотя бы одна копия на другом сервере — вариант с SSH-репозиторием из этой статьи закрывает именно это.
Как понять, сколько места реально экономит дедупликация?
Команда borg info /path/to/repo показывает три цифры: "Original size" (сколько было бы без дедупликации и сжатия), "Compressed size" и "Deduplicated size" (сколько реально занято на диске). Разница между первой и третьей — и есть ваша экономия, для типичного веб-проекта с ежедневными снимками это часто 5-15x, но цифра сильно зависит от того, как часто меняются данные.
Работает ли Borg на Windows?
Нет полноценно — Borg рассчитан на POSIX-системы (Linux, macOS, BSD). Для Windows-серверов бэкап конфигов обычно делают отдельным инструментом или через WSL, это разобрано отдельно в статье про бэкап конфигов WireGuard на Windows Server.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →