UMGUM.COM (лучше) 

Bacula + GitLab backup ( Резервное копирование настроек и данных системы управления Git-репозиториями "GitLab" с помощью Bacula в среде OS Linux. )

30 ноября 2018

OS: "Linux Debian 7/8/9 (Wheezy/Jessie/Stretch)".
Application: "GitLab v10.4 (with Omnibus)", "Bacula v5.2/7.4".

Задача: наладить резервное копирование настроек и загруженных пользователям данных, адаптированных для последующей выгрузки в централизованное хранилище под управлением "Bacula".

В типовой поставке комплекса приложений управления репозиториями Git-кода "GitLab" в качестве оркестратора используется "Omnibus". В комплекте утилит "Omnibus" есть специально предназначенная для задач обслуживания, в том числе и резервного копирования пользовательских данных как таковых - "rake/gitlab-rake". Утилита "rake" умеет выгружать следующий, достаточный для последующего полного восстановления сервиса, набор данных:

Database;
Attachments;
Git repositories data;
CI/CD job output logs;
CI/CD job artifacts;
LFS objects;
Container Registry images;
GitLab Pages content.


Следует иметь в виду, что утилиты "GitLab" оперируют только с данными самого комплекса, условно говоря, берут только то, что выше корня иерархии конфигурации. А вот конфигурационный файл параметров запуска - обычно это "gitlab.rb" - находится за пределами зоны пользовательских данных и резервному копированию утилитой "rake/gitlab-rake" не подлежит:

Важно не забыть захватить директорию с настройками сервиса "/etc/gitlab" отдельно (применительно к типовой сборке с оркестратором "Omnibus").

Предварительная подготовка.

Почти наверняка всё потребное программное обеспечение было уже установлено в комплекте с "GitLab"-ом как таковым, но, на всякий случай сделаем это явно:

# aptitude install rsync tar

Определяем в конфигурационном файле "Omnibus" ряд ключевых параметров резервного копирования:

# vi /etc/gitlab/gitlab.rb

....
# Разрешаем GitLab-у задавать параметры разрешений доступа для директории хранения резервных копий
gitlab_rails['manage_backup_path'] = true

# Указываем удобный нам путь для сохранения генерируемых GitLab-ом резервных копий
gitlab_rails['backup_path'] = "/var/backups/gitlab"

# Задаём срок хранения файлов резервных копий, по истечению которого GitLab будет их удалять при запуске задания
# (three days; in seconds)
gitlab_rails['backup_keep_time'] = 259200
....

Даём команду оркестратору "GitLab" перечитать конфигурационные файлы и принять изменения (при этом будут перезапущены только те сервисы, в конфигурации которых обнаружены изменения):

# gitlab-ctl reconfigure

....
* template[/var/opt/gitlab/gitlab-rails/etc/gitlab.yml] action create
   - update content in file /var/opt/gitlab/gitlab-rails/etc/gitlab.yml from 4bdc34 to 18ed03
   ....
   ## Backup settings
   backup:
   + path: "/var/backups/gitlab"
   + keep_time: 259200
....

Пробный запуск процедуры выгрузки "бэкапа".

Уже сейчас можно запустить процедуру резервного копирования и убедиться, что она отрабатывает без ошибок, создаёт архив данных там, где задумывалось, и удаляет устаревшие, если таковые имеются:

# gitlab-rake gitlab:backup:create

Dumping database ...
Dumping PostgreSQL database gitlabhq_production ... [DONE]
done
Dumping repositories ...
* work-team/cisco-tools ... [DONE]
* work-team/linux-tools ... [DONE]
....
Creating backup archive: ... done
Deleting tmp directories ... done
Deleting old backups ... done. (8 removed)

Настройка резервного копирования посредством "Bacula".

Задача состоит в наладке резервного копирования посредством "Bacula", которая и будет запускать процедуру выгрузки данных - так что автоматизировать таковую через "Crontab" не нужно (и даже есть смысл проверить, не сделано ли это ранее, и отключить дублирующую автоматизации).

В качестве дополнительной подстраховки я бы ещё копировал данные Git-репозиториев как таковых (это самое ценное, и лучше бы перебдеть). Узнать их месторасположение проще всего из конфигурационного файла "GitLab":

# cat /etc/gitlab/gitlab.rb | grep git_data_dirs

git_data_dirs({ "default" => { "path" => "/var/opt/gitlab/git-data" } })

Действующие репозитории как таковые хранятся в поддиректории "./repositories/".

Дополним описание настроек "Bacula", касающиеся резервного копирования клиентского GitLab-сервиса:

# vi /etc/bacula/client.d/gitlab.example.net.conf

....
File Set {
  Name = "file-set-gitlab.example.net"
  ....

  # Директории конфигураций, Git-репозиториев и резервных копий сервиса "GitLab (with Omnibus)"
  File = "/etc/gitlab/"
  File = "/var/opt/gitlab/git-data/repositories/"
  File = "/var/backups/gitlab/"
  ....
}
....

Job {
  Name = "gitlab.example.net"
  Type = Backup
  ....

  # Запуск выгрузки резервной копии настроек и пользовательских данных "GitLab (with Omnibus)":
  Run Script {
    Runs When = Before
    Fail Job On Error = No
    Command = "mkdir -p /var/backups/gitlab"
    Command = "/bin/bash -c 'gitlab-rake gitlab:env:info 1>/var/backups/gitlab/info'"
    Command = "/bin/bash -c 'gitlab-rake gitlab:backup:create 1>/var/log/bacula-gitlab_backup.log 2>&1'"
  }
  ....
}

Проверим корректность конфигурации в целом средствами самого Bacula:

# bacula-dir -c /etc/bacula/bacula-dir.conf -t

Обращаю внимание, что с учётом непрерывного развития проекта "GitLab" и возможного изменения конфигурации его компонентов развёртывание сервиса из резервных копий гарантируется только для версии программного обеспечения близкой к той, из которой данные были сохранены. Специально для возможности сверки версий вместе в резервными копиями я сохраняю вывод команды "gitlab-rake gitlab:env:info", собирающей необходимую информацию.


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )