양파개발자 실바의 블로그

GitLab 백업 스크립트

GitLab 서버에서 전체 데이터를 백업하는 스크립트입니다. DB, Redis, 인증 등의 모든 데이터를 포함하여 백업합니다. 슈퍼 유저 콘솔에서 실행해야 합니다.


1. 스크립트 내용

#!/bin/bash

# ###############################
# 구 gitlab 서버에서 데이터 백업
# - 슈퍼 유저 콘솔에서 실행 (sudo -i)
# - DB, redis, 인증 등의 모든 데이터 포함
# ###############################

# 설정 변수
BACKUP_DIR="/home/ec2-user/gitlab_backups"
GITLAB_BACKUP_DIR="/var/opt/gitlab/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
RETENTION_DAYS=30

echo "[INFO] GitLab 전체 백업 스크립트 실행 시작: $(date)"

# ec2-user 홈 디렉토리에 백업 폴더 생성 (없으면 생성)
if [ ! -d "$BACKUP_DIR" ]; then
    echo "[INFO] 백업 폴더 생성: $BACKUP_DIR"
    sudo mkdir -p "$BACKUP_DIR"
    sudo chown ec2-user:ec2-user "$BACKUP_DIR"
fi

# GitLab 서비스 중지 (데이터 정합성을 위해)
echo "[INFO] GitLab 서비스를 일시 중지합니다..."
sudo gitlab-ctl stop

echo "[INFO] 백업을 위해 필요한 GitLab 서비스 일부는 구동..."
sudo gitlab-ctl start postgresql
sudo gitlab-ctl start redis
sudo gitlab-ctl start gitaly

# GitLab 전체 백업 (DB + 저장소 + 설정 파일)
echo "[INFO] GitLab 백업 생성 중..."
sudo gitlab-backup create SKIP=uploads,builds,artifacts,lfs,registry,pages
if [ $? -ne 0 ]; then
    echo "[ERROR] GitLab 백업 생성 실패!"
    sudo gitlab-ctl start  # 실패 시 GitLab 재시작
    exit 1
fi

# GitLab 중요한 디렉토리 추가 백업
echo "[INFO] GitLab 설정 및 사용자 데이터 백업..."
sudo tar -czvf "$BACKUP_DIR/gitlab_config_backup.tar.gz" /etc/gitlab
sudo tar -czvf "$BACKUP_DIR/gitlab_secrets_backup.tar.gz" /var/opt/gitlab/gitlab-rails/etc

# GitLab 서비스 재시작
echo "[INFO] GitLab 서비스를 다시 시작합니다..."
sudo gitlab-ctl start

# 가장 최근 생성된 백업 파일 찾기
LATEST_BACKUP=$(ls -t "$GITLAB_BACKUP_DIR"/*.tar | head -1)
if [ -z "$LATEST_BACKUP" ]; then
    echo "[ERROR] 백업 파일을 찾을 수 없습니다."
    exit 1
fi
echo "[INFO] 생성된 백업 파일: $LATEST_BACKUP"

# 백업 파일을 지정된 디렉토리로 이동
echo "[INFO] 백업 파일 이동..."
sudo cp "$LATEST_BACKUP" $BACKUP_DIR
BACKUP_FILE=`basename $LATEST_BACKUP`
sudo chown ec2-user:ec2-user "$BACKUP_DIR/*"

# 오래된 백업 파일 정리 (7일 이상 된 파일 삭제)
echo "[INFO] ${RETENTION_DAYS}일 이상 된 백업 파일 삭제..."
find "$BACKUP_DIR" -type f -name "*.tar" -mtime +$RETENTION_DAYS -exec rm -f {} \;

echo "[INFO] GitLab 전체 백업 완료"
echo "- 백업 파일 DIR: $BACKUP_DIR/*"
echo "- 백업 파일 PATH: $BACKUP_DIR/$LATEST_BACKUP"
echo "- 완료 시간: $(date)"

2. 주요 기능

  • 전체 데이터 백업: DB, 저장소, 설정 파일 포함
  • 서비스 안전 중지: 데이터 정합성을 위해 서비스 중지 후 백업
  • 자동 정리: 30일 이상 된 백업 파일 자동 삭제
  • 에러 처리: 백업 실패 시 서비스 재시작 및 에러 메시지 출력