Bacula 15
Bacula
Bacula — программное обеспечение с открытым исходным кодом для централизованного управления резервным копированием, восстановлением и проверкой данных в сетях любого масштаба. Bacula сочетает в себе гибкость, масштабируемость и продвинутые функции управления хранилищами.
Bacula автоматизирует процессы резервного копирования и работает с различными носителями данных, включая диски и ленточные системы.
Baculum
Baculum — это веб-приложение с открытым исходным кодом для использования ряда заданий Bacula по резервному копированию и восстановлению.
Архитектура решения
В качестве примера настроим систему резервного копирования Bacula 15 для личных файлов пользователя и базы данных PostgreSQL 17 с управлением через веб-интерфейс Baculum 15.
Сервер («Альт Сервер 11.0», без GUI) включает в себя следующие компоненты:
- сервер СУБД PostgreSQL 17;
- Bacula 15 (Bacula Director, Bacula Storage, Bacula File Daemon, Bacula Console);
- Baculum 15.
Клиент («Альт Рабочая станция 11.1») включает в себя следующие компоненты:
- Bacula 15 (Bacula File Daemon);
- личные файлы пользователя (каталог /home/user/Files).
Установка сервера PostgreSQL
Для установки на сервере выполним команду:
# apt-get install postgresql17-server postgresql17-contrib
После завершения установки создадим системные базы данных и укажем пароль пользователя postgres:
# /etc/init.d/postgresql initdb
Внесем изменения в конфигурационный файл /var/lib/pgsql/data/postgresql.conf:
listen_addresses = '192.168.0.132' # включает доступ по сети
wal_level = archive # указывается уровень ведения журналов
archive_mode = on # разрешается ведение журналов
archive_command = '/var/lib/pgsql/bin/copy_wal.sh "%f" "%p"'
max_wal_senders = 5
Внесем изменения в конфигурационный файл /var/lib/pgsql/data/pg_hba.conf:
...
# "local" is for Unix domain socket connections only
local bacula bacula trust # разрешает локальное подключение пользователя bacula к БД bacula
local all all scram-sha-256
# IPv4 local connections:
host all all 192.168.0.132/24 trust # разрешает подключение к серверу БД с указанного IP-адреса
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication postgres trust # разрешает подключение пользователя postgres для репликации
local replication all scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
Создадим каталог, в котором будут храниться журналы:
# mkdir /var/lib/pgsql/wals
# chown postgres:postgres /var/lib/pgsql/wals
# chmod 700 /var/lib/pgsql/wals
Создадим каталог для скрипта, который будет архивировать журналы:
# mkdir /var/lib/pgsql/bin
# chown postgres:postgres /var/lib/pgsql/bin
# chmod 700 /var/lib/pgsql/bin
Создадим скрипт для архивирования журналов /var/lib/pgsql/bin/copy_wal.sh:
#!/bin/bash
DPATH=/var/lib/pgsql/wals
DATE=`date +"%b %d %T"`
if [ -e /var/lib/pgsql/backup_in_progress ]; then # По наличию файла проверяет не идет ли процесс резервного копирования журналов
echo "${DATE} - идет процесс резервного копирования журналов" >> "${DPATH}/wal-c-log.log"
exit 1
fi
if [ -e ${DPATH}/$1 ]; then # Проверяет скопирован ли журнал раннее
echo "${DATE} - файл уже архивирован" >> "${DPATH}/wal-c-log.log"
exit 1
fi
echo "${DATE} - /bin/gzip $2 ${DPATH}/$1" >> "${DPATH}/wal-c-log.log"
gzip < $2 > "${DPATH}/$1" # Архивирует файл журнала
Скрипт проверяет состояния резервного копирования журналов и архивирует журналы в каталог /var/lib/pgsql/wals, все свои действия он пишет в /var/lib/pgsql/wals/wal-c-log.log.
Установим права на скрипт:
# chown postgres:postgres /var/lib/pgsql/bin/copy_wal.sh
# chmod 700 /var/lib/pgsql/bin/copy_wal.sh
Добавим службу в автозапуск и запустим ее:
# systemctl enable --now postgresql
Установка Bacula
Установка на сервере
Для установки Bacula на сервере выполним команду:
# apt-get install bacula15-common bacula15-console bacula15-director-common bacula15-director-postgresql bacula15-storage bacula15-client mt-st
В Bacula присутствуют скрипты для создания базы, пользователя и таблиц. Чтобы задать пароль для пользователя bacula, необходимо отредактировать следующую строку в файле /usr/share/bacula/scripts/grant_postgresql_privileges:
db_password="baculaPass"
Создадим базу данных bacula и пользователя bacula:
# /usr/share/bacula/scripts/create_postgresql_database -U postgres
Создадим таблицы базы данных:
# /usr/share/bacula/scripts/make_postgresql_tables -U postgres
Установим привилегии пользователю bacula:
# /usr/share/bacula/scripts/grant_postgresql_privileges -U postgres
Базовая настройка конфигурационных файлов Bacula
В процессе выполнения базовой настройки Bacula настроим резервное копирование файлов пользователя, расположенных на клиенте в каталоге /home/user/Files.
В конфигурационном файле /etc/bacula/bacula-dir.conf укажем пароль пользователя bacula, который был задан при создании пользователя:
Director {
Name = dir-fs # Имя
DIRport = 9101 # Порт который будет слушать Director
QueryFile = "/usr/share/bacula/scripts/query.sql"
WorkingDirectory = "/var/lib/bacula"
PidDirectory = "/var/run/bacula"
Maximum Concurrent Jobs = 1
@/etc/bacula/bacula-dir-password.conf # Файл с паролем для доступа к Director
Messages = Daemon
}
# Параметры каталога
Catalog {
Name = MyCatalog # Имя каталога
dbname = bacula # Имя базы данных
user = bacula # Имя пользователя базы данных
password = "baculaPass" # Пароль пользователя базы данных
}
# Дальнейшие строчки подгружают конфигурационные файлы из подкаталогов job.d fileset.d schedule.d client.d storage.d messages.d pool.d
@|"sh -c 'for f in /etc/bacula/job.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/fileset.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/schedule.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/client.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/storage.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/messages.d/*.conf ; do echo @${f} ; done'"
@|"sh -c 'for f in /etc/bacula/pool.d/*.conf ; do echo @${f} ; done'"
В конфигурационном файле /etc/bacula/bacula-dir-password.conf укажем пароль для доступа к Director:
Password = "DirPass" # Пароль для доступа к директору
В конфигурационном файле /etc/bacula/bacula-sd-password.conf укажем пароль для доступа к хранилищу:
Password = "SdPass" # Пароль для доступа к хранилищу
Создадим каталог для хранения резервных копий файлов пользователя:
# mkdir /home/backup
# chown bacula:bacula /home/backup
Укажем каталог для хранения резервных копий файлов пользователя в конфигурационном файле /etc/bacula/device.d/filestorage.conf:
Device {
Name = FileStorage
Media Type = File
Archive Device = /home/backup
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
В конфигурационном файле /etc/bacula/storage.d/file.conf необходимо указать IP-адрес ресурса, на котором расположено хранилище:
# Definition of file storage device
Storage {
Name = File
# Do not use "localhost" here
Address = 192.168.0.132 # IP-адрес сервера на котором расположено файловое хранилище
SDPort = 9103
@/etc/bacula/bacula-sd-password.conf
Device = FileStorage
Media Type = File
}
В конфигурационном файле /etc/bacula/fileset.d/fullset.conf укажем каталог, в котором располагаются файлы для резервного копирования:
# List of files to be backed up
FileSet {
Name = "Full Set"
Include {
Options {
signature = MD5
}
File = /home/user/Files
}
}
В конфигурационном файле /etc/bacula/client.d/client1.conf укажем IP-адрес клиента:
# Client (File Services) to backup
Client {
Name = fd
Address = 192.168.0.150
FDPort = 9102
Catalog = MyCatalog
@/etc/bacula/bacula-fd-password.conf
File Retention = 30 days # 30 days
Job Retention = 6 months # six months
AutoPrune = yes # Prune expired Jobs/Files
}
Создадим файл file-backup-cycle.conf в каталоге /etc/bacula/schedule.d/ со следующим содержимым:
Schedule {
Name = "file-backup-cycle"
Run = Incremental mon,wed,fri at 23:00 # задание будет выполнять инкрементное резервное копирование каждый пн, ср и пт в 23:00
}
В конфигурационном файле задания /etc/bacula/job.d/bacula.conf укажем созданное расписание для резервного копирования:
#
# Define the main nightly save backup job
# By default, this job will back up to disk in @archivedir@
Job {
Name = "BackupFullSet"
JobDefs = "DefaultJob"
Schedule = "file-backup-cycle"
Write Bootstrap = "/var/lib/bacula/Client1.bsr"
}
В конфигурационном файле хранилищ /etc/bacula/bconsole.conf укажем IP-адрес расположения Director:
#
# Bacula User Agent (or Console) Configuration File
#
Director {
Name = dir
DIRport = 9101 #Порт подключения к Director
address = 192.168.0.132 # Адрес расположения Director
@/etc/bacula/bacula-dir-password.conf # Пароль для подключения к Director
}
В конфигурационном файле /etc/bacula/bacula-fd-password.conf укажем пароль для доступа к клиенту:
Password = "FdPass" # Пароль для доступа к клиенту
Для включения логирования внесем изменения в файлы, расположенные в каталоге /etc/bacula/messages.d/:
daemon.conf:
#
# Message delivery for daemon messages (no job).
Messages {
Name = Daemon
mailcommand = "/bin/mail -s \"Bacula: %t %e of %c %l\" root@localhost"
mail = root@localhost = all, !skipped
console = all, !skipped, !saved
append = "/var/log/bacula/log" = all, !skipped
catalog = all, !skipped, !saved
}
standart.conf:
# Reasonable message delivery -- send most everything to email address
# and to the console
Messages {
Name = Standard
mailcommand = "/bin/mail -s \"Bacula: %t %e of %c %l\" %r"
operatorcommand = "/bin/mail -s \"Bacula: Intervention needed for %j\" %r"
mail = root@localhost = all, !skipped
operator = root@localhost = mount
console = all, !skipped, !saved
append = "/var/log/bacula/log" = all, !skipped
catalog = all, !skipped, !saved
}
Запустим службы bacula-dir, bacula-sd и bacula-fd и добавим их в автозапуск:
# systemctl enable --now bacula-dir
# systemctl enable --now bacula-sd
# systemctl enable --now bacula-fd
Установка на клиенте
Для установки Bacula на клиенте выполним команду:
# apt-get install bacula15-client
После завершения установки настроим клиент для подключения к серверу.
В конфигурационном файле /etc/bacula/bacula-dir-password.conf укажем пароль для доступа к Dierctor:
Password = "DirPass" # Пароль для доступа к директору
В конфигурационном файле /etc/bacula/bacula-sd-password.conf укажем пароль для доступа к хранилищу:
Password = "SdPass" # Пароль для доступа к хранилищу
В конфигурационном файле /etc/bacula/bacula-fd-password.conf укажем пароль для доступа к клиенту:
Password = "FDPass" # Пароль для доступа к клиенту
Запустим службу bacula-fd и добавим ее в автозапуск:
# systemctl enable --now bacula-fd
Настройка резервного копирования БД
Создание скриптов
Для резервного копирования БД PostgreSQL на сервере в каталоге /etc/bacula/ создадим необходимые скрипты.
Скрипт, который создает полную копию БД перед выполнением задачи по резервному копированию pre-base-backup.sh:
#!/bin/bash
DATE=`date +"%b %d %T"`
/usr/bin/pg_basebackup -D /var/lib/pgsql/backup -F t -z -U postgres -w -c fast -l "pg_basebackup ${DATE}"
Скрипт, который удаляет созданную резервную копию БД после выполнения задачи post-base-backup.sh:
#!/bin/bash
rm -f /var/lib/pgsql/backup/*
Скрипт, который создает файл backup_in_progress перед выполнением задачи по резервному копированию журналов pre-logs-backup.sh:
#!/bin/bash
touch /var/lib/pgsql/backup_in_progress
Скрипт, который очищает каталог с журналами backup_in_progress после выполнения задания по резервному копированию журналов post-logs-backup.sh:
#!/bin/bash
rm -f /var/lib/pgsql/wals/*
rm -f /var/lib/pgsql/backup_in_progress
Сделаем созданные скрипты исполняемыми:
# chmod 750 /etc/bacula/pre-base-backup.sh
# chmod 750 /etc/bacula/post-logs-backup.sh
# chmod 750 /etc/bacula/post-base-backup.sh
# chmod 750 /etc/bacula/pre-logs-backup.sh
Создание клиента
Добавим нового клиента. Для этого в каталоге /etc/bacula/client.d/ создадим файл base-fd.conf:
Client {
Name = base-fd # Имя клиента
Address = 192.168.0.132 # IP или FQN
FDPort = 9102 # Порт
Catalog = MyCatalog # Используемый каталог
@/etc/bacula/bacula-fd-password.conf # Пароль для доступа к клиенту
File Retention = 30 days # Срок хранения метаданных о файлах
Job Retention = 6 months # Срок хранения метаданных о задачах
AutoPrune = yes # Автоматическое удаление устаревших метаданных
}
Создание списка набора файлов
Добавим списки наборов файлов. Для этого в каталоге /etc/bacula/fileset.d/ создадим файлы:
base-fileset.conf для резервного копирования БД:
FileSet {
Name = "base-fileset"
Include {
Options {
signature = MD5
Sparse = yes
aclsupport = yes
xattrsupport = yes
}
File = "/var/lib/pgsql/backup"
}
}
logs-fileset.conf для резервного копирования журналов:
FileSet {
Name = "logs-fileset"
Include {
Options {
signature = MD5
Sparse = yes
aclsupport = yes
xattrsupport = yes
}
File = "/var/lib/pgsql/wals"
}
}
Создание задач
Добавим задачи для резервного копирования. Для этого в каталоге /etc/bacula/job.d/ создадим файлы:
Файл шаблона параметров для заданий резервного копирования base-backup-job.conf:
JobDefs {
Name = "BaseBackupJob"
Type = Backup
Level = Incremental
Client = fd
FileSet = "Full Set"
Storage = File-base
Messages = Standard
Pool = Default
Priority = 10
}
Задача резервного копирования БД pgsql-base-backup.conf:
Job {
Name = "pgsql-base-backup"
JobDefs = "BaseBackupJob"
Client = base-fd
FileSet = "base-fileset"
Accurate = no
Pool = base-pool
Priority = 10 # приоритет выполнения задачи
Schedule = "base-backup-cycle"
ClientRunBeforeJob = "/etc/bacula/pre-base-backup.sh" # скрипт выполняющийся до задачи
ClientRunAfterJob = "/etc/bacula/post-base-backup.sh" # скрипт выполняющийся после задачи
}
Задача резервного копирования журналов pgsql-logs-backup.conf:
Job {
Name = "pgsql-logs-backup"
JobDefs = "BaseBackupJob"
Client = base-fd
FileSet = "logs-fileset"
Accurate = no
Pool = base-pool
Priority = 11 # приоритет ниже чем у задачи резервного копирования базы
Schedule = "logs-backup-cycle"
ClientRunBeforeJob = "/etc/bacula/pre-logs-backup.sh" # скрипт выполняющийся до задачи
ClientRunAfterJob = "/etc/bacula/post-logs-backup.sh"# скрипт выполняющийся после задачи
}
Создадим каталог для хранения резервных копий БД PostgreSQL:
# mkdir /home/backup-base
# chown bacula:bacula /home/backup-base
Создание файлового хранилища
Добавим новое файловое хранилище. Для этого в каталоге /etc/bacula/device.d/ создадим файл filestorage-base.conf, в котором укажем созданный каталог:
Device {
Name = FileStorage-base
Media Type = File
Archive Device = /home/backup-base
LabelMedia = yes; # lets Bacula label unlabeled media
Random Access = Yes;
AutomaticMount = yes; # when device opened, read it
RemovableMedia = no;
AlwaysOpen = no;
}
В каталоге /etc/bacula/storage.d/ создадим файл file-base.conf, в котором указаны параметры файлового хранилища для резервного копирования БД:
# Definition of file storage device
Storage {
Name = File-base
# Do not use "localhost" here
Address = 192.168.0.132 IP или FQN хранилища (если указать 127.0.0.1, то будет доступен только локальный backup)
SDPort = 9103
@/etc/bacula/bacula-sd-password.conf
Device = FileStorage-base
Media Type = File
}
Создание пула
Добавим новый пул. Для этого в каталоге /etc/bacula/pool.d/ создадим файл base-pool.conf:
Pool {
Name = base-pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 365 days
LabelFormat = "Vol-"
}
Создание расписания
Добавим расписания для созданных задач. Для этого в каталоге /etc/bacula/schedule.d/ создадим файлы:
base-backup-cycle.conf:
Schedule {
Name = "base-backup-cycle"
Run = Full fri at 23:50 # задание будет выполнять полное резервное копирование каждую пятницу в 23:50
}
logs-backup-cycle.conf:
Schedule {
Name = "logs-backup-cycle"
Run = Incremental mon,wed,fri at 23:20 # задание будет выполнять инкрементное резервное копирование каждый пн, ср и пт в 23:20
}
Установка Baculum
Для установки Baculum на сервере выполним команду:
# apt-get install baculum15-postgresql baculum15-apache2
Далее включим сайты baculum-api и baculum-web в apache2:
# a2ensite baculum-api
# a2ensite baculum-web
Для работы Baculum включим следующие модули:
# a2enmod auth_basic
# a2enmod authn_core
# a2enmod authn_file
# a2enmod authz_core
# a2enmod authz_host
# a2enmod authz_user
# a2enmod mod_php8.3
# a2enmod negotiation
# a2enmod rewrite
# a2enmod setenvif
Или тоже самое одной командой:
# for mod in auth_basic authn_core authn_file authz_cor authz_host authz_user mod_php8.3 negotiation rewrite setenvif; do a2enmod $mod; done
Добавим пользователя apache2 в группу bacula:
# usermod -a -G bacula apache2
Для работы с Bconsole разрешаем Baculum запускать необходимые бинарники без пароля:
# control sudo public
# echo "Defaults:apache2 "'!'"requiretty
> apache2 ALL=NOPASSWD: /usr/bin/bconsole
> apache2 ALL=NOPASSWD: /usr/sbin/bdirjson
> apache2 ALL=NOPASSWD: /usr/sbin/bsdjson
> apache2 ALL=NOPASSWD: /usr/sbin/bfdjson
> apache2 ALL=NOPASSWD: /usr/sbin/bbconsjson" > /etc/sudoers.d/baculum
echo "Defaults:apache2 "'!'"requiretty
apache2 ALL=NOPASSWD: /usr/bin/bconsole
apache2 ALL=NOPASSWD: /usr/sbin/bdirjson
apache2 ALL=NOPASSWD: /usr/sbin/bsdjson
apache2 ALL=NOPASSWD: /usr/sbin/bfdjson
apache2 ALL=NOPASSWD: /usr/sbin/bbconsjson
apache2 ALL=NOPASSWD: /usr/bin/systemctl start bacula-dir
apache2 ALL=NOPASSWD: /usr/bin/systemctl stop bacula-dir
apache2 ALL=NOPASSWD: /usr/bin/systemctl restart bacula-dir
apache2 ALL=NOPASSWD: /usr/bin/systemctl start bacula-sd
apache2 ALL=NOPASSWD: /usr/bin/systemctl stop bacula-sd
apache2 ALL=NOPASSWD: /usr/bin/systemctl restart bacula-sd
apache2 ALL=NOPASSWD: /usr/bin/systemctl start bacula-fd
apache2 ALL=NOPASSWD: /usr/bin/systemctl stop bacula-fd
apache2 ALL=NOPASSWD: /usr/bin/systemctl restart bacula-fd" > /etc/sudoers.d/baculum
Создадим рабочий каталог Baculum для конфигурации Bacula и назначим его владельцем пользователя apache2:
# mkdir /etc/bacula/baculum
# chown apache2:apache2 /etc/bacula/baculum
Запустим службу httpd2 и добавим ее в автозапуск:
# systemctl enable --now httpd2
Настройка веб-интерфейса Baculum
Настройка Baculum API
Для настройки откроем на клиенте браузер и перейдем по ссылке http://192.168.0.132:9096
Введем имя пользователя и пароль:
Выберем язык:
Настроим доступ к базе данных:
Настроим доступ Baculum к интерфейсу Bconsole:
Настроим доступ к конфигурационным файлам Bacula:
Настроим аутентификацию Baculum API:
Ознакомимся с настройками и нажмем Сохранить:
Настройка Baculum WEB
Для настройки откроем на клиенте браузер и перейдем по ссылке http://192.168.0.132:9095
Введем имя пользователя и пароль:
Выберем язык:
Добавим настроенный ранее хост Baculum API:
Введем имя пользователя и пароль для входа в Baculum WEB:
Ознакомимся с настройками и нажмем Сохранить:
После завершения настроек и повторной аутентификации откроется стартовая страница Baculum WEB:
Резервное копирование в Baculum WEB
Для ручного запуска резервного копирования нажмем на кнопку Запустить задание на панели управления Baculum WEB.
В открывшемся окне выберем задание для выполнения BackupFullSet и нажмем кнопку Запустить задание:
На странице История заданий подробно отобразится ход выполнения задания резервного копирования:
Восстановление файлов из резервной копии
Для ручного запуска резервного копирования нажмем кнопку Выполнить восстановление на панели управления Baculum WEB.
В открывшемся окне Мастер восстановления выберем с какого клиента нужно восстановить резервную копию:
Выберем точку для восстановления:
Выберем файлы, которые требуется восстановить:
Укажем папку для восстановления:
Определим параметры восстановления:
Проверим параметры восстановления файлов и нажмем кнопку Запустить восстановление:
После завершения задачи файлы будут доступны в указанном каталоге.
Резервное копирование БД PostgreSQL
Резервное копирование БД PostgreSQL выполняется по тому же сценарию, что и резервное копирование файлов пользователя. Запустим задание pgsql-base-backup для резервного копирования файлов БД:
и задание pgsql-logs-backup для резервного копирования журналов БД:
Восстановление БД PostgreSQL
Для восстановления БД PostgreSQL восстановим резервную копию файлов и журналов БД так же, как восстанавливали резервную копию файлов пользователя.
Для восстановления БД PostgreSQL из восстановленных файлов и журналов:
- остановим службу postgresql;
- скопируем каталог pg_wal в безопасное место, так как он может содержать файлы журналов WAL, не попавшие в резервную копию;
- удалим содержимое каталога базы данных /var/lib/pgsql/data/;
- распакуем архив с резервной копией БД в каталог базы данных /var/lib/pgsql/data/:
# tar -xzf /tmp/bacula-restores/var/lib/pgsql/backup/base.tar.gz -C /var/lib/pgsql/data/
- удалим каталог pg_wal восстановленный из резервной копии БД;
- скопируем сохраненный ранее каталог pg_wal в каталог базы данных /var/lib/pgsql/data/ и проверим наличие необходимых прав у пользователя postgres;
- добавим в конфигурационный файл /var/lib/pgsql/data.postgresql.conf строку:
restore_command = 'gunzip < /var/lib/pgsql/wal/%f > %p'
- в каталоге базы данных /var/lib/pgsql/data создадим файл recovery.signal.
- запустим службу postgresql.




