Большинство руководств по резервному копированию Linux перестают показывать вам tar или rsync и называют это днем. BorgBackup идет дальше с дедупликацией, сжатием и шифрованием, что означает, что вторая резервная копия занимает секунды, а не минуты, потому что хранятся только измененные данные. Соедините его с Borgmatic (обертка, управляемая конфигурацией), и вы получите запланированные автоматические резервные копии с политиками хранения, крюками базы данных и интеграцией мониторинга из одного файла YAML.

Это руководство охватывает установку BorgBackup и Borgmatic на Ubuntu 26.04, инициализацию зашифрованных репозиториев, запуск ручных и автоматизированных резервных копий, восстановление файлов и настройку системных таймеров для безотказной работы.

Предпосылки

  • Сервер под управлением Ubuntu 26.04
  • Права пользователя: пользователь root или обычный пользователь с привилегиями sudo.

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя

Шаг 1. Обновите систему

Свежая установка Ubuntu 26.04 требует обновления пакетов до последних доступных версий.

1
$ sudo apt update -y && sudo apt upgrade -y

Система может нуждаться в перезагрузке после обновления.

1
sudo reboot -f

Шаг 2. Установите BorgBackup и Borgmatic

BorgBackup находится в репозиториях по умолчанию. Borgmatic устанавливается чисто через pipx, что делает его изолированным от системных пакетов Python:

1
2
sudo apt install borgbackup pipx
sudo pipx install borgmatic

Добавьте двоичный путь pipx, чтобы borgmatic была доступна по всей системе:

1
2
3
sudo pipx ensurepath
sudo su -
export PATH="/root/.local/bin:$PATH"

Шаг 3. Инициировать Зашифрованный Репозиторий BorgBackup

Прежде чем Borgmatic войдет в картину, она поможет понять необработанные команды Borg. Репозиторий Borg - это каталог, в котором хранятся все ваши резервные архивы. Создайте его с включенным шифрованием (вы всегда должны шифровать резервные копии):

1
2
sudo mkdir -p /backup
sudo borg init --encryption=repokey /backup/borg-repo

Borg подсказывает парольную фразу. Выберите что-то сильное и храните его отдельно. Режим repokey хранит ключ шифрования в репозитории (зашифрован с помощью вашей парольной фразы). Borg печатает предупреждение, напоминающее вам резервную копию ключа:

1
2
3
4
ВАЖНО: для доступа к этому РЕПО вам понадобятся оба ключа и парольная фраза!
Если вы использовали режим repokey, ключ хранится в репо, но вы должны резервировать его отдельно.
Используйте «borg key export» для экспорта ключа, необязательно в печатном формате.
Запишите парольную фразу. Обе находятся в безопасном месте.

Немедленно экспортируйте ключ и храните его в безопасном месте (менеджер паролей, USB-накопитель в пожаробезопасном сейфе или оба):

1
sudo borg key export /backup/borg-repo /root/borg-key-backup.txt

Шаг 4. Создайте свою первую резервную копию с BorgBackup

Чтобы не вводить пароль каждый раз, храните его в файле с ограниченными разрешениями:

1
2
3
echo "YourStrongPassphrase" | sudo tee /root/.borg-passphrase > /dev/null
sudo chmod 600 /root/.borg-passphrase
export BORG_PASSPHRASE=$(cat /root/.borg-passphrase)

Теперь создайте резервную копию /etc и /var/log с компрессией zstd:

1
2
3
4
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg create \
  --stats --compression zstd \
  /backup/borg-repo::baseline-$(date +%Y%m%d) \
  /etc /var/log

Borg показывает подробную статистику после завершения резервного копирования:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Repository: /backup/borg-repo
Archive name: baseline-20261111
Archive fingerprint: 76c4aed853fed3e228c907d48d624aad...
Time (start): Tue, 2026-11-11 12:16:48
Time (end):   Tue, 2026-11-11 12:16:49
Duration: 0.59 seconds
Number of files: 866
                       Original size      Compressed size    Deduplicated size
This archive:               19.75 MB              1.18 MB              1.15 MB
All archives:               19.75 MB              1.17 MB              1.22 MB

19,75 МБ данных сжато до 1,18 МБ. Это снижение на 94%. Колонка дедупликации имеет большее значение, когда у вас есть несколько резервных копий, потому что Borg хранит только уникальные фрагменты данных во всех архивах.

Инкрементные резервные копии

Внесите изменения в систему (установите пакет, отредактируйте конфигурацию) и запустите другую резервную копию:

1
2
3
4
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg create \
  --stats --compression zstd \
  /backup/borg-repo::after-changes-$(date +%Y%m%d-%H%M) \
  /etc /var/log

Вторая резервная копия значительно быстрее и меньше:

1
2
3
4
Duration: 0.31 seconds
                       Original size      Compressed size    Deduplicated size
This archive:               19.76 MB              1.19 MB            385.63 kB
All archives:               39.50 MB              2.36 MB              1.66 MB

Сохранилось только 385,63 кБ новых дублированных данных. Резервное копирование завершилось за 0,31 секунды. Вот почему Borg так хорошо работает для ежедневных автоматизированных резервных копий: после первоначального полного резервного копирования каждый последующий запуск передает только дельту.

Шаг 5. Список, проверка и удаление архивов

Перечислите все архивы в репозитории:

1
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg list /backup/borg-repo

Каждый архив отмечен отпечатком пальца:

1
2
baseline-20261111               Tue, 2026-11-11 12:16:48 [76c4aed853fe...]
after-changes-20261111-2217     Tue, 2026-11-11 12:17:07 [9be1a8b40ebd...]

Посмотреть общую статистику репозитория с информацией о Borg:

1
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg info /backup/borg-repo

Выход подтверждает статус шифрования хранилища, местоположение кэша и общий дублированный размер:

1
2
3
4
5
Repository ID: 237a2fdc1790d6604add7629043c5c24...
Location: /backup/borg-repo
Encrypted: Yes (repokey)
                       Original size      Compressed size    Deduplicated size
All archives:               39.50 MB              2.36 MB              1.66 MB

Чтобы увидеть, что именно изменилось между двумя архивами, используйте borg diff:

1
2
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg diff \
  /backup/borg-repo::baseline-20261111 after-changes-20261111-2217

Borg показывает различия уровня байта для каждого измененного файла, что полезно для проверки того, что произошло между резервными копиями.

Шаг 6. Восстановление файлов из резервной копии

Извлеките определенные файлы из архива в целевой каталог:

1
2
3
4
sudo mkdir -p /tmp/borg-restore
cd /tmp/borg-restore
sudo BORG_PASSPHRASE=$(cat /root/.borg-passphrase) borg extract \
  /backup/borg-repo::baseline-20261111 etc/hostname

Извлеченные файлы появляются в текущем каталоге с их оригинальной структурой пути. Проверьте восстановление:

1
cat /tmp/borg-restore/etc/hostname

Чтобы восстановить весь архив (полное восстановление системы), запустите borg extract без указания путей. Делайте это из живой USB или спасательной среды, если восстанавливаете /etc и системные каталоги в запущенной системе.

Шаг 7. Настройка Borgmatic для автоматического резервного копирования

Запуск команд borg работает, но Borgmatic заворачивает все в один файл конфигурации YAML и обрабатывает создание репо, резервное копирование, обрезку и проверку согласованности в одной команде. Создайте конфигурацию по умолчанию:

1
2
sudo mkdir -p /etc/borgmatic
sudo borgmatic config generate --destination /etc/borgmatic/config.yaml

Созданный файл имеет все опции, комментируемые примерами. Замените его готовой к производству конфигурацией. Откройте файл:

1
sudo nano /etc/borgmatic/config.yaml

Добавить следующую конфигурацию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
source_directories:
    - /etc
    - /home
    - /var/log
    - /root

exclude_patterns:
    - "*.pyc"
    - /home/*/.cache
    - /var/log/journal

repositories:
    - path: /backup/borg-repo
      label: local

encryption_passcommand: cat /root/.borg-passphrase

compression: auto,zstd

keep_daily: 7
keep_weekly: 4
keep_monthly: 6
keep_yearly: 1

checks:
    - name: repository
      frequency: 2 weeks
    - name: archives
      frequency: 1 month

Команда encryption_passcommand говорит Borgmatic прочитать парольную фразу из файла вместо подсказки. Опции keep_* контролируют, сколько архивов хранить после обрезки: 7 ежедневно, 4 еженедельно, 6 ежемесячно, 1 год. Проверяйте конфигурацию перед ее использованием:

1
sudo borgmatic config validate

Вы должны увидеть пропуск проверки:

1
All configuration files are valid

Инициировать хранение через Borgmatic

Если вы еще не создали репо с сырым Borg, Borgmatic может сделать это:

1
sudo borgmatic rcreate --encryption repokey

Запустите свою первую Borgmatic резервную копию

Создайте резервную копию с выходом статистики:

1
sudo borgmatic create --stats --verbosity 1

Borgmatic считывает конфигурацию, подключается к репозиторию и создает архив:

1
2
3
4
5
6
7
8
9
local: Creating archive
Creating archive at "/backup/borg-repo::ubuntu-borg-2026-11-11T12:18:27.311489"
Duration: 1.09 seconds
Number of files: 1935
                       Original size      Compressed size    Deduplicated size
This archive:               19.40 MB              9.30 MB              9.04 MB

summary:
/etc/borgmatic/config.yaml: Successfully ran configuration file

Borgmatic автоматически именует архивы, используя имя хоста и шаблон метки времени {hostname}-{now}. Вторая резервная копия после установки пакета заняла 0,39 секунды и хранила только 51,47 кБ новых дублированных данных.

Шаг 8. Отправьте Borgmatic пинг на ntfy (необязательно)

Создайте двух пользователей (используйте собственное имя администратора вместо someuser):

1
2
ntfy user add --role=admin someuser
ntfy user add bots

Каждая команда подтверждает пользователя и его роль.

1
2
user someuser added with role admin
user bots added with role user

Предоставьте тему ACLs с шаблоном wildcard, поэтому каждая новая тема homelab- покрыта без другой команды.

1
ntfy access bots "homelab-backups" write-only

Затем создайте токен для пользователя bots. Токен лучше, чем пароль бота в сценариях, потому что вы можете отозвать его самостоятельно, и его этикетка показывает, для чего он предназначен:

1
ntfy token add --label="borgmatic" bots

Копируйте значение tk_ сейчас. Токен ниже является заполнителем в том же формате, что и напечатанный на нашем сервере, а остальная часть руководства использует его везде, где идет ваш реальный токен:

1
token tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2 created for user bots, never expires

Запуск ntfy access без аргументов перечисляет все правила, и это самый быстрый аудит, который у вас есть:

1
ntfy access

Внимательно прочитайте последний блок. Анонимный пользователь * не имеет правил темы, а конфигурация сервера делает его «недоступным»:

1
2
3
4
5
6
7
user someuser (role: admin, tier: none)
- read-write access to all topics (admin role)
user bots (role: user, tier: none)
- write-only access to topic homelab-backups
user * (role: anonymous, tier: none)
- no topic-specific permissions
- no access to any (other) topics (server config)

Храните токен в файле только для корней на каждой машине, которая отправляет оповещения, и экспортируйте его для следующих тестов завитков:

1
2
3
echo "tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2" | sudo tee /etc/ntfy-token > /dev/null
sudo chmod 600 /etc/ntfy-token
export NTFY_TOKEN=$(sudo cat /etc/ntfy-token)

Мы проверили ACL с обеих сторон. Токен bots может публиковаться в режиме homelab-backups, но получает 403 на тему вне шаблона и на чтение своих собственных тем.

Откройте файл:

1
sudo nano /etc/borgmatic/config.yaml

Добавить следующую конфигурацию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
source_directories:
    - /etc
    - /home
    - /var/log
    - /root

exclude_patterns:
    - "*.pyc"
    - /home/*/.cache
    - /var/log/journal

repositories:
    - path: /backup/borg-repo
      label: local

encryption_passcommand: cat /root/.borg-passphrase

compression: auto,zstd

keep_daily: 7
keep_weekly: 4
keep_monthly: 6
keep_yearly: 1

checks:
    - name: repository
      frequency: 2 weeks
    - name: archives
      frequency: 1 month

ntfy:
    topic: homelab-backups
    server: https://ntfy.example.com
    access_token: tk_AgQdq7mVBoFD37zQVN29RhuMzNIz2
    start:
        title: borgmatic started on ntfy01
        message: Nightly backup is running
        tags: borgmatic
        priority: min
    finish:
        title: borgmatic finished on ntfy01
        message: Backup and prune completed
        tags: borgmatic,white_check_mark
        priority: low
    fail:
        title: borgmatic FAILED on ntfy01
        message: Check journalctl -u borgmatic for the error
        tags: borgmatic,skull
        priority: max
    states:
        - start
        - finish
        - fail

В веб-приложении неудача приземляется сверху с тегом черепа и максимальным маркером приоритета, выше старта и финиша.

Одна деталь, которую стоит скопировать: неудачный забег все равно отправил свой стартовый пинг. Если вы когда-либо видели начало без финиша или провал после него, borgmatic умер тяжело (из памяти, перезагрузка) до того, как его крюки могли работать, что само по себе является сигналом.

Шаг 9. Управление архивами с помощью Borgmatic

Перечислите все архивы:

1
sudo borgmatic list

На выходе показаны все архивы с метками времени:

1
2
3
local: Listing archives
ubuntu-borg-2026-11-11T12:18:27.311489 Tue, 2026-11-11 12:18:27 [e541a01c...]
ubuntu-borg-2026-11-11T12:18:47.604749 Tue, 2026-11-11 12:18:47 [186c749a...]

Обрезайте старые архивы в соответствии с политикой хранения в конфигурации:

1
sudo borgmatic prune --list --verbosity 1

Borg показывает, какие архивы он хранит и какие удаляет на основе ваших правил keep_*:

1
2
Keeping archive (rule: daily #1):        ubuntu-borg-2026-11-11T12:18:47.604749
Keeping archive (rule: daily[oldest] #2): ubuntu-borg-2026-11-11T12:18:27.311489

Извлеките конкретный файл из последнего архива:

1
sudo borgmatic extract --archive latest --path etc/hostname --destination /tmp/restore

Для полного восстановления пропустите --path, чтобы извлечь весь архив.

Шаг 10. Резервное копирование с помощью Systemd Timers

Системные таймеры более надежны, чем cron для долгосрочных задач, потому что они обрабатывают пропущенные запуски (от простоя системы) и поддерживают рандомизированные задержки, чтобы избежать штормов ввода-вывода. Создать сервисный блок:

1
sudo nano /etc/systemd/system/borgmatic.service

Добавить следующую конфигурацию:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[Unit]
Description=borgmatic backup
Wants=network-online.target
After=network-online.target
ConditionACPower=true

[Service]
Type=oneshot
Nice=19
IOSchedulingClass=best-effort
IOSchedulingPriority=7
ExecStartPre=sleep 1m
ExecStart=/root/.local/bin/borgmatic --verbosity -2 --syslog-verbosity 1
TimeoutStartSec=3h

[Install]
WantedBy=multi-user.target

Приоритет Nice=19 и IOSchedulingPriority=7 обеспечивают работу резервных копий с наименьшим приоритетом процессора и ввода-вывода, поэтому они не мешают производственным нагрузкам. ConditionACPower=true пропускает резервные копии на аккумуляторе (полезно для ноутбуков). Теперь создайте таймер:

1
sudo nano /etc/systemd/system/borgmatic.timer

Установите его для ежедневной работы с рандомизированной 3-часовой задержкой:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description=Run borgmatic backup daily

[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=3h

[Install]
WantedBy=timers.target

``Persistent=true` гарантирует, что пропущенные резервные копии (от простоя) запускаются сразу же, когда система возвращается. Включите и запустите таймер:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable borgmatic.timer
sudo systemctl start borgmatic.timer

Подтвердите, что таймер активен:

1
sudo systemctl list-timers borgmatic.timer

Выход показывает, когда будет запущена следующая резервная копия:

1
2
NEXT                            LEFT    LAST PASSED UNIT            ACTIVATES
Wed 2026-11-12 02:10:21 UTC  3h 51min  -         -  borgmatic.timer borgmatic.service

Шаг 11. Назад к удаленному серверу через SSH

Локальные резервные копии защищают от сбоев программного обеспечения, но не от сбоев оборудования. Для защиты вне сайта Borg поддерживает удаленные репозитории через SSH. Сначала настройте аутентификацию на основе ключа на сервер резервного копирования:

1
2
sudo ssh-keygen -t ed25519 -f /root/.ssh/id_borg -N ""
sudo ssh-copy-id -i /root/.ssh/id_borg.pub username@offsite_server

Установите BorgBackup на удаленный сервер (он должен быть доступен на обоих концах). Затем обновите конфигурацию Borgmatic, чтобы использовать удаленное хранилище:

1
2
3
4
5
6
7
repositories:
    - path: ssh://username@offsite_server/./borg-repo
      label: remote
    - path: /backup/borg-repo
      label: local

ssh_command: ssh -i /root/.ssh/id_borg -o BatchMode=yes

С двумя репозиториями, сконфигурированными, Borgmatic поддерживает оба в последовательности. Если один терпит неудачу, другой все равно завершается. Инициируйте удаленное репо перед первым запуском:

1
sudo borgmatic rcreate --encryption repokey --repository ssh://username@offsite_server/./borg-repo

Завершение

Дедупликация и сжатие BorgBackup означают, что ваши дополнительные резервные копии измеряются в килобайтах, а не мегабайтах. Borgmatic заворачивает весь рабочий процесс (создавать, обрезать, проверять) в один файл конфигурации, который ежедневно запускается системным таймером. С включенным шифрованием, удаленными репозиториями только для приложений и проверенной процедурой восстановления у вас есть система резервного копирования, которая обрабатывает как случайные удаления, так и сбои диска. Для дополнительной защиты соединяйте Borg с Timeshift для снимков системы на настольных компьютерах или используйте отдельный инструмент для резервных копий в конкретных базах данных, где имеет значение восстановление в момент времени.

Если вам понравился этот пост о том, как установить Borgbackup с помощью Borgmatic на Ubuntu 26.04, пожалуйста, поделитесь им со своими друзьями в социальных сетях, используя кнопки обмена ниже, или просто оставьте комментарий в разделе комментариев. Спасибо.