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.
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_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
....
* 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)
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'"
}
....
}
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", собирающей необходимую информацию.