Bareos – это система резервного копирования с открытым исходным кодом, позволяющая создавать, управлять и восстанавливать бэкапы для серверов. В этой статье рассмотрим процесс установки и настройки Bareos для автоматизированного резервного копирования данных как на выделенном, так и на облачном сервере, используя S3-хранилище для хранения бэкапов.
Для начала создадим облачный сервер, на котором будет работать Bareos.
Так как на сервере будут работать несколько ресурсоемких служб, включая базу данных и Bareos Storage Director, оптимальная конфигурация будет следующей:
Однако вы можете выбрать другую конфигурацию в зависимости от ваших потребностей, объема данных и частоты резервного копирования.
Если вы настраиваете резервное копирование для выделенного сервера, ему потребуется внешний IP-адрес, так как передача данных будет выполняться через интернет.
Если же Bareos будет использоваться для создания бэкапов облачных серверов, можно добавить сервер в существующую локальную сеть и во всей инструкции использовать его локальный IP-адрес.
Далее создадим S3-бакет. Для наших целей идеально подойдет холодный класс хранилища. Учтите, что даже если используется инкрементное резервное копирование, в хранилище должен помещаться как минимум один полный бэкап всего сервера, а также ежедневные изменения, умноженные на количество дней хранения.
Bareos использует PostgreSQL для хранения конфигурации и информации о бэкапах. Чтобы упростить установку, мы воспользуемся Docker Compose. В результате установим саму СУБД и Adminer — веб-интерфейс для работы с базой.
Сначала установим Docker и Docker Compose:
apt install -y docker.io docker-compose
Создадим манифест docker-compose.yml
:
version: '3.8'
networks:
bareos_network:
driver: bridge
services:
postgres:
image: public.ecr.aws/docker/library/postgres:14-alpine
container_name: postgres_db
restart: unless-stopped
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: <ваш_пароль_администратора_бд>
networks:
- bareos_network
ports:
- "127.0.0.1:5432:5432"
volumes:
- ~/bareos_database:/var/lib/postgresql/data
adminer:
image: public.ecr.aws/docker/library/adminer:4
container_name: adminer_ui
restart: unless-stopped
environment:
ADMINER_DEFAULT_SERVER: postgres_db
ADMINER_DEFAULT_DB: bareos
ADMINER_DEFAULT_USER: bareos
ADMINER_DEFAULT_DBTYPE: postgres
networks:
- bareos_network
ports:
- "8080:8080"
depends_on:
- postgres
volumes:
postgres_data:
driver: local
Укажите вместо <ваш_пароль_администратора_бд>
пароль администратора базы данных.
Выполните команду для запуска контейнеров:
docker-compose up -d
После загрузки образов и запуска контейнеров убедитесь, что они работают:
docker ps
Вы должны увидеть примерно такой вывод:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6fe992e70b4 public.ecr.aws/docker/library/adminer:4 "entrypoint.sh php -…" 1 minutes ago Up 1 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp adminer_ui
fe683271e380 public.ecr.aws/docker/library/postgres:14-alpine "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 127.0.0.1:5432->5432/tcp postgres_db
Добавим репозитории Bareos с помощью официального скрипта:
wget -qO- https://download.bareos.org/current/xUbuntu_22.04/add_bareos_repositories.sh | sh
Обновим список пакетов и установим необходимые компоненты:
apt update && apt install -y bareos bareos-webui bareos-storage-droplet
Во время установки появится запрос на настройку Postfix. Выберите No configuration
.
Затем будет предложено настроить подключение к базе данных. Выберите No
.
Запустим инструмент для настройки подключения к базе данных:
dpkg-reconfigure bareos-database-common
В первом окне выберите Yes
.
В качестве типа подключения укажите TCP/IP
.
Так как база данных запущена на localhost
, выберите его.
Если вы не меняли порт в docker-compose.yml
, укажите 5432
.
В качестве метода аутентификации администратора выберите password
.
Для пользователя базы данных также выберите password
.
Bareos использует базу данных с именем bareos
и пользователя bareos
.
Создадим базу данных.
Затем создадим пользователя.
Установим пароль пользователя.
Подтвердим пароль.
Теперь необходимо ввести данные администратора PostgreSQL, которые мы задавали в docker-compose.yml
.
Имя пользователя: admin
.
Введите пароль администратора PostgreSQL.
Пароль администратора потребуется ввести несколько раз в процессе настройки.
Чтобы убедиться, что база создана и работает, откройте браузер и перейдите по адресу http://<ip_сервера>:8080
.
Залогиньтесь, используя имя пользователя bareos
и ранее заданный пароль.
После авторизации должны отобразиться таблицы базы данных Bareos.
Теперь запустим службы:
systemctl enable --now bareos-director.service bareos-storage.service
Проверим, что службы работают, подключены к базе данных и не содержат ошибок:
bareos-dir -t -d100
Для работы веб-интерфейса Bareos необходимо включить php8-fpm
в Apache2.
Включите модули Apache для работы с PHP-FPM:
a2enmod proxy_fcgi setenvif
Активируйте конфигурацию PHP 8.1 FPM:
a2enconf php8.1-fpm
Перезагрузите Apache, чтобы изменения вступили в силу:
systemctl reload apache2
В Ubuntu AppArmor может блокировать доступ php-fpm к файлам веб-интерфейса. Разрешим необходимые пути:
cat > /etc/apparmor.d/local/php-fpm <<<"# Site-specific additions and overrides for 'php-fpm'
# bareos-webui
/usr/share/bareos-webui/** r,
/etc/bareos-webui/directors.ini r,
/etc/bareos-webui/configuration.ini r,
/var/lib/php8/sessions/** w,
"
Применим новые политики безопасности:
systemctl reload apparmor.service
Теперь необходимо создать пользователя bareos. Для его создания, воспользуемся утилитой bconsole
:
bconsole
Создадим учетную запись admin
для веб-интерфейса:
configure add console name=admin password=<пароль_пользователя> profile=webui-admin tlsenable=false
Вместо <пароль_пользователя> укажите желаемый пароль.
Применим изменения:
reload
Выйти из bconsole можно сочетанием клавиш Ctrl + D
.
Теперь можно открыть браузер и перейти по адресу http://<ip_сервера>/bareos-webui. Войти в систему можно, используя ранее созданные учетные данные.
Создадим файл с параметрами подключения:
nano /etc/bareos/bareos-sd.d/device/droplet/timeweb-ru-1.profile
Добавим в него следующую конфигурацию:
host = s3.timeweb.cloud
use_https = false
access_key = <s3_access_key>
secret_key = <s3_secret_access_key>
pricing_dir = ""
backend = s3
aws_auth_sign_version = 2
aws_region = ru-1
Данные для заполнения (<s3_access_key>
и <s3_secret_access_key>
) можно найти в информации о бакете в панели управления.
Создадим файл:
nano /etc/bareos/bareos-sd.d/device/S3_ObjectStorage.conf
Запишем в него информацию об устройстве. Укажите имя своего бакета в Device Options:
Device {
Name = S3_ObjectStorage
Media Type = S3_Object1
Archive Device = S3 Object Storage
Device Type = droplet
Device Options = "profile=/etc/bareos/bareos-sd.d/device/droplet/timeweb-ru-1.profile,bucket=<имя_бакета>,chunksize=100M"
Label Media = yes
Random Access = yes
Automatic Mount = yes
Removable Media = no
Always Open = no
Maximum Concurrent Jobs = 1
}
Дадим пользователю Bareos доступ к этим файлам:
chown -R bareos:bareos /etc/bareos/bareos-sd.d/device
Bareos может не подключаться к хранилищу, если включён TLS. Отключим его, добавив TlsEnable=no
и TlsRequire=no
в следующие файлы.
Откроем файл bareos-sd.conf
:
nano /etc/bareos/bareos-sd.d/storage/bareos-sd.conf
Изменим содержимое:
Storage {
Name = bareos-sd
Maximum Concurrent Jobs = 20
TlsEnable = no
TlsRequire = no
}
Откроем файл bareos-dir.conf
:
nano /etc/bareos/bareos-sd.d/director/bareos-dir.conf
Изменим содержимое:
Director {
Name = bareos-dir
TlsEnable = no
TlsRequire = no
Password = "<sd_passwd>" # Этот пароль генерируется при установке и не требует изменений
Description = "Director, who is permitted to contact this storage daemon."
}
Запомните или сохраните пароль, указанный в Password из bareos-dir.conf
, он понадобится на следующем шаге.
В bconsole подключим bareos-storage-daemon
к bareos-director
, используя ранее сохранённый пароль:
bconsole
Выполним команду:
configure add storage name=S3_Object Address=<ip_сервера_бэкапов> Password=<sd_passwd> Device=S3_ObjectStorage MediaType=S3_Object1
В команде укажите <ip_сервера_бэкапов>
и <sd_passwd>
.
Примените конфигурацию:
reload
Для применения изменений перезапустим службы:
systemctl restart bareos-storage.service && systemctl reload bareos-director.service
Обратите внимание, что Bareos читает файлы конфигурации только в ASCII-кодировке. Если вы редактировали файлы способом, отличным от указанного в инструкции, может возникнуть ошибка. Чтобы это исправить, необходимо изменить кодировку файлов. Сделать это можно при помощи команды:
iconv -f utf-8 -t ascii//TRANSLIT /path/to/my/file.conf -o /path/to/my/file.conf
Сначала необходимо создать пользователя, через которого основной сервер будет соединяться с сервером бэкапов.
Войдём в bconsole:
bconsole
Выполним команду:
configure add client name=BackupUser address=<usr_ip> password=<usr_pswd> TlsEnable=no TlsRequire=no
В команде укажите два параметра:
<usr_ip>
— внешний IP-адрес сервера, для которого будут создаваться бэкапы.
<usr_pswd>
— пароль для подключения. Его нужно придумать.
Примените изменения:
reload
После выполнения команды в консоли появится подобный вывод:
Это сформированный конфигурационный файл с паролем пользователя. Сохраните значение из поля Password, оно понадобится для подключения сервера. Если пароль будет утерян, его можно найти с помощью команды:
grep -r Password /etc/bareos/bareos-dir-export/client/
Для хранения данных Bareos использует pool и volume:
В нашем случае:
<i>
) — должен быть равен полному объёму информации сервера, который мы собираемся бэкапить.<n>
) — определяет, сколько копий данных необходимо хранить.<r>
) — время хранения резервной копии в днях, после которого она будет помечена для перезаписи.Данные из volume не удаляются, а только помечаются как стертые и подготовленные к перезаписи.
Откроем файл конфигурации:
nano /etc/bareos/bareos-dir.d/pool/Full.conf
Отредактируйте, приведя к виду:
Pool {
Name = Full
Pool Type = Backup
Recycle = yes # Bareos может автоматически перераспределять объемы
AutoPrune = yes # Удалять устаревшие объемы
Volume Retention = <r> days # Срок хранения полных бэкапов
Maximum Volume Bytes = <i>G # Максимальный размер volume
Maximum Volumes = <n> # Максимальное количество volume в пуле
Label Format = "Full-" # Метка volume, например "Full-001"
}
Откроем файл:
nano /etc/bareos/bareos-dir.d/pool/Incremental.conf
Приведем к виду:
Pool {
Name = Incremental
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = <r> days
Maximum Volume Bytes = <i>G
Maximum Volumes = <n>
Label Format = "Incremental-"
}
FileSet – это конфигурационный файл, в котором указывается, какие именно файлы или базы данных необходимо включить в бэкап, а также какие параметры будут использоваться при их копировании (например, уровень сжатия или метод проверки целостности данных).
Этот файлсет используется для бэкапа пользовательских данных, хранящихся в /home.
Создадим файл:
nano /etc/bareos/bareos-dir.d/fileset/HomeFileset.conf
Добавим следующий конфиг:
FileSet {
Name = "HomeFileset"
Include {
Options {
Signature = MD5
Compression = LZ4
}
File = "/home"
}
}
Здесь:
Signature = MD5
— включает проверку целостности данных.
Compression = LZ4
— используется быстрый алгоритм сжатия, который снижает нагрузку на CPU.
File = "/home"
— указывает, что резервное копирование будет выполняться для /home.
Для бэкапа MySQL необходимо использовать специальный плагин, позволяющий корректно копировать базы без прерывания работы сервера.
Создадим файл:
nano /etc/bareos/bareos-dir.d/fileset/MysqlFileset.conf
Добавим конфигурацию:
FileSet {
Name = "MysqlFileset"
Include {
Options {
Signature = MD5
Compression = LZ4
}
Plugin = "python3"
":module_name=bareos-fd-percona-xtrabackup"
":mycnf=/root/.my.cnf"
}
}
Здесь:
Plugin = "python3"
— указывает, что для создания бэкапа будет использоваться плагин на Python.
":module_name=bareos-fd-percona-xtrabackup"
— использует Percona XtraBackup для создания бэкапа без остановки MySQL.
":mycnf=/root/.my.cnf"
— указывает путь к файлу конфигурации MySQL, содержащему учетные данные.
Для PostgreSQL также используется специальный плагин, позволяющий создавать бэкапы без прерывания работы сервера.
Создадим файл:
nano /etc/bareos/bareos-dir.d/fileset/PsqlFileset.conf
Добавим:
FileSet {
Name = "PostgresUserDBSet"
Include {
Options {
Signature = MD5
Compression = LZ4
}
Plugin = "python3"
":module_name=bareos-fd-postgresql"
":db_host=/run/postgresql/"
":wal_archive_dir=/var/lib/pgsql/wal_archive/"
":db_user=<psql_user>"
":db_password=<psql_passwd>"
}
}
Замените:
<psql_user>
— на имя пользователя PostgreSQL.
<psql_passwd>
— на пароль от базы данных.
Параметры:
":db_host=/run/postgresql/"
— указывает, что PostgreSQL работает через Unix-сокеты.
":wal_archive_dir=/var/lib/pgsql/wal_archive/"
— включает копирование WAL-журналов.
Чтобы Bareos мог прочитать созданные файлы, дадим пользователю bareos необходимые права:
chown -R bareos:bareos /etc/bareos/bareos-dir.d/fileset
И обновить конфигурацию сервера bareos чтобы прочитать новые файлсеты:
systemctl reload bareos-director.service
Bareos позволяет задать расписание резервного копирования через параметр Schedule.
Запустим bconsole:
bconsole
Создадим правило:
configure add schedule name=BackupSchedule Run="Level=Full 3/3 at 00:00" Run="Level=Incremental daily at 01:00"
Применим изменение:
reload
Мы задали расписание:
Полный бэкап (Level=Full
) выполняется раз в 3 дня в 00:00.
Инкрементальный бэкап (Level=Incremental
) выполняется ежедневно в 01:00.
Bareos использует два типа конфигурационных файлов для бэкапов:
JobDefs — содержит общие настройки, которые могут использоваться в нескольких заданиях.
Job — конкретное задание резервного копирования с указанием клиентских данных.
Открываем bconsole:
bconsole
Добавляем правило:
configure add jobdefs name=DefaultBackupJob Storage=S3_Object Type=Backup Level=Incremental Pool=Incremental FullBackupPool=Full IncrementalBackupPool=Incremental Schedule=BackupSchedule Messages=Standard Priority=10
Применим изменение:
reload
Описание параметров:
Storage=S3_Object
— указывает, что бэкапы будут храниться в S3.
Level=Incremental
— по умолчанию бэкап выполняется как инкрементальный.
Pool=Incremental
— используется пул для инкрементальных копий.
FullBackupPool=Full
— полные копии отправляются в пул Full.
Schedule=BackupSchedule
— задает расписание.
Messages=Standard
— формат логирования.
Добавляем задачу:
configure add job name=BackupJob Client=BackupUser JobDefs=DefaultBackupJob FileSet=HomeFileset
Применим изменение:
reload
Здесь:
Client=BackupUser
— указывает, что бэкап выполняется для клиента BackupUser
.
FileSet=HomeFileset
— задает файловый набор с путями к данным.
Чтобы можно было восстановить файлы, создадим задание RestoreJob:
configure add job name=RestoreJob Type=Restore Client=BackupUser FileSet=HomeFileset Storage=S3_Object Pool=Incremental Messages=Standard Where="/" MaximumConcurrentJobs=10
Применим изменение:
reload
Параметры:
Type=Restore
— задает, что это задание восстановления.
Storage=S3_Object
— указывает хранилище.
Pool=Incremental
— используется пул инкрементальных бэкапов.
Where="/"
— файлы восстанавливаются в корневую директорию.
Bareos по умолчанию создает демонстрационные конфигурации, которые не используются в продакшен-среде. Их необходимо удалить:
rm -f /etc/bareos/bareos-dir.d/jobdefs/DefaultJob.conf \
/etc/bareos/bareos-dir.d/job/BackupCatalog.conf \
/etc/bareos/bareos-dir.d/job/backup-bareos-fd.conf \
/etc/bareos/bareos-dir.d/job/RestoreFiles.conf
Очистим базу данных от неиспользуемых записей:
bareos-dbcheck -b -f
Bareos использует службу bareos-filedaemon
, которая должна быть установлена на сервере, с которого будут создаваться резервные копии.
Установка в Ubuntu
Добавим репозиторий Bareos:
wget -qO- https://download.bareos.org/current/xUbuntu_22.04/add_bareos_repositories.sh | sh
Обновим список пакетов и установим Bareos File Daemon:
apt update && apt install bareos-filedaemon -y
Включим и запустим Bareos File Daemon:
systemctl enable --now bareos-filedaemon.service
Установка в RHEL
Добавим правила для файрвола, открыв необходимые порты:
firewall-cmd --permanent --add-port={80,443,9101,9102,9103}/tcp && firewall-cmd --reload
Добавим репозиторий Bareos:
wget https://download.bareos.org/current/EL_9/bareos.repo -O /etc/yum.repos.d/bareos_EL_9.repo
Обновим кеш пакетов и установим Bareos File Daemon:
yum makecache && yum install bareos-filedaemon -y
Включим и запустим Bareos File Daemon:
systemctl enable --now bareos-filedaemon.service
Теперь необходимо настроить подключение к Bareos Director, используя пароль, который был получен на этапе создания пользователя.
Открываем конфигурационный файл:
nano /etc/bareos/bareos-fd.d/director/bareos-dir.conf
Указываем следующие параметры:
Director {
Name = "bareos-dir"
Password = "[md5]fcbb587d250fc823c9b6445891a2acd8"
TlsEnable = no
TlsRequire = no
}
Обязательно добавьте параметры
TlsEnable=no
иTlsRequire=no
, иначе сервер бэкапов не сможет подключиться.
Перезапускаем службу, чтобы применить изменения:
systemctl restart bareos-filedaemon.service
Для резервного копирования баз данных необходимо включить поддержку плагинов в конфигурации клиента.
Открываем файл:
nano /etc/bareos/bareos-fd.d/client/myself.conf
Приводим его к следующему виду:
Client {
Name = name
TLS Enable = no
TLS Require = no
Plugin Directory = "/usr/lib64/bareos/plugins"
Plugin Names = "python3"
}
Применяем изменения:
systemctl restart bareos-filedaemon.service
Для создания резервных копий MySQL потребуется Percona XtraBackup
, а также два плагина: bareos-filedaemon-python3-plugin
и bareos-filedaemon-percona-xtrabackup-python-plugin
.
Установка в Ubuntu
Скачаем пакет Percona XtraBackup:
wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.32-26/binary/debian/jammy/x86_64/percona-xtrabackup-80_8.0.32-26-1.jammy_amd64.deb
Установим пакет:
dpkg -i percona-xtrabackup-80_8.0.32-26-1.jammy_amd64.deb
Установим плагины Bareos для работы с Percona XtraBackup:
apt install bareos-filedaemon-python3-plugin bareos-filedaemon-percona-xtrabackup-python-plugin -y
Установка в RHEL
Скачаем пакет Percona XtraBackup:
wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.32-26/binary/redhat/9/x86_64/percona-xtrabackup-80-8.0.32-26.1.el9.x86_64.rpm
Установим пакет:
yum localinstall percona-xtrabackup-80-8.0.32-26.1.el9.x86_64.rpm
Установим плагины Bareos для работы с Percona XtraBackup:
yum install bareos-filedaemon-python3-plugin bareos-filedaemon-percona-xtrabackup-python-plugin -y
Для резервного копирования PostgreSQL необходимо установить пакеты bareos-filedaemon-python3-plugin
, bareos-filedaemon-postgresql-python-plugin
и pg8000
— драйвер Python для подключения к PostgreSQL.
Установка в Ubuntu
Установим плагины Bareos для PostgreSQL:
apt install bareos-filedaemon-python3-plugin bareos-filedaemon-postgresql-python-plugin -y
Установим pip
для управления пакетами Python:
apt install python3-pip -y
Установим библиотеку pg8000
для работы с PostgreSQL:
pip3 install pg8000
Установка в RHEL
Установим плагины Bareos для PostgreSQL:
yum install bareos-filedaemon-python3-plugin bareos-filedaemon-postgresql-python-plugin -y
Установим pip
для управления пакетами Python:
yum install python3-pip -y
Установим библиотеку pg8000
для работы с PostgreSQL:
pip3 install pg8000
Для корректного резервного копирования PostgreSQL необходимо включить WAL-архивацию.
Открываем конфигурацию PostgreSQL:
nano /etc/postgresql/14/main/postgresql.conf
Приводим параметры к виду:
...
max_wal_size = 10GB
min_wal_size = 100MB
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/wal_archive/%f'
archive_timeout = 60
...
Здесь:
archive_mode = on
— включает архивирование WAL.
archive_command = 'cp %p /var/lib/pgsql/wal_archive/%f'
— копирует WAL-журналы в /var/lib/pgsql/wal_archive/.
archive_timeout = 60
— задаёт интервал в 60 секунд для принудительного сохранения WAL.
Создадим директорию для хранения архивных WAL-файлов:
mkdir -p /var/lib/pgsql/wal_archive
Настроим права доступа:
chown postgres:postgres /var/lib/pgsql/wal_archive && chmod 700 /var/lib/pgsql/wal_archive
Применим изменения:
systemctl reload postgresql
Если к базе данных ограничен внешний доступ, необходимо настроить доступ к базе с сервера бэкапов. Для этого отредактируйте файл:
nano /etc/postgresql/14/main/pg_hba.conf
Добавляем строку с IP-адресом сервера бэкапов:
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all <bareos_external_ip>/32 md5
Где <bareos_external_ip>
— IP-адрес сервера бэкапов.
Перезапускаем PostgreSQL:
systemctl restart postgresql
На этом настройка Bareos завершена. Мы установили и настроили сервер бэкапов, подключили клиентский сервер, настроили файловые наборы, расписание и S3-хранилище. Теперь система автоматически создаёт резервные копии и позволяет восстанавливать данные в случае необходимости.
Для проверки можно запустить тестовый бэкап вручную из консоли bconsole или через веб-интерфейс.
bconsole
run
BackupJob
) и подтверждаем запуск, введя yes
.status job
messages
http://<ip_сервера>/bareos-webui
.