GitLab 서버의 로컬 백업만으로는 하드웨어 장애나 예기치 못한 재난 상황에 완벽히 대응하기 어렵습니다. 데이터 가용성을 확보하기 위해 로컬에 생성된 백업 파일을 원격 서버로 안전하게 전송하고, 보관 주기에 따라 관리하는 자동화 프로세스를 구축하는 방법을 설명합니다.
1. SSH 키 인증을 통한 무인 전송 환경 구축
스크립트 실행 시 비밀번호 입력 단계 없이 파일을 전송하려면, GitLab 서버와 백업 서버 간에 SSH 키 기반의 신뢰 관계를 설정해야 합니다.
1.1 GitLab 서버에서 키 쌍 생성
GitLab 서버(이하 서버 A)에서 RSA 키 쌍을 생성합니다. 보안상의 이유로 비밀번호(Passphrase)는 비워두고 기본 경로를 사용합니다.
ssh-keygen -t rsa
생성이 완료되면 ~/.ssh/ 경로에 id_rsa(비밀키)와 id_rsa.pub(공개키)가 저장됩니다.
1.2 공개키 서버 전송 및 등록
서버 A의 공개키를 백업 서버(이하 서버 B)로 복사합니다.
# 서버 A에서 실행
scp ~/.ssh/id_rsa.pub root@192.168.1.2:/root/id_rsa_source.pub
이제 서버 B에 접속하여 전달받은 공개키를 공인 인증 목록에 추가합니다.
# 서버 B에서 실행
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat /root/id_rsa_source.pub >> ~/.ssh/authorized_keys
chmod 400 ~/.ssh/authorized_keys
설정이 완료되면 서버 A에서 ssh root@192.168.1.2 명령 시 암호 없이 로그인이 가능해집니다.
2. 원격 백업 자동화 스크립트 작성
최근 생성된 백업 파일을 찾아 원격지로 전송하고 결과를 로깅하는 쉘 스크립트를 작성합니다.
2.1 파일 전송 스크립트 (server_backup_sync.sh)
서버 A의 /root/scripts/ 등의 경로에 아래 스크립트를 생성합니다.
#!/bin/bash
# 설정 정보
SRC_DIR="/var/opt/gitlab/backups"
DEST_USER="root"
DEST_IP="192.168.1.2"
DEST_DIR="/data/gitlab_remote_storage"
LOG_PATH="/var/log/gitlab/sync_process.log"
# 날짜 정의
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
TODAY=$(date "+%Y-%m-%d")
# 전송 대상 탐색 (최근 1시간 내 생성된 tar 파일)
TARGET_FILE=$(find $SRC_DIR -type f -mmin -60 -name "*.tar")
# 로그 폴더 생성
mkdir -p $(dirname $LOG_PATH)
echo "[$CURRENT_TIME] 원격 백업 전송 시작" >> $LOG_PATH
if [ -n "$TARGET_FILE" ]; then
for FILE in $TARGET_FILE; do
scp $FILE $DEST_USER@$DEST_IP:$DEST_DIR
echo "전송 완료: $(basename $FILE)" >> $LOG_PATH
done
else
echo "전송 대상 파일을 찾을 수 없습니다." >> $LOG_PATH
fi
echo "-------------------------------------------" >> $LOG_PATH
2.2 실행 권한 부여 및 테스트
chmod +x /root/scripts/server_backup_sync.sh
/root/scripts/server_backup_sync.sh
3. 자동 실행 스케줄러 등록
GitLab의 로컬 백업 완료 시점에 맞춰 스크립트가 실행되도록 crontab에 등록합니다.
crontab -e
# 매일 오후 12시 10분과 오후 7시 10분에 전송 실행
10 12 * * * /root/scripts/server_backup_sync.sh
10 19 * * * /root/scripts/server_backup_sync.sh
4. 백업 서버 스토리지 관리
백업 서버의 디스크 부족 현상을 방지하기 위해 일정 기간이 지난 파일은 자동으로 삭제하는 스크립트를 서버 B에 구축합니다.
4.1 데이터 정리 스크립트 (cleanup_storage.sh)
#!/bin/bash
# 백업 파일 보관 경로
STORAGE_PATH="/data/gitlab_remote_storage"
# 보관 기간 (14일 초과 시 삭제)
RETENTION_DAYS=14
echo "[$ (date "+%Y-%m-%d %H:%M:%S")] 구형 백업 데이터 정리 시작"
# 14일이 지난 .tar 파일 삭제
find $STORAGE_PATH -type f -mtime +$RETENTION_DAYS -name "*.tar" -exec rm -f {} \;
echo "정리 작업 완료."
4.2 정리 스케줄러 등록
서버 B에서 매일 자정에 정리 스크립트가 돌아가도록 설정합니다.
crontab -e
# 매일 00:00에 노후 데이터 삭제
0 0 * * * /root/scripts/cleanup_storage.sh
이와 같은 구성을 통해 GitLab 데이터의 물리적 격리 보관을 자동화할 수 있으며, 데이터 손실 위험을 최소화할 수 있습니다.