На днях я задался целью, полностью автоматизировать процесс резервного копирования GitLab. Для решения этой задачи я решил использовать rsync. На другой машине запустил rsync-сервер. Осталось дело за малым, написать shell-скрипт и добавить его в cron, но я решил пойти немного другим путем…
Задачи:
Настроить резервное копирование GitLab с помощью rsync;
Запускать задачу резервного копирования по cron, раз в сутки;
Отправлять уведомления через HipChat.
Версия ПО:
Ubuntu Server 15.04;
GitLab 7.10.4;
ZSH 5.0.7.
Первым делом, создаем необходимую структуру для нашего мини-проекта:
Добавляем в Gemfile необходимые библиотеки:
И устанавливаем их:
Основные настройки нашего мини-проекта буду храниться в файле .env:
А тепень подробнее о каждом из них:
ROOT_PATH - местоположение проекта;
HIPCHAT_TOKEN - ключ, необходимый для работы с HipChat;
HIPCHAT_ROOMS - список комнат, куда будут отправляться уведомления;
RSYNC_HOST - адрес rsync-сервера;
RSYNC_SSH_USER - имя пользователя, для доступа по ssh;
RSYNC_PATH - путь, куда будет выполняться резервное копирование на rsync-сервере.
Чтобы иметь возможность, выполнять резервное копирование системных файлов, необходимо запускать rsync через sudo. Для этого, потребуется немного доработать библиотеку backup. Создаем файл lib/rsync.rb:
Теперь нужно подключить наш небольшой патч к библиотеке backup. Для этого создаем файл bin/backup:
Следующим шагом будет создание файла config.rb, в котором будут храниться настройки библиотеки backup:
После того, как созданы все файлы с настройками, можно приступить к созданию модели для резервного копирования. Создаем файл models/rsync_backup.rb:
Здесь указываем, что в самом начале должен запуститься скрипт sudo gitlab-rake gitlab:backup:create, который создаст резервную копию БД и всех проектов из GitLab в директории /var/opt/gitlab/backups. Только после этого запуститься процесс резервного копирования.
Чтобы в процессе создания резервной копии, постоянно не вводить пароль для доступа к rsync-серверу, нужно сгенерировать ssh-ключи без пароля и скопировать их на удаленный сервер:
Необходимо так же добавить правило в /etc/sudoers, чтобы rsync не запрашивал пароль, при каждом запуске через sudo:
Важно! Замените user - на реального пользователя вашей системы, например ubuntu.
Для запуска резервного копирования можно воспользоваться следующей командой:
Осталось только автоматизировать этот процесс, для этого создаем файл config/schedule.rb:
И добавляем задачу в cron:
В данном примере, резервное копирование будет выполняться каждый день в 2 часа ночи.
На этом можно поставить точку, все наши GitLab-проекты теперь в полной целостности и сохранности.