GitLab 데이터 백업 및 복구

GitLab 설치

GitLab 최신버전은 여기 다운받을 수 있으나, GitLab은 버전별 DB 호환성 문제로 백업/복구시 동일한 GitLab 버전으로 설치하는 것이 정신에 좋다. 사내에서 사용하고 있는 GitLab 서버의 버전은 12.10.6을 사용하고 있으며, 여기 필요한 버전을 다운 받도록 한다.

 

특정 버전을 받아 설치할 경우, gitlab-ce 패키지가 업데이트되지 않도록 설정해야 하며, 가급적 우분투 저장소에 GitLab 패키지 저장소를 추가하지 않는 것이 좋다. 특정 버전의 GitLab를 설치할 경우 아래 패키지를 미리 설치하도록 한다. SMTP를 운영하지 않아 postfix를 생략하도록 한다.

$ sudo apt install curl openssh-server ca-certificates tzdata perl

그리고, gitlab-ce 패키지가 업데이트 되지 않도록 apt-mark 명령어를 사용하여 hold 하도록 한다.

$ sudo apt-mark hold gitlab-ce

 

GitLab 저장소 및 백업 경로 변경

GitLab 저장소 경로를 변경할 경우, 모든 상위 디렉토리의 소유자는 반드시 git으로 설정되어 있어야 한다. 특정 SSD를 마운트하여 /git-data 디렉토리를 GitLab 저장소 경로로 설정한 것이다.

$ sudo vi /etc/gitlab/gitlab.rb

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

GitLab 백업 경로는 변수를 변경하여 설정할 수 있으며, 백업 경로도 특정 HDD를 마운트하여 백업 경로로 설정하였다. 마찬가지로 백업 경로의 모든 상위 디렉토리 소유자는 git으로 설정되어 있어야 한다.

gitlab_rails['manage_backup_path'] = true 
gitlab_rails['backup_path'] = "/git-data/backup"

GitLab 설정을 변경하였다면, 아래 명령어를 실행하여 적용하도록 한다.

$ sudo gitlab-ctl reconfigure

 

GitLab 데이터 백업

GitLab 백업은 아래 명령어로 간단히 할 수 있으며, 위의 설정된 백업 경로에 tar 형식으로 생성된다. crontab을 이용하여 주기적인 백업 파일 생성이 가능하다.

$ sudo gitlab-rake gitlab:backup:create

아래 스크립트는 매일 02시에 GitLab 데이터 백업 실행 후, 12일 이전 백업 파일을 삭제하고 재부팅하도록 설정한 것이다.

$ vi /root/bin/gitlab-backup.sh

gitlab-rake gitlab:backup:create > /var/log/cron_root.txt
sleep 10
find /var/opt/gitlab/backups/ -type f -mtime +12 | sort | xargs rm -f
sleep 10
sync
sleep 10
reboot

마지막으로 crontab을 이용하여 매일 새벽 2시에 백업작업을 실행하도록 아래와 같이 스케쥴을 등록하도록 한다.

0 2 * * * /root/bin/gitlab-backup.sh

 

GitLab 데이터 복구

GitLab 데이터 복구시 백업파일의 경로를 지정할 수 없어(?), tar 형식의 백업 파일을 백업 경로(/git-data/backup)에 복사해야 한다. 데이터를 복구하기 전에, 몇가지 GitLab 서비스를 종료하도록 한다.

$ sudo gitlab-ctl stop unicorn
$ sudo gitlab-ctl stop puma
$ sudo gitlab-ctl stop sidekiq

# Verify
$ sudo gitlab-ctl status

데이터 복구는 아래 명령어로 간단히 할 수 있으며, 백업파일 지정시 _gitlab_backup.tar 접미사는 생략하도록 한다.

$ sudo gitlab-backup restore BACKUP=<백업파일>

복구하는 과정에서 DB 테이블를 모두 삭제한다는 질의가 나오는데, 이것은 각자 알아서 잘 판단해서 결정해야 한다. 그리고 모든 절차가 완료되었다면, GitLab 서비스를 모두 중지시킨 상태에서 reconfigure 실행 후 GitLab 서비스를 다시 실행하도록 한다.

$ sudo gitlab-ctl stop
$ sudo gitlab-ctl reconfigure
$ sudo gitlab-ctl restart