Страницы

четверг, 12 сентября 2019 г.

Резервное копирование Gitlab в Docker контейнере

В одном из предыдущих постов, я описал запуск GitLab в Docker контейнере. Как известно, администраторы делятся на тех, кто делает резервные копии и тех, кто пока их не делает, я отношусь к первым.

Задача: организовать резервное копирование GitLab.

В общем случае Gitlab резервируется командой
gitlab-rake gitlab:backup:create
При этом создается архив в каталоге /var/opt/gitlab/backups/ и выдается следующее сообщение
Warning: Your gitlab.rb and gitlab-secrets.json files contain sensitive data  and are not included in this backup. You will need these files to restore a backup. Please back them up manually.
Помимо созданного архива нам нужны еще файлы из /etc/gitlab

Решение задачи:

Я решил разбить задачу на 3 этапа:
  1. Создать комплексный архив в контейнере
  2. Перенести бекап из контейнера на хост машину
  3. Забекапить файл комплексного архива системой резервного копирования Bacula
Пункт 3 тривиальный и здесь не рассматривается (если у Вас есть Bacula/Bareos то вы знаете как ими пользоваться, а если нет, то воспользуйтесь для бекапа применяемым у Вас способом)
Подключаемся к контейнеру GitLab:
docker exec -it gitlab-linode bash
Генерируем SSH ключ
ssh-keygen
Копируем публичный ключ на хост машину (потребуется ввести пароль рута хост машины):
ssh-copy-id -i .ssh/id_rsa.pub hosp_ip
В папке рута создаем каталог для хранения скриптов:
mkdir /root/scripts
В этой папке создаем скрипт следующего содержания:
nano /root/scripts/git_backup.sh
#!/bin/sh
date=`date "+%Y-%m-%d"`
rm /var/backups/*
rm /var/opt/gitlab/backups/*
gitlab-rake gitlab:backup:create
cd /var/backups/
tar -cavf gitlab-$date.tar.gz /etc/gitlab /var/opt/gitlab/backups/*
scp gitlab*.tar.gz host_ip:/bacula/backups/
Делаем скрипт исполняемым:
chmod +x /root/scripts/git_backup.sh
Проверяем работу(на хост машине должна существовать целевая папка)
/root/scripts/git_backup.sh
Проверяем результат:
Выходим из контейнера с помощью комбинации <Ctrl><D>
Добавляем скрипт в планировщик (внимание!!!) хост машины, не контейнера:
nano /etc/cron.daily/docker_bacupp.sh
#!/bin/sh
docker exec gitlab-linode /root/scripts/git_backup.sh > /bacula/backups/backup.log 2>&1
Делаем исполняемым:
chmod +x /etc/cron.daily/docker_backup.sh

P.S.

Я отдаю себе отчет, что мог бы из контейнера с помощью rsync помещать полученный бэкап на удаленный хост, но пошел именно по такому пути, так как на одном хосте может быть много разных контейнеров и удобнее все бекапы складывать в одно место, после чего централизованно их обрабатывать используемой на предприятии системой резервного копирования. А еще я могу выполнять этот скрипт прямо из Backula, не используя планировщик, и т.д. Одним словом я получил гибкое решение.

P.P.S

Так, как GitLab можно развернуть из резервной копии только на версию резервной копии настоятельно рекомендуется сделать резервирование Docker image, с которого ставился контейнер:
docker images
Список наших Docker images
docker save -o gitlab_latest.tar gitlab/gitlab-ee:latest
И отметить для перманентного хранения.

Комментариев нет:

Отправить комментарий