Bareos на Rocky Linux

Thank you for reading this post, don't forget to subscribe!

Bareos

про­грамм­ное обес­пе­че­ние для реа­ли­за­ции сер­ве­ра резерв­но­го копи­ро­ва­ния, архи­ви­ро­ва­ния и вос­ста­нов­ле­ния дан­ных. Явля­ет­ся ответв­ле­ни­ем от про­ек­та Bacula. Пер­вый релиз вышел в 2014 году. Назва­ние явля­ет­ся аббре­ви­а­ту­рой и рас­шиф­ро­вы­ва­ет­ся как Backup Archiving Recovery Open Sourced.

Как исхо­дит из пол­но­го назва­ния, Bareos явля­ет­ся бес­плат­ным про­грамм­ным обес­пе­че­ни­ем с откры­тым исход­ным кодом. Мы можем ска­чать вер­сию сооб­ще­ства (Community Edition), а при жела­нии, при­об­ре­сти под­пис­ку. Озна­ко­мить­ся с цена­ми, крат­ким обзо­ром и доку­мен­та­ци­ей, а так­же рели­за­ми мож­но на офи­ци­аль­ном сай­те про­грамм­но­го про­дук­та. Исход­ный код досту­пен для загруз­ки на GitHub.

С точ­ки зре­ния архи­тек­ту­ры состо­ит из 6-и компонентов:

  1. Director — управ­ле­ние зада­ни­я­ми по созда­нию резерв­ных копий и вос­ста­нов­ле­ния данных.
  2. Console — команд­ная стро­ка для управ­ле­ния сер­ве­ром. Может быть уста­нов­ле­на на ком­пью­тер адми­ни­стра­то­ра для уда­лен­но­го управления.
  3. Web UI гра­фи­че­ский веб-интерфейс.
  4. Catalog — база дан­ных с инфор­ма­ци­ей об аген­тах, зада­ни­ях, ста­ту­сах резерв­но­го копи­ро­ва­ния и хра­ни­мых данных.
  5. File Daemon — сбор дан­ных о фай­лах на кли­ент­ских систе­мах, кото­рые необ­хо­ди­мо резер­ви­ро­вать или восстанавливать.
  6. Storage Daemon — выпол­не­ние опе­ра­ций чтения/записи с устрой­ства­ми хранения.

Кли­ент Bareos может быть уста­нов­лен на боль­шин­ство попу­ляр­ных опе­ра­ци­он­ных систем — Linux (Debian, Ubuntu, Red Hat), FreeBSD, Windows, Mac OS, Solaris и дру­гие. Сер­вер­ные ком­по­нен­ты могут быть раз­вер­ну­ты, в основ­ном, на Linux и FreeBSD — уста­нов­ка может быть выпол­не­на из исход­ни­ков или репо­зи­то­рия (не вхо­дит в стан­дарт­ный набор и тре­бу­ет допол­ни­тель­ной настрой­ки). Так­же мож­но раз­вер­нуть сер­вер­ную или кли­ент­скую часть в виде кон­тей­не­ра Docker (но офи­ци­аль­но­го обра­за нет).

Функ­ции и возможности:

  • Шиф­ро­ва­ние хра­ни­мых данных.
  • Исполь­зо­ва­ние шаб­ло­нов для задач.
  • Пере­да­ча дан­ных по защи­щен­но­му соеди­не­нию TLS.
  • Пол­ное, диф­фе­рен­ци­аль­ное и инкре­мен­таль­ное копирование.
  • Под­держ­ка раз­лич­ных типов носи­те­лей (от лен­точ­ных до рас­пре­де­лен­ных фай­ло­вых систем).

Так­же неко­то­рые воз­мож­но­сти рас­ши­ря­ют­ся за счет плагинов.

Подготовка системы

Выпол­ним пред­ва­ри­тель­ные настройки.

Пакеты

Несмот­ря на то, что, начи­ная с вер­сии 8 в CentOS и Rocky Linux исполь­зу­ет­ся пакет­ный мене­джер dnf, мы будем исполь­зо­вать коман­ду yum для обрат­ной сов­ме­сти­мо­сти с CentOS 7.

Обно­вим спи­сок паке­тов в репозиториях:

yum makecache

На све­же­уста­нов­лен­ной систе­ме так­же реко­мен­ду­ет­ся выпол­нить обнов­ле­ние пакетов:

yum update

Уста­но­вим пакет:

yum install wget

* дан­ный пакет поз­во­ля­ет загру­жать фай­лы по про­то­ко­лам http и ftp.

Вре­мя
Для кор­рект­но­го отоб­ра­же­ния вре­ме­ни созда­ния резерв­ных копий и рабо­ты рас­пи­са­ния, настро­им часо­вой пояс и син­хро­ни­за­цию времени.

Уста­но­вим сер­вис, запу­стим его и раз­ре­шим автозапуск:

yum install chrony

systemctl enable chronyd --now

Для настрой­ки часо­во­го поя­са вводим:

timedatectl set-timezone Europe/Moscow

Настройка брандмауэра

Нам нуж­но раз­ре­шить сле­ду­ю­щие порты:

  • 80 и 443 — для веб-интерфейса.
  • 9101 — для Bareos Director: управ­ле­ние зада­ни­я­ми (служ­ба bareos-dir).
  • 9102 — File Daemon: сбор дан­ных с кли­ен­тов (служ­ба bareos-fd).
  • 9103 — Storage Daemon: рабо­та с нако­пи­те­ля­ми для хра­не­ния резерв­ных копий (служ­ба bareos-sd).

Выпол­ня­ем команды:

firewall-cmd --permanent --add-port={80,443}/tcp

firewall-cmd --permanent --add-port={9101,9102,9103}/tcp

firewall-cmd --reload

Корневые сертификаты

Репо­зи­то­рий Bareos рабо­та­ет по https с сер­ти­фи­ка­том от Let's Encrypt. Если наши кор­не­вые сер­ти­фи­ка­ты будут неак­ту­аль­ны, мы полу­чим ошиб­ку Issued certificate has expired.

Нам нуж­но выпол­нить две команды:

yum install ca-certificates

update-ca-trust

Настройка SELinux

Про­ще все­го, отклю­чить SELinux. Но, если мы хотим его оста­вить, вклю­ча­ем политику:

setsebool -P httpd_can_network_connect on

* дан­ное пра­ви­ло раз­ре­ша­ет httpd-сер­ви­су и веб-скрип­там под­клю­че­ние по сети.

Установка Bareos

Уста­нов­ка выпол­ня­ет­ся из репо­зи­то­рия. Одна­ко, его нет в базо­вых репо­зи­то­ри­ях, поэто­му сна­ча­ла, выпол­ним допол­ни­тель­ные действия.

На стра­ни­це офи­ци­аль­но­го сай­та мы долж­ны озна­ко­мить­ся с вер­си­я­ми рели­зов и под­дер­жи­ва­е­мых дис­три­бу­ти­вов. На момент обнов­ле­ния инструк­ции, послед­ний релиз был 21. Для удоб­ства рабо­ты, созда­ем переменные:

RELEASE=21

DIST=EL_8

* в нашем при­ме­ре мы будем уста­нав­ли­вать про­грамм­ный про­дукт вер­сии 21 для груп­пы рели­зов EL_8.

Уста­но­вим репо­зи­то­рий командой:

w g e t https://download.bareos.org/bareos/release/${RELEASE}/${DIST}/bareos.repo -O /etc/yum.repos.d/bareos_${RELEASE}_${DIST}.repo

* дан­ной коман­дой мы ска­ча­ем гото­вые настрой­ки репо­зи­то­рия в локаль­ный ката­лог /etc/yum.repos.d.

Мож­но уста­нав­ли­вать bareos:

yum install bareos bareos-database-postgresql

* мы уста­но­вим сам пакет bareos и набор фай­лов для его рабо­ты с postgresql.

На все запро­сы при­нять GPG key отве­ча­ем утвердительно:

Is this ok [y/N]: y

Уста­нов­ка завер­ше­на. Раз­ре­шим авто­за­пуск сле­ду­ю­щих сервисов:

systemctl enable bareos-dir bareos-fd bareos-sd

Развертывание и настройка сервера баз данных

На момент обнов­ле­ния инструк­ции в послед­ней вер­сии 21 была пре­кра­ще­на под­держ­ка базы MySQL/MariaDB — оста­лась толь­ко postgresql. Выпол­ним уста­нов­ку его сер­вер­ной части:

yum install postgresql-server postgresql-contrib

Про­и­ни­ци­а­ли­зи­ру­ем базу:

postgresql-setup initdb

Раз­ре­шим авто­за­пуск и запу­стим сервис:

systemctl enable postgresql --now

Выпол­ним скрип­ты для под­го­тов­ки базы дан­ных, кото­рые шли в ком­плек­те с уста­нов­лен­ным паке­том bareos-database-postgresql:

su - postgres -c /usr/lib/bareos/scripts/create_bareos_database

su - postgres -c /usr/lib/bareos/scripts/make_bareos_tables

su - postgres -c /usr/lib/bareos/scripts/grant_bareos_privileges

* в соот­вет­ствии с назва­ни­я­ми скрип­тов, пер­вый созда­ет базу, вто­рой созда­ет таб­ли­цы и тре­тий — настра­и­ва­ет при­ви­ле­гии для создан­ных объектов.

Стар­ту­ем сервисы:

systemctl start bareos-dir bareos-fd bareos-sd

Посмот­рим состо­я­ние командой:

systemctl status bareos-dir bareos-fd bareos-sd

Запускаем веб-интерфейс

Разо­бьем про­цесс на несколь­ко этапов.

1. Установка и запуск веб-сервера

Уста­нав­ли­ва­ем ком­по­нент для обес­пе­че­ния веб-интерфейса:

yum install bareos-webui

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

vi /etc/php.ini

Доба­вим строку:

date.timezone = "Europe/Moscow"

* где Europe/Moscow — часо­вой пояс, кото­рый нуж­но заме­нить на нуж­ный вам.

Запус­ка­ем веб-сервер:

systemctl enable httpd --now

Пере­за­пус­ка­ем ком­по­нент Director:

systemctl restart bareos-dir

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сер­ве­ра> — мы долж­ны уви­деть стар­то­вую стра­ни­цу Apache:

Веб-сер­вер рабо­та­ет. Идем дальше.

2. Создание доступа и вход

Созда­ем учет­ную запись для досту­па к UI. Для это­го вхо­дим в кон­соль управ­ле­ния bareos:

bconsole

И вво­дим команду:

* configure add console name=admin password=my_password profile=webui-admin tlsenable=no

* где:

  • admin — имя учет­ной запи­си для входа;
  • my_password — пароль.
  • profile — про­филь с поли­ти­ка­ми досту­па. Хра­нят­ся в ката­ло­ге /etc/bareos/bareos-dir.d/profile. По умол­ча­нию созда­ет­ся 3 профиля: 
    • webui-admin — рас­ши­рен­ный доступ к системе.
    • operator — досту­пы для рабо­ты с заданиями.
    • webui-readonly — толь­ко про­смотр ста­ту­сов и конфигурации.
  • tlsenable — наше под­клю­че­ние к сер­ви­су Director долж­но рабо­тать не по защи­щен­но­му кана­лу. В про­тив­ном слу­чае, мы полу­чим ошиб­ку Sorry, cannot authenticate. Wrong username, password or SSL/TLS handshake failed.

Мы долж­ны увидеть:

Пере­за­пус­ка­ем bareos и выхо­дим из консоли:

* reload

* exit

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>/bareos-webui/ — мы долж­ны уви­деть окно авто­ри­за­ции. Вво­дим наши логин и пароль:

Мы долж­ны попасть на стра­ни­цу со пане­ли управления.

Сто­ит отме­тить, что мы мог­ли обой­тись и без команд­ной обо­лоч­ки bconsole — нуж­но создать файл /etc/bareos/bareos-dir.d/console/admin.conf с нуж­ны­ми зна­че­ни­я­ми и пере­за­пу­стить bareos.

3. SSL (опционально)

Хоро­шей иде­ей будет настрой­ка досту­па к веб-интер­фей­су по защи­щен­но­му про­то­ко­лу https. Для это­го нам нужно:

  1. Выде­лить домен­ное имя под­клю­че­ния к серверу.
  2. Полу­чить кор­рект­ных сер­ти­фи­кат для име­ни, по кото­ро­му мы реши­ли обра­щать­ся к серверу.
  3. Настро­ить веб-сер­вер Apache для рабо­ты с полу­чен­ным сертификатом.

В рам­ках дан­ной инструк­ции, мы не будем рас­смат­ри­вать подроб­но каж­дый из пунктов.

Доменное имя

Домен мож­но заре­ги­стри­ро­вать на внут­рен­нем DNS. Для боль­шин­ства ком­па­ний это самый акту­аль­ный вари­ант. Если наш сер­вер дол­жен быть досту­пен из гло­баль­ной сети, то мож­но исполь­зо­вать гло­баль­ный DNS для наше­го доме­на. Ну и самый быст­рый вари­ант, про­пи­сать hostname в локаль­ный файл hosts, с кото­ро­го мы будем захо­дить на сер­вер. Пред­по­ло­жим, что наш сер­вер резерв­но­го копи­ро­ва­ния дол­жен быть досту­пен по име­ни bareos.test.ru.

Сертификат

Полу­чить сер­ти­фи­кат мож­но тоже несколь­ки­ми способами:

  • купить для наше­го доме­на или исполь­зо­вать уже куп­лен­ный wildcard.
  • полу­чить бес­плат­но от Let's Encrypt.
  • полу­чить от внут­рен­не­го цен­тра сер­ти­фи­ка­ции, если такой имеется.

Пред­по­ло­жим, что наш сер­ти­фи­кат полу­чен и его фай­лы раз­ме­ще­ны в ката­ло­гах /etc/pki/tls/certs. и /etc/pki/tls/certs.

Настройка Apache

Мы рас­смот­рим настрой­ку кратко.

Уста­нав­ли­ва­ем модуль рабо­ты по SSL:

yum install mod_ssl

Откры­ва­ем файл:

vi /etc/httpd/conf.d/ssl.conf

Нахо­дим опции и при­во­дим их к виду:

* где SSLCertificateFile и SSLCertificateKeyFile — пути до фай­лов клю­чей с нашим сер­ти­фи­ка­том. SSLCertificateChainFile — при необ­хо­ди­мо­сти, путь до цепоч­ки сер­ти­фи­ка­тов (нуж­но исполь­зо­вать, если внут­ри фай­ла SSLCertificateFile нет инфор­ма­ции о всех сер­ти­фи­ка­ци­он­ных центрах).

Про­ве­ря­ем кор­рект­ность настро­ек в Apache:

apachectl configtest

Если видим:

Syntax OK

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию apache:

apachectl graceful

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су https://bareos.test.ru/bareos-webui/, где bareos.test.ru — имя хоста, для кото­ро­го мы полу­чи­ли сер­ти­фи­кат. Мы долж­ны под­клю­чить­ся к веб-интер­фей­су по защи­щен­но­му соединению.

Установка и настройка клиента

Рас­смот­рим про­цесс под­клю­че­ния кли­ен­тов, кото­рые рабо­та­ют под управ­ле­ни­ем Linux Ubuntu и CentOS.

Установка клиента

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

а) на Linux Ubuntu

Зада­ем переменные:

RELEASE=21

DIST=xUbuntu_20.04

* для Ubuntu вер­сии 20.04.

Ска­чи­ва­ем настрой­ки для репозитория:

w g e t https://download.bareos.org/bareos/release/${RELEASE}/${DIST}/bareos.list -O /etc/apt/sources.list.d/bareos_${RELEASE}_${DIST}.list

* если полу­чим ошиб­ку Issued certificate has expired пере­хо­дим к реше­нию ниже.

Уста­нав­ли­ва­ем ключ под­пи­си паке­тов в репозитории:

w g e t -q http://download.bareos.org/bareos/release/${RELEASE}/${DIST}/Release.key -O- | apt-key add -

Обнов­ля­ем спи­сок пакетов:

apt update

Уста­нав­ли­ва­ем пакет для bareos-fd:

apt install bareos-filedaemon

Раз­ре­ша­ем авто­за­пуск сервиса:

systemctl enable bareos-filedaemon

Настра­и­ва­ем бранд­мау­эр (откры­ва­ем порт 9102/tcp):

iptables -I INPUT -p tcp --dport 9102 -j ACCEPT

apt-get install iptables-persistent

netfilter-persistent save

б) на Linux CentOS

Зада­ем переменные:

RELEASE=21

DIST=CentOS_7

* для CentOS вер­сии 7.

Ска­чи­ва­ем настрой­ки для репозитория:

w g e t https://download.bareos.org/bareos/release/${RELEASE}/${DIST}/bareos.repo -O /etc/yum.repos.d/bareos_${RELEASE}_${DIST}.repo

* если полу­чим ошиб­ку Issued certificate has expired пере­хо­дим к реше­нию ниже.

Уста­нав­ли­ва­ем пакет для bareos-fd:

yum install bareos-fd

На все запро­сы при­нять ключ отве­ча­ем утвердительно.

Раз­ре­ша­ем авто­за­пуск сервиса:

systemctl enable bareos-fd

Настра­и­ва­ем бранд­мау­эр (откры­ва­ем порт 9102/tcp):

firewall-cmd --permanent --add-port=9102/tcp

firewall-cmd --reload

Добавление клиента на сервер

Под­клю­ча­ем­ся к сер­ве­ру и захо­дим в кон­соль bareos:

bconsole

И добав­ля­ем ново­го клиента:

* configure add client name=client_name address=192.168.0.22 password=client_password

* где client_name — про­из­воль­ное имя, по кото­ро­му нам будет удоб­но иден­ти­фи­ци­ро­вать кли­ен­та; 192.168.0.22 — IP-адрес ком­пью­те­ра-кли­ен­та; client_password — пароль, кото­рый нуж­но будет исполь­зо­вать дан­но­му кли­ен­ту для под­клю­че­ния к серверу.

Мы полу­чим вывод на подобие:

Для нас теперь важ­но содер­жи­мое для экс­пор­та, кото­рое в нашем при­ме­ре име­ет вид:


Пере­за­пус­ка­ем сер­вис дирек­то­ра и выхо­дим из консоли:

* reload

* exit

Пере­хо­дим в кон­соль кли­ен­та, откры­ва­ем файл:

vi /etc/bareos/bareos-fd.d/director/bareos-dir.conf

И меня­ем содер­жи­мое на то, что мы полу­чи­ли на сто­роне сервера:

На кли­ен­те пере­за­пус­ка­ем фай­ло­вую служ­бу. Коман­ды немно­го отли­ча­ют­ся в зави­си­мо­сти от дис­три­бу­ти­ва системы.

а) на Ubuntu:

systemctl restart bareos-filedaemon

б) на CentOS:

systemctl restart bareos-fd

Захо­дим на веб-интер­фейс в раз­дел «Кли­ен­ты» — мы долж­ны уви­деть добав­лен­ных клиентов:

* нас не долж­но сму­щать отсут­ствие знач­ков и вер­сий для кли­ен­тов — они появят­ся после выпол­не­ния пер­вых зада­ний на них.

Работа с заданиями

Bareos пред­ла­га­ет доволь­но боль­шое коли­че­ство настро­ек для созда­ния зада­ний. Это могут быть зада­чи резерв­но­го копи­ро­ва­ния, вос­ста­нов­ле­ния, про­вер­ки. Так­же зада­чи могут под­раз­де­лять­ся, напри­мер, для резерв­но­го копи­ро­ва­ния — пол­ный бэкап, диф­фе­рен­ци­аль­ный, инкре­мен­таль­ный. Мы можем настра­и­вать пол­но­цен­ные зада­ния или при­ме­нять шаб­ло­ны. Попро­бу­ем в этом всем разо­брать­ся пошагово.

0. Вводная часть

Опи­шем общие момен­ты для наших заданий.

Мы будем рабо­тать в каталогах:

  • /etc/bareos/bareos-dir.d/job — хра­не­ние фай­лов с опи­са­ни­ем заданий.
  • /etc/bareos/bareos-dir.d/fileset — спис­ки фай­лов для резерв­но­го копи­ро­ва­ния или восстановления.
  • /etc/bareos/bareos-dir.d/jobdefs — .ката­лог для хра­не­ния шаблонов.
  • /etc/bareos/bareos-dir.d/schedule — рас­пи­са­ния для авто­ма­ти­че­ско­го выпол­не­ния заданий.

Уров­ни резер­ви­ро­ва­ния и восстановления:

  • Full. Пол­ная копия фай­лов, ука­зан­ных в зада­нии. Удо­бен для вос­ста­нов­ле­ния, но зани­ма­ет мно­го места.
  • Differential. Копия всех фай­лов, кото­рые были изме­не­ны с момен­та послед­ней копии Full. Для вос­ста­нов­ле­ния тре­бу­ет­ся 1 копия Differential и сде­лан­ная перед этим Full. Зани­ма­ет намно­го мень­ше места, по срав­не­нию с Full, но менее удоб­ное восстановление.
  • Incremental. Копия всех фай­лов, кото­рые были изме­не­ны с момен­та послед­ней копии Differential и/или Full. Для вос­ста­нов­ле­ния тре­бу­ют­ся все копии Incremental, кото­рые сде­ла­ны после Differential и/или Full. Зани­ма­ет мало места, но про­цесс вос­ста­нов­ле­ния самый неудобный.

Типы зада­ний:

  • Restore — восстановление.
  • Backup — резерв­ное копирование.
  • Admin — очист­ка ката­ло­га от мусора.
  • Migrate — зада­ние для про­вер­ки, есть ли что-то для миграции.
  • Copy — зада­ние для про­вер­ки, есть ли что-то для копирования.
  • Verify — про­вер­ка резерв­ных копий — срав­не­ние фай­лов на источ­ни­ке и целе­вом носителе.
  • Consolidate — объ­еди­ня­ет фай­лы для инкре­мен­таль­ных и диф­фе­рен­ци­аль­ных копий. Доступ­но с вер­сии bareos 16.2.4.

Син­так­сис для расписаний:

Момент выпол­не­ния Опи­са­ние Вари­ан­ты
<week-keyword> Неде­ля месяца 1st | 2nd | 3rd | 4th | 5th | first | second | third | fourth | fifth | last
<wday-keyword> День неде­ли sun | mon | tue | wed | thu | fri | sat | sunday | monday | tuesday | wednesday | thursday | friday | saturday
<week-of-year-keyword> Неде­ля года w00 | w01 | … w52 | w53
<month-keyword> Месяц jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec | january | february | … | december
<12hour> Вре­мя в фор­ма­те 12am/pm 0 | 1 | 2 | … 12
<hour> Вре­мя в фор­ма­те 24 0 | 1 | 2 | … 23
<minute> Мину­ты 0 | 1 | 2 | … 59
<day> Дни меся­ца 1 | 2 | … 31
<time> Вре­мя <hour>:<minute> | <12hour>:<minute>am | <12hour>:<minute>pm
<time-spec> Ука­зать на вре­мя выполнения at <time> | hourly
<day-range> Диа­па­зон дней <day>-<day>
<month-range> Диа­па­зон месяцев <month-keyword>-<month-keyword>
<wday-range> Диа­па­зон дней недели <wday-keyword>-<wday-keyword>
<modulo> Чет, нечет <day>/<day> | <week-of-year-keyword>/<week-of-year-keyword>
<date> Дата <date-keyword> | <day> | <range>
<day-spec> Вари­ан­ты для ука­за­ния дней недели <day> | <wday-keyword> | <day> | <wday-range> | <week-keyword> <wday-keyword> | <week-keyword> <wday-range> | daily
<month-spec> Вари­ан­ты для ука­за­ния месяцев <month-keyword> | <month-range> | monthly

* при­ме­ры взя­ты с офи­ци­аль­но­го сайта.

1. Создание простого задания резервного копирования

Для нача­ла созда­дим зада­ние резерв­но­го копи­ро­ва­ния неко­то­рых фай­лов наше­го сер­ве­ра, кото­рое нуж­но запус­кать вручную.

Созда­ем файл с опи­са­ни­ем задания:

vi /etc/bareos/bareos-dir.d/job/FirstJob.conf

* где:

  • Name — любое про­из­воль­ное назва­ние для наше­го задания.
  • Description — про­из­воль­ное описание.
  • Level — глу­би­на зада­ния: пол­ное (Full), раз­ност­ное (Differential), инкре­мен­таль­ное (Incremental).
  • Storage — устрой­ство хра­не­ния фай­лов с резерв­ны­ми копи­я­ми. По умол­ча­нию, созда­но толь­ко одно с назва­ни­ем File.
  • Pool — пулы хра­не­ния инфор­ма­ции на устрой­стве. Созда­ют­ся с целью настрой­ки огра­ни­че­ний по вре­ме­ни хра­не­ния и раз­ре­ше­ния рота­ции. По умол­ча­нию, созда­но 3 пула — Full, Differential и Incremental, каж­дый из кото­рых опти­ма­лен под соот­вет­ству­ю­щий Level.
  • Type — тип зада­ния. Доступ­ны вари­ан­ты Backup, Restore и Verify.
  • FileSet — набор фай­лов для резерв­но­го копи­ро­ва­ния. Опи­сы­ва­ет­ся в отдель­ном фай­ле. Мы созда­дим соот­вет­ству­ю­щее опи­са­ние ниже.
  • Messages — пре­сет для сбо­ра сооб­ще­ний с клиентов.
  • Priority — чем ниже чис­ло, тем выше при­о­ри­тет. Низ­кий при­о­ри­тет зада­ния может при­ве­сти к выпол­не­нию его в пол­след­нюю оче­редь, если в дан­ный момент нуж­но выпол­нить дру­гие задания.

Теперь созда­дим файл со спис­ком объ­ек­тов для резервирования:

vi /etc/bareos/bareos-dir.d/fileset/FirstFileset.conf

* где:

  • Name — любое про­из­воль­ное назва­ние для спис­ка файлов.
  • Description — про­из­воль­ное описание.
  • Include — дирек­ти­ва для добав­ле­ния фай­лов с допол­ни­тель­ны­ми настройками.
  • Options — допол­ни­тель­ные настрой­ки для груп­пы фай­лов, кото­рые нуж­но вклю­чить в задание.
  • Signature — алго­ритм для рас­че­та кон­троль­ной сум­мы для всех фай­лов в дирек­ти­ве Include. Воз­мож­ны вари­ан­ты MD5 или SHA1.
  • File — путь до фай­ла или ката­ло­га, кото­рый нуж­но вклю­чить в зада­ние. Обя­за­тель­но исполь­зо­вать двой­ные кавыч­ки. Оди­нар­ные не работают.

Тестируем задание

Попро­бу­ем создать тесто­вый файл:

echo "test" > /tmp/backup_test_file

Откры­ва­ем кон­соль bareos:

bconsole

Пере­за­пус­ка­ем кон­фи­гу­ра­цию (что­бы при­ме­нить наши настройки):

* reload

Запу­стим наше пер­вое задание:

* run job=FirstJob

Систе­ма пока­жет свод­ную инфор­ма­цию и задаст вопрос, запу­стить ли зада­ние — отве­ча­ем утвердительно:

OK to run? (yes/mod/no): yes

Зада­ние будет поме­ще­но в очередь:

Job queued. JobId=8

В веб-интер­фей­се на вклад­ке «Зада­ния» мы долж­ны уви­деть инфор­ма­цию об успеш­но выпол­нен­ном задании:

Выхо­дим из консоли

* exit

Попро­бу­ем уда­лить наш тесто­вый файл:

rm -f /tmp/backup_test_file

Захо­дим на веб-интер­фейс - пере­хо­дим на вклад­ку «Вос­ста­нов­ле­ние» - выби­ра­ем кли­ен­та и зада­ние резерв­но­го копи­ро­ва­ния - спра­ва в нее появит­ся спи­сок фай­лов, кото­рые попа­ли в резерв­ную копию - выби­ра­ем наш тесто­вый файл:

Про­пи­шем путь до ката­ло­га, куда нуж­но вос­ста­но­вить файл и нажи­ма­ем Вос­ста­нов­ле­ние:

* в ката­лог /tmp будет вос­ста­нов­лен файл /tmp/backup_test_file. Пол­ный путь будет /tmp/tmp/backup_test_file.

В спис­ке зада­ний дожи­да­ем­ся успеш­но­го выпол­не­ния и про­ве­ря­ем, что в ката­ло­ге /tmp/tmp появил­ся нуж­ный нам файл.

2. Задание для выполнения на агенте

Наши дей­ствия будут похо­жи­ми на зада­ние 1. Нам толь­ко нуж­но ука­зать дру­го­го аген­та. Для нача­ла, сде­ла­ем копии наших кон­фи­гу­ра­ци­он­ных файлов:

cp /etc/bareos/bareos-dir.d/job/FirstJob.conf /etc/bareos/bareos-dir.d/job/SecondJob.conf

cp /etc/bareos/bareos-dir.d/fileset/FirstFileset.conf /etc/bareos/bareos-dir.d/fileset/SecondFileset.conf

Отре­дак­ти­ру­ем файлы:

vi /etc/bareos/bareos-dir.d/job/SecondJob.conf

Меня­ем зна­че­ние для:

* в нашем при­ме­ре резерв­ная копия будет делать­ся для кли­ен­та ubuntu, а так­же меня­ем набор фай­лов на SecondFileset.

Теперь откры­ва­ем файл:

vi /etc/bareos/bareos-dir.d/fileset/SecondFileset.conf

И изме­ним набор фай­лов на:

* обра­ти­те вни­ма­ние, в дан­ном при­ме­ре мы пере­чис­ли­ли 2 цели для бэка­па — ката­ло­ги /tmp и /etc.

Для про­вер­ки зада­ния захо­дим в кон­соль, при­ме­ня­ем настрой­ки, запус­ка­ем задание:

bconsole

* reload

* run job=SecondJob

… и нахо­дим ста­тус выпол­не­ния в веб-интерфейсе.

Попыт­ка вос­ста­нов­ле­ния была рас­смот­ре­на в при­ме­ре 1 — по ана­ло­гии мож­но попро­бо­вать вер­нуть неко­то­рые файлы.

3. Использование шаблона

Услож­ним зада­чу — настро­им шаб­ло­ны для более удоб­но­го управ­ле­ния заданиями.

По настрой­кам шаб­ло­ны ничем не отли­ча­ют­ся от обыч­ных зада­ний — они про­сто объ­еди­ня­ют в себе нуж­ные опции, что­бы не нуж­но было их повто­рять при опи­са­нии зада­ний. Поняв это, рабо­тать с ними будет про­сто. Давай­те при­ве­дем пример.

Созда­дим файл:

vi /etc/bareos/bareos-dir.d/jobdefs/DefThirdJob.conf

* как видим, все эти настрой­ки мы уже исполь­зо­ва­ли, когда созда­ва­ли первую задачу.

В шаб­лоне мы исполь­зу­ем набор фай­лов SettingsFileset — созда­дим его:

vi /etc/bareos/bareos-dir.d/fileset/SettingsFileset.conf

* мы доба­ви­ли опцию Compression — поз­во­ля­ет архи­ви­ро­вать наши фай­лы. Воз­мож­ны вари­ан­ты LZ4 и GZIP.

Теперь мож­но создать файл с заданием:

vi /etc/bareos/bareos-dir.d/job/ThirdJob.conf

* наше зада­ние будет при­вя­за­но к шаб­ло­ну DefThirdJob и выпол­нять­ся для кли­ен­та CentOS.

Гото­во — запускаем:

bconsole

* reload

* run job=ThirdJob

… и нахо­дим ста­тус выпол­не­ния в веб-интерфейсе.

4. Планируем задачу

Теперь сде­ла­ем так, что­бы наша зада­ча выпол­ня­лась по расписанию.

Созда­ем файл:

vi /etc/bareos/bareos-dir.d/schedule/EveryDay.conf

* наше зада­ние долж­но выпол­нять­ся еже­днев­но 2 раза — в 7 утра и 9 вечера.

При­вя­зать зада­чу к рас­пи­са­нию мож­но в фай­ле само­го зада­ния или в его шаблоне:

Schedule = "EveryDay"

Пере­за­пу­стим сервис:

systemctl reload bareos-dir

* обра­ти­те вни­ма­ние, что в этом при­ме­ре мы реши­ли пере­за­пу­стить кон­фи­гу­ра­цию без кон­со­ли bconsole.

Пере­хо­дим в веб-интер­фей­се на вклад­ку «Рас­пи­са­ния» — мы долж­ны уви­деть наше задание:

5. Дополнительные директивы

Рас­смот­рим неко­то­рые допол­ни­тель­ные полез­ные опции.

Cкрипты до и после задания

Мы можем выпол­нить опре­де­лен­ные коман­ды до или после выпол­не­ния зада­ния. Суще­ству­ет 2 мето­да настрой­ки — пол­но­стью на сто­роне Bareos или запуск скрип­та на агенте.

а) Запуск скрип­та. Дан­ные спо­соб удоб­нее, если на уда­лен­ной систе­ме есть гото­вый скрипт или тре­бу­ет­ся слож­ная логи­ка выпол­не­ния, кото­рую не опи­сать одной коман­дой и нужен скрипт.

Настра­и­ва­ем в шаб­лоне или задании:

Run Before Job = '/path/to/script.sh'

Run After Job = '/path/to/script.sh'

* запу­стить скрипт на сер­ве­ре соот­вет­ствен­но до и после выпол­не­ния задания.

Client Run Before Job = '/path/to/script.sh'

Client Run After Job = '/path/to/script.sh'

* запу­стить скрипт на кли­ен­те соот­вет­ствен­но до и после выпол­не­ния задания.

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

б) Коман­да при опи­са­нии зада­ния. Дан­ным спо­со­бом мы созда­ем допол­ни­тель­ную дирек­ти­ву RunScript при опи­са­нии шаб­ло­на или зада­ния. Это удоб­нее, если мы хотим пол­но­стью кон­тро­ли­ро­вать про­цесс на сто­роне сервера.

Напри­мер:

* где:

  • FailJobOnError — завер­шить про­цесс резерв­но­го копи­ро­ва­ния, если скрипт вер­нул ошибку.
  • RunsOnSuccess — запус­кать толь­ко при успеш­ном выпол­не­нии резерв­ной копии.
  • RunsOnClient — запу­стить на кли­ен­те (Yes) или на сер­ве­ре (No).
  • RunsWhen — когда запус­кать. Да резерв­но­го копи­ро­ва­ния (Before) или после (After).
  • Command — коман­да, кото­рую нуж­но выполнить.

Не забы­ва­ем:

systemctl reload bareos-dir

Отправка уведомлений

Отправ­ка сооб­ще­ний на почту выпол­ня­ет­ся с помо­щью кли­ен­та bsmtp — про­при­е­тар­ной кон­соль­ной про­грам­мы. Она при­ни­ма­ет пара­мет­ры под­клю­че­ния к поч­то­во­му сер­ве­ру, но по умол­ча­нию, пыта­ет­ся отправ­лять пись­ма от локаль­но­го сер­ве­ра. Мы рас­смот­рим вари­ант с отправ­кой с сер­ве­ра bareos и исполь­зо­ва­нии сто­рон­не­го поч­то­во­го сер­ве­ра. Подроб­нее с вари­ан­та­ми настрой­ки мож­но озна­ко­мить­ся на офи­ци­аль­ном сай­те.

Отправка с сервера резервного копирования

Для воз­мож­но­сти выпол­нять отправ­ку, уста­нав­ли­ва­ем MTA, напри­мер, Postfix:

yum install postfix

Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл:

vi /etc/postfix/main.cf

Меня­ем зна­че­ния для сле­ду­ю­щих опций:

* одна­ко, если мы исполь­зу­ем IPv6, то менять зна­че­ние для опции inet_protocols не нужно.

После вне­се­ния настро­ек раз­ре­ша­ем авто­за­пуск Postfix и стар­ту­ем его:

systemctl enable postfix --now

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

* в дан­ном при­ме­ре отправ­ка будет выпол­не­на на ящик master@test.ru.

После прав­ки кон­фи­гу­ра­ци­он­но­го фай­ла не забы­ва­ем пере­за­пу­стить сервис:

systemctl reload bareos-dir

Для кор­рект­ной отправ­ки поч­то­вых сооб­ще­ний нуж­но пра­виль­но настро­ить обрат­ный адрес и домен отправки.

Отправка через сторонний почтовый сервер

Коман­да bsmtp при­ни­ма­ет пара­мет­ры, в том чис­ле те, с помо­щью кото­рых мы ука­жем сто­рон­ний сер­вер. В настрой­ках зада­ния или шаб­ло­на мы можем опре­де­лить ее поведение:

* в дан­ном при­ме­ре отправ­ка будет выпол­не­на через сер­вер mail.test.local.

Ути­ли­та bsmtp не уме­ет про­хо­дить аутен­ти­фи­ка­цию. Поэто­му, если наш поч­то­вый сер­вер тре­бу­ет про­вер­ку под­лин­но­сти, нам не удаст­ся ее исполь­зо­вать. Потре­бу­ет­ся более слож­ная схе­ма с исполь­зо­ва­ни­ем MTA. Так­же мож­но про­сто исполь­зо­вать ути­ли­ту команд­ной строки

Настройка отправки уведомлений

По умол­ча­нию, нам будут при­хо­дить все сооб­ще­ния, что может быть не совсем удоб­но для повсе­днев­но­го исполь­зо­ва­ния систе­мы. Мы можем создать основ­ные настрой­ки для опо­ве­ще­ний в ката­ло­ге /etc/bareos/bareos-dir.d/messages. Откро­ем на редак­ти­ро­ва­ние новый файл:

vi /etc/bareos/bareos-dir.d/messages/Alarms.conf

* в дан­ном типе опо­ве­ще­ний под назва­ни­ем Alarms мы опре­де­ли­ли адрес полу­ча­те­ля пись­ма, а так­же типы собы­тий, на кото­рые нуж­но реа­ги­ро­вать. Обра­ти­те вни­ма­ние, что для кон­со­ли мы исполь­зу­ем все собы­тия кате­го­рии alert, за исклю­че­ни­ем skipped.

Теперь в нашем шаб­лоне или зада­нии мы можем исполь­зо­вать дан­ный тип сообщения:

Messages = Alarms

И не забы­ва­ем пере­за­пус­кать демон bareos-dir:

systemctl reload bareos-dir

Отправка уведомлений в Zulip

В каче­стве при­ме­ра так­же рас­смот­рим отправ­ку уве­дом­ле­ний в Zulip. Для это­го мы уста­но­вим на наш сер­вер резерв­но­го копи­ро­ва­ния ути­ли­ту zulip-send и созда­дим новый про­филь для отправ­ки сообщений.

Выше­упо­мя­ну­тая ути­ли­та zulip-send явля­ет­ся рас­ши­ре­ни­ем для Python. Для его уста­нов­ки сна­ча­ла ста­вим мене­джер pip:

yum install python3-pip

Теперь уста­но­вим расширение:

pip3 install zulip

Если в ходе уста­нов­ки мы полу­чи­ли ошиб­ку, попро­бу­ем обно­вить pip:

pip3 install --upgrade pip

Созда­ем файл:

vi ~/.zuliprc

* где:

  • key — токен, кото­рый был сге­не­ри­ро­ван на сто­роне Zulip сер­ве­ра для бота.
  • email — адрес бота, от кото­ро­го будет выпол­нять­ся отправка.
  • site — URL-адрес до наше­го сер­ве­ра zulip.

Попро­бу­ем выпол­нить тесто­вую отправку:

/usr/local/bin/zulip-send postmaster@test.ru --message 'Test Message'

* где postmaster@test.ru — адрес учет­ной запи­си, а zulip, на кото­рый будет отправ­ле­но сообщение.

Мы долж­ны полу­чить сооб­ще­ние в наш чат.

Теперь копи­ру­ем файл .zuliprc в домаш­нюю дирек­то­рию поль­зо­ва­те­ля bareos:

cp ~/.zuliprc /var/lib/bareos/

Созда­ем про­филь для отправ­ки сообщений:

vi /etc/bareos/bareos-dir.d/messages/Zulip.conf

 

Для отправ­ки сооб­ще­ния на канал исполь­зу­ем команду:

mailcommand = "/usr/local/bin/zulip-send --stream %r --subject 'Bareos' --message 'The job with id %i has been failed with code %e.'"

Так­же нуж­но поме­нять адре­са­та на назва­ние канала:

mail = admins = …

* в дан­ном при­ме­ре мы будем отправ­лять сооб­ще­ния толь­ко на собы­тия с ошиб­ка­ми; отправ­ка будет осу­ществ­лять­ся на акка­унт zulip с адре­сом postmaster@test.ru.
** для отправ­ки сооб­ще­ний мы можем задей­ство­вать сле­ду­ю­щие переменные:

  • %% — про­сто знак %
  • %c — Имя клиента.
  • %d — Имя сер­ве­ра, где уста­нов­ле­на роль директора.
  • %e — код завер­ше­ния задания.
  • %h — адрес клиента.
  • %i — иден­ти­фи­ка­тор задания.
  • %j — уни­каль­ное имя задания.
  • %l — уро­вень задания.
  • %n — имя задания.
  • %r — получатель.
  • %s — время.
  • %t — тип задания.
  • %v — имя тома для чтения.
  • %V — имя тома для записи.

В зада­ние или шаб­лоне ука­зы­ва­ем, что для отправ­ки сооб­ще­ний дол­жен исполь­зо­вать­ся ZulipAlarms:

Messages = ZulipAlarms

Пере­за­пус­ка­ем bareos-dir:

systemctl reload bareos-dir

Работа с устройствами хранения

По умол­ча­нию, при уста­нов­ке Bareos в каче­стве хра­ни­ли­ща для резерв­ных копий исполь­зу­ет­ся сво­бод­ное про­стран­ство кор­не­вой дирек­то­рии (а имен­но, ката­лог /var/lib/bareos/storage).

С точ­ки зре­ния абстракции:

  • Дан­ные хра­нят­ся в пулах, кото­рые опре­де­ля­ют пра­ви­ла хра­не­ния инфор­ма­ции (созда­ют­ся в ката­ло­ге /etc/bareos/bareos-dir.d/pool).
  • В пулы вхо­дят тома, кото­рые созда­ют­ся в Storage Devices (настра­и­ва­ют­ся в ката­ло­ге /etc/bareos/bareos-sd.d/device). Важ­но отме­тить, что у пулов нет жест­кой при­вяз­ки к Storage Devices. То есть настрой­ки для одно­го и того же пула мож­но исполь­зо­вать для несколь­ких устройств хранения.
  • Storage Devices явля­ют­ся ката­ло­га­ми фай­ло­вой систе­мы или фай­ла­ми устройств.
  • Устрой­ство в сер­ви­се Director долж­но быть при­вя­за­но к соот­вет­ству­ю­ще­му устрой­ству Storage Devices.

Рас­смот­рим при­мер исполь­зо­ва­ния допол­ни­тель­но­го раз­де­ла для раз­ме­ще­ния сохра­нен­ной информации.

1. Работа с устройством хранения

Дан­ная настрой­ка затра­ги­ва­ет сер­вис Storage Daemon.

Доба­вим новое устройство:

vi /etc/bareos/bareos-sd.d/device/NewStorage.conf

* где:

  • Name — имя устрой­ства. По нему мож­но будет обра­щать­ся к устрой­ству при настрой­ке хра­ни­ли­ща на сер­ви­се Director.
  • Media Type — имя типа устрой­ства. Может быть произвольным.
  • Archive Device — путь до ката­ло­га или устрой­ства хранения.
  • LabelMedia — мож­но ли мар­ки­ро­вать носители.
  • Random Access — явля­ет­ся ли устрой­ство носи­те­ля с про­из­воль­ным досту­пом. Для дис­ко­вых носи­те­лей и USB сто­ит выстав­лять Yes, для лен­точ­ных биб­лио­тек — No.
  • AutomaticMount — авто­ма­ти­че­ски мон­ти­ро­вать, при подключении.
  • RemovableMedia — дан­ная опция очень пло­хо доку­мен­ти­ро­ва­на. Но похо­же, ее зна­че­ние нуж­но выстав­лять в Yes для съем­ных носителей.
  • AlwaysOpen — дер­жать гото­вым для чте­ния и запи­си все­гда (yes) или по необ­хо­ди­мо­сти (no).
  • Description — про­из­воль­ное описание.

Созда­ем ката­лог, кото­рый мы ука­за­ли в каче­стве Archive Device:

mkdir /backups

И назна­ча­ем в каче­стве вла­дель­ца поль­зо­ва­те­ля bareos:

chown bareos:bareos /backups

Что­бы при­ме­нить настрой­ку, пере­за­пус­ка­ем демон для рабо­ты с носителями:

systemctl restart bareos-sd

2. Работа с пулами

Теперь доба­вим, для при­ме­ра, новый пул:

vi /etc/bareos/bareos-dir.d/pool/FullNew.conf

* где:

  • Name — про­из­воль­ное имя, по кото­ро­му мы будем обра­щать­ся к пулу.
  • Pool Type — ука­зы­ва­ем тип пула, кото­рый дол­жен соот­вет­ство­вать типам зада­ний: Backup, Archive, Cloned, Migration, Copy, Save.
  • Recycle — мож­но ли авто­ма­ти­че­ски чистить тома пула от уста­рев­ших данных.
  • AutoPrune — мож­но ли уда­лять тома пула с уста­рев­шей информацией.
  • Volume Retention — сколь­ко долж­ны хра­нить­ся дан­ные, преж­де чем они будут счи­тать­ся устаревшими.
  • Maximum Volume Bytes — мак­си­маль­ный раз­мер одно­го тома.
  • Maximum Volumes — мак­си­маль­ное чис­ло томов, на кото­рые может рас­ши­рять­ся пул.
  • Label Format — пре­фикс, с кото­рым будут созда­вать­ся новые тома в пуле.

По умол­ча­нию, при уста­нов­ке bareos созда­ет­ся 4 пула:

  1. Full.
  2. Differential.
  3. Incremental.
  4. Scratch.

Мы можем исполь­зо­вать их, оста­вив зна­че­ния опций или отре­дак­ти­ро­вав их на нужные.

3. Привязка устройства Director к устройству Storage Daemon

За устрой­ства хра­не­ния и кон­троль резерв­но­го копи­ро­ва­ния отве­ча­ют раз­ные роли Bareos, а зна­чит нам нуж­но настро­ить привязку.

Созда­ем новый файл:

vi /etc/bareos/bareos-dir.d/storage/FileNew.conf

* где:

  • Name — любое про­из­воль­ное имя. По нему мы будем обра­щать­ся к устрой­ству из задания.
  • Address — адрес сер­ве­ра с ролью Storage Daemon. По доку­мен­та­ции, не реко­мен­ду­ет­ся исполь­зо­вать localhost, даже если Director и Storage Daemon сто­ят на одном сервере.
  • Password — пароль досту­па для внут­рен­не­го шиф­ро­ва­ния при пере­да­че данных.
  • Device — имя устрой­ства на сто­роне Storage Daemon. В нашем при­ме­ре это создан­ный NewFileStorage.
  • Media Type — имя типа устройства.

4. Настройка задания

Ука­зать исполь­зо­ва­ние пулов и устрой­ства хра­не­ния мож­но в кон­фи­гу­ра­ци­он­ном фай­ле зада­ния или шаблона:

Storage = NewStorage
Pool = FullNew

* где NewFileStorage и FullNew, соот­вет­ствен­но, создан­ные нами устрой­ство хра­не­ния и пул на сер­ви­се Director.

Обра­ти­те вни­ма­ние, что Storage и Pool неза­ви­си­мы. Storage, по сути, опре­де­лит место рас­по­ло­же­ния дан­ных, Pool — пра­ви­ла хранения.

5. Применение настроек и проверка

После вне­се­ния необ­хо­ди­мых изме­не­ний необ­хо­ди­мо пере­за­пу­стить служ­бу Bareos Director:

systemctl reload bareos-dir

В веб-интер­фей­се на стра­ни­це Хра­не­ние мы долж­ны уви­деть наше новое устройство:

Теперь мож­но попро­бо­вать запу­стить наше зада­ние, кото­рое долж­но хра­нить дан­ные на новом устрой­стве. В нашем при­ме­ре, это ката­лог /backups — про­ве­рим, что там появил­ся том ново­го пула:

ls /backups

Мы долж­ны уви­деть что-то на подобие:

FullNew-0004

Настройка API

Рас­смот­рим инструк­цию по раз­вер­ты­ва­нию Rest API в Bareos. Для его кор­рект­ной рабо­ты необ­хо­ди­мо уста­но­вить python вер­сии 3.8 и выше. На момент обнов­ле­ния инструк­ции акту­аль­ной вер­си­ей была 3.9:

yum install python39

После уста­нав­ли­ва­ем при­ло­же­ние python:

/usr/bin/pip3.9 install bareos-restapi

Отре­дак­ти­ру­ем скрипт запуска:

vi /usr/local/bin/uvicorn

Первую строч­ку меня­ем на:

#!/usr/bin/python3.9

* где python3.9 — уста­нов­лен­ная вер­сия python.

Пере­хо­дим в ката­лог с bareos_restapi:

cd /usr/local/lib/python3.9/site-packages/bareos_restapi

* опять же, 3.9 — вер­сия python.

Сге­не­ри­ру­ем секрет:

openssl rand -hex 32

Мы полу­чим стро­ку на 64 сим­во­ла, например:

7f38df2a6688d099b0ebc9539053b28fcf06f1436e69e52152816f6c334db100

* сохра­ня­ем дан­ную стро­ку, кото­рую будем исполь­зо­вать в каче­стве секрета.

Созда­ем кон­фи­гу­ра­ци­он­ный файл:

vi api.ini

* где для нас важ­ны сле­ду­ю­щие параметры:

  • Name — имя для под­клю­че­ния к bareos director.
  • Address — адрес сер­ве­ра с bareos director.
  • Port — порт под­клю­че­ния к bareos director.
  • secret_key — сек­рет, кото­рый мы сге­не­ри­ро­ва­ли выше.

По умол­ча­нию, сер­вис рабо­та­ет на пор­ту 8000 — необ­хо­ди­мо его открыть в брандмауэре:

firewall-cmd --permanent --add-port=8000/tcp

firewall-cmd --reload

Запу­стим наш веб-сер­вер с Rest API:

uvicorn bareos_restapi:app --host 0.0.0.0 --reload

Если мы хотим запу­стить API на https, добав­ля­ем опции --ssl-keyfile и --ssl-certfile, например:

uvicorn bareos_restapi:app --host 0.0.0.0 --ssl-keyfile /etc/pki/tls/private/bareos.key --ssl-certfile /etc/pki/tls/certs/bareos.crt --reload

* в дан­ном при­ме­ре мы запу­стим сер­вис, кото­рый будет слу­шать на всех портах.

Откры­ва­ем бра­у­зер и пере­хо­дим по адре­су http://<IP-адрес сервера>:8000/docs — мы долж­ны уви­деть стра­ни­цу с инструк­ци­ей по исполь­зо­ва­нию API для Bareos.

Пре­рвем рабо­ту сер­ви­са ком­би­на­ци­ей Ctrl + С, и выпол­ним настрой­ку авто­за­пус­ка Rest API. Для это­го созда­ем файл:

vi /etc/systemd/system/uvicorn.service

* где 3.9 — вер­сия python.

Пере­чи­ты­ва­ем кон­фи­гу­ра­цию systemd:

systemctl daemon-reload

Раз­ре­ша­ем авто­за­пуск наше­го сер­ви­са и стар­ту­ем его:

systemctl enable uvicorn --now

Посмот­реть ста­тус мож­но командой:

systemctl status uvicorn

Шпаргалка по командам

Рас­смот­рим неко­то­рые полез­ные коман­ды кон­со­ли bconsole.

1. Рабо­та с клиентами.

Посмот­реть спи­сок заре­ги­стри­ро­ван­ных агентов:

* list clients

Уви­деть ста­ту­сы клиентов:

* status client

Мы полу­чим спи­сок кли­ен­тов и долж­ны будем выбрать номер того, для кото­ро­го хотим узнать статус:

The defined Client resources are:
1: bareos-fd
2: CentOS
3: ubuntu

Select Client (File daemon) resource (1-3): 2

Отклю­чить клиента:

* disable client client_name

* где client_name — имя для наше­го кли­ен­та, заре­ги­стри­ро­ван­но­го в системе.

Вклю­чить отклю­чен­но­го клиента:

* enable client client_name

2. Рабо­та с задачами.

Пока­зать спи­сок заданий:

* list jobs

Запу­стить на выпол­не­ние создан­ную задачу:

* run job=job_name

* где job_name — имя задачи.

Пока­зать запла­ни­ро­ван­ные задания:

* status dir

Удаление bareos

Если нам нуж­но уде­лить сер­вер резерв­но­го копи­ро­ва­ния, выпол­ним необ­хо­ди­мые действия.

Опи­сан­ные в дан­ном раз­де­ле опе­ра­ции при­ве­дут к пол­но­му уда­ле­нию про­грамм­но­го про­дук­та и фай­лов с резерв­ны­ми копиями.

Оста­нав­ли­ва­ем сер­ви­сы и запре­ща­ем их автозапуск:

systemctl disable bareos-dir bareos-fd bareos-sd

systemctl stop bareos-dir bareos-fd bareos-sd

Для уда­ле­ния bareos выпол­ня­ем команду:

yum remove bareos-*

Для уда­ле­ния томов на устрой­стве хра­не­ния по умол­ча­нию вводим:

rm -rf /var/lib/bareos

Уда­ля­ем ката­ло­ги с кон­фи­гу­ра­ци­он­ны­ми фай­ла­ми и логами:

rm -rf /etc/bareos /var/log/bareos

Уда­ля­ем кон­фи­гу­ра­ци­он­ные фай­лы для юни­тов systemd:

rm -f /etc/systemd/system/bareos-*

rm -f /etc/systemd/system/multi-user.target.wants/bareos-*

Уда­лим репо­зи­то­рий и почи­стим кэш для yum:

rm -f /etc/yum.repos.d/bareos*

yum clean all

Примеры заданий резервного копирования

В дан­ном раз­де­ле мы рас­смот­рим кон­крет­ные при­ме­ры для резер­ви­ро­ва­ния сер­ви­сов. Без опи­са­ния подроб­но­стей и без раз­де­ле­ния на зада­ние и шаб­лон. По воз­мож­но­сти, будут ука­зы­вать­ся ссыл­ки на документацию.

База данных MySQL/MariaDB

В офи­ци­аль­ном источ­ни­ке пред­ла­га­ет­ся исполь­зо­вать 2 способа:

  1. Задей­ство­вать пла­гин bpipe при опи­са­нии файлсета.
  2. Запус­кать скрипт до резер­ви­ро­ва­ния, кото­рый сна­ча­ла сде­ла­ет дамп базы.

Мы вос­поль­зу­ем­ся вто­рым спо­со­бом: он, доволь­но, понят­ный и не потре­бу­ет уста­нов­ки допол­ни­тель­ных пакетов.

При­мер задания:

При­мер файлсета:

База данных MySQL/MariaDB в docker

В целом, зада­ча похо­жа, но пред­по­ло­жим, что мы хотим сде­лать дамп из хосто­вой систе­мы, под­клю­чив­шись к базе дан­ных удаленно.

На сто­роне аген­та созда­ем скрипт:

vi /scripts/bareos_backup_mariadb_before.sh

Так­же на сто­роне кли­ен­та создадим:

vi /root/.my.cnf

* где user и password — логин и пароль для под­клю­че­ния к базе с целью созда­ния дампа.

Зада­ние bareos:

Файл­сет

Анализ и устранение проблем

Для резерв­но­го копи­ро­ва­ния очень важ­но уметь отсле­жи­вать и устра­нять ошиб­ки. Мы рас­смот­рим про­цесс деба­га при выпол­не­нии зада­ний, а так­же при­мер оши­бок при настрой­ке и экс­плу­а­та­ции сервера.

Debug при выполнении заданий

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

Что­бы полу­чить нуж­ную для про­цес­са отсле­жи­ва­ния оши­бок инфор­ма­цию, мы долж­ны вклю­чить трейс для кли­ен­та. Это дела­ет­ся в кон­со­ли bconsole, например:

* setdebug client=client_name level=200 trace=1

* в дан­ном при­ме­ре мы запу­стим логи­ро­ва­ние на кли­ен­те client_name с уров­нем дета­ли­за­ции 200.

В ответ мы полу­чим что-то на подобие:

2000 OK setdebug=200 trace=1 hangup=0 timestamp=0 tracefile=/var/lib/bareos/client_name-fd.trace

Гото­во, теперь на аген­те в файл /var/lib/bareos/client_name-fd.trace будет запи­сы­вать­ся отла­доч­ная инфор­ма­ция. Посмот­реть ее мож­но командой:

tail -f /var/lib/bareos/client_name-fd.trace

После отлад­ки и устра­не­ния про­бле­мы, не забы­ва­ем выклю­чить режим дебага:

* setdebug client=client_name level=0 trace=0

А так­же на кли­ен­те мож­но уда­лить файл с логами:

rm -f /var/lib/bareos/client_name-fd.trace

Возможные ошибки

Рас­смот­рим при­ме­ры оши­бок, с кото­ры­ми столк­нул­ся я.

1. configure error: Could not find config Resource "Profile" referenced on line 4 :   Profile = webui-admin

Ошиб­ка появ­ля­ет­ся при попыт­ке создать учет­ную запись для досту­па к веб-интерфейсу.

При­чи­на: bareos не видит фай­лы с опи­са­ни­ем про­фи­лей, кото­рые уста­нав­ли­ва­ют­ся с паке­том bareos-webui.

Реше­ние: как пра­ви­ло, такое про­ис­хо­дит, если мы не пере­за­пу­сти­ли служ­бу дирек­то­ра после уста­нов­ки допол­ни­тель­но­го ком­по­нен­та. Выпол­ним команду:

systemctl restart bareos-dir

2. Sorry, cannot authenticate. Wrong username, password or SSL/TLS handshake failed

Ошиб­ка появ­ля­ет­ся при попыт­ке вхо­да в веб-интерфейс.

При­чи­на: с вер­сии 18.2 bareos исполь­зу­ет по умол­ча­нию TLS-PSK, кото­рая не под­дер­жи­ва­ет­ся со сто­ро­ны PHP по умолчанию.

Реше­ние: к сожа­ле­нию, мне не уда­лось разо­брать­ся с пра­виль­ным вари­ан­том исполь­зо­ва­ния TLS-PSK, поэто­му, в каче­стве реше­ния, пред­ла­га­ет­ся не исполь­зо­вать шиф­ро­ва­ние меж­ду основ­ным сер­ви­сом bareos и UI. Для это­го откры­ва­ем файл с настро­ен­ной учет­ной запи­сью вхо­да (в нашем при­ме­ре, admin):

vi /etc/bareos/bareos-dir.d/console/admin.conf

И доба­вим строку:

Пере­за­пу­стим сервис:

systemctl restart bareos-dir

Мож­но проверять.

3. Error: lib/bsock_tcp.cc:186 BnetHost2IpAddrs() for host "XXX" failed: ERR=Name or service not known

Ошиб­ка появ­ля­ет­ся при выпол­не­нии зада­ния резерв­но­го копирования.

При­чи­на: систе­ма не может под­клю­чить­ся к хосту или само­му себе по име­ни, кото­рое ука­за­но в кон­фи­гу­ра­ци­он­ном фай­ле для storage. Воз­мож­но, было изме­не­но имя сервера.

Реше­ние: откры­ва­ем файл:

vi /etc/bareos/bareos-dir.d/storage/File.conf

Необ­хо­ди­мо убе­дить­ся, что в дирек­ти­ве Address у нас ука­за­но акту­аль­ное имя сервера:

После пере­за­пу­стим сервис:

systemctl restart bareos-dir

4. Issued certificate has expired

При попыт­ке загру­зить файл с настрой­ка­ми репо­зи­то­рия мы можем полу­чить ошиб­ку сер­ти­фи­ка­та. При­мер сообщения:

ERROR: cannot verify download.bareos.org's certificate, issued by ‘/C=US/O=Let's Encrypt/CN=R3’:
Issued certificate has expired.
To connect to download.bareos.org insecurely, use `--no-check-certificate'.

При­чи­на: наша систе­ма не дове­ря­ет сер­ти­фи­ка­ту, кото­рый исполь­зу­ет­ся репо­зи­то­ри­ем. Как пра­ви­ло, это наблю­да­ет­ся при уста­ре­ва­нии кор­не­вых сер­ти­фи­ка­тов на нашем компьютере.

Реше­ние: мы можем решить про­бле­мы 2 способами.

а) быст­рый спо­соб: под­хо­дит как вре­мен­ное реше­ние. Мы можем ска­зать ути­ли­те wget не про­ве­рять сер­ти­фи­кат — для это­го добав­ля­ем опцию --no-check-certificate:

wget --no-check-certificate …

б) пра­виль­ный спо­соб: обно­вить кор­не­вые сертификаты.

5. Could not connect to Storage daemon on XXX:9103. ERR=No route to host

Зада­ние зави­са­ет и выпа­да­ет с ошиб­кой. В сооб­ще­ни­ях дирек­то­ра мы можем уви­деть сообщение:

bareos-dir JobId 3: Warning: lib/bsock_tcp.cc:123 Could not connect to Storage daemon on bareos:9103. ERR=No route to host

При­чи­на: сер­вер резерв­но­го копи­ро­ва­ния под­клю­ча­ет­ся к Storage daemon по сети. Дан­ная ошиб­ка гово­рит о том, что под­клю­че­ние не удалось.

Реше­ние: откры­ва­ем файл:

vi /etc/bareos/bareos-dir.d/storage/File.conf

А так­же осталь­ные фай­лы из ката­ло­га /etc/bareos/bareos-dir.d/storage. Нахо­дим:

Address = bareos

* где bareos — имя сер­ве­ра с ролью Storage daemon.

Нам нуж­но убе­дить­ся, что сер­вер из дирек­ти­вы Address досту­пен по сети.

6. DateTime::__construct()

При попыт­ке загру­зить дан­ные в веб-интер­фей­се на заклад­ке Timeline ниче­го не про­ис­хо­дит, а в кон­соль бра­у­зе­ра отоб­ра­жа­ет­ся ошиб­ка 500 при попыт­ке загру­зить дан­ные со стра­ни­цы /bareos-webui/job/getData/?data=timeline. Если перей­ти на дан­ную стра­ни­цу мы уви­дим исклю­че­ние с текстом:

При­чи­на: по умол­ча­нию php уста­нав­ли­ва­ет­ся без настрой­ки вре­мен­ной зоны. Без дан­ной настрой­ки при­ло­же­ние не может рабо­тать кор­рект­но, так как не отра­ба­ты­ва­ет функ­ция date_default_timezone_set.

Реше­ние: откры­ва­ем файл:

vi /etc/php.ini

Добав­ля­ем строку:

date.timezone = "Europe/Moscow"

* где Europe/Moscow — нуж­ный часо­вой пояс.

Пере­за­пус­ка­ем веб-сервер:

systemctl reload httpd