서버에 있는 sqlite의 db를 Google Drive에 자동 백업되도록 하려고 합니다. rclone과 cron을 사용합니다.
rclone
- 클라우드 저장소와 파일을 주고받는 도구
- CLI에서 Google Drive, Dropbox, OneDrive 같은 클라우드에 파일을 업로드/다운로드할 수 있게 해주는 프로그램
Cron
- 리눅스에서 작업을 예약 실행해주는 스케줄러
rclone 설치
# rclone 설치
curl https://rclone.org/install.sh | sudo bash
설치 확인
rclone version
로컬 PC에 rclone 설치
서버에는 브라우저가 없기에 윈도우에서 토큰을 발급받아줍니다.
Windows
- https://rclone.org/downloads/ 접속하여 Windows용 zip 파일 다운로드
- 압축 해제 후 폴더 안에서 PowerShell 또는 CMD 열기
토큰 발급 명령어 실행
.\rclone.exe authorize drive
{ 부터 } 까지 전체를 복사해야함!!
서버에서 rclone 설정
rclone config
No remotes found, make a new one?
> n
name> (원하는 이름으로 입력)
Type of storage to configure.
Storage> drive
client_id>
→ 그냥 Enter (비워두기)
client_secret>
→ 그냥 Enter (비워두기)
scope> 1 (전체 액세스 권한)
root_folder_id>
→ 그냥 Enter (비워두기)
service_account_file>
→ 그냥 Enter (비워두기)
Edit advanced config?
> n
Use auto config?
> n (헤드리스 환경이므로)
config_token>
→ 복사한 토큰을 붙여넣기 (중괄호까지 붙여넣기)
Configure this as a Shared Drive (Team Drive)?
> n (개인 드라이브 사용)
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
> y
q) Quit config
> q
연결 테스트
rclone lsd gdrive:
→ 본인 drive의 폴더들이 나와야 함.
테스트 파일 업로드
# 테스트 파일 생성
echo "test" > /tmp/test.txt
# Google Drive에 업로드
rclone copy /tmp/test.txt gdrive:
# 업로드 확인
rclone ls gdrive: | grep test
→ 본인 drive에 test.txt가 나와야 함.
스크립트 파일 생성
sudo nano /usr/local/bin/gdrive_backup.sh
#!/bin/bash
# ===================== 설정 영역 =====================
DB_PATH="" # SQLite DB 파일 경로
GDRIVE_REMOTE="" # rclone remote 이름
GDRIVE_FOLDER="" # Google Drive 백업 폴더명
MAX_BACKUPS= # 유지할 최대 백업 개수
DB_NAME="" # 백업 파일 prefix
# ================================================================
LOG_FILE="" # 로그 파일 경로
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
BACKUP_DATE=$(date '+%Y%m%d')
log() {
echo "[$TIMESTAMP] $1" | tee -a "$LOG_FILE"
}
error_exit() {
log "ERROR: $1"
exit 1
}
log "========== 백업 시작 =========="
# DB 파일 존재 확인
if [ ! -f "$DB_PATH" ]; then
error_exit "DB 파일을 찾을 수 없습니다: $DB_PATH"
fi
# 임시 백업 파일 생성
TEMP_BACKUP="/tmp/${DB_NAME}_${BACKUP_DATE}.db"
log "SQLite 백업 생성 중: $TEMP_BACKUP"
sqlite3 "$DB_PATH" ".backup '$TEMP_BACKUP'" || error_exit "SQLite 백업 실패"
# Google Drive에 업로드
GDRIVE_PATH="${GDRIVE_REMOTE}:${GDRIVE_FOLDER}/"
REMOTE_FILE="${DB_NAME}_${BACKUP_DATE}.db"
log "Google Drive 업로드 중: $REMOTE_FILE"
rclone copy "$TEMP_BACKUP" "$GDRIVE_PATH" || error_exit "업로드 실패"
log "업로드 완료: $REMOTE_FILE"
# 임시 파일 삭제
rm -f "$TEMP_BACKUP"
# 오래된 백업 삭제
log "백업 버전 관리 중... (최대 ${MAX_BACKUPS}개 유지)"
BACKUP_LIST=$(rclone lsf "$GDRIVE_PATH" --files-only | grep "^${DB_NAME}_" | sort)
BACKUP_COUNT=$(echo "$BACKUP_LIST" | grep -c "^${DB_NAME}_" || echo "0")
log "현재 백업 개수: $BACKUP_COUNT"
if [ "$BACKUP_COUNT" -gt "$MAX_BACKUPS" ]; then
DELETE_COUNT=$((BACKUP_COUNT - MAX_BACKUPS))
log "초과 백업 ${DELETE_COUNT}개 삭제 예정"
echo "$BACKUP_LIST" | head -n "$DELETE_COUNT" | while read -r OLD_FILE; do
if [ -n "$OLD_FILE" ]; then
log "삭제 중: $OLD_FILE"
rclone delete "${GDRIVE_PATH}${OLD_FILE}"
fi
done
fi
log "========== 백업 완료 =========="
exit 0
실행 권한 부여
sudo chmod +x /usr/local/bin/gdrive_backup.sh
로그 파일 생성
sudo touch /var/log/backup.log
sudo chmod 666 /var/log/backup.log
스크립트 테스트
#수동 실행
/usr/local/bin/gdrive_backup.sh
확인
rclone ls gdrive:backup/
cat /var/log/backup.log
Cron으로 자동화 설정
crontab 편집
crontab -e
# 매주 월요일 새벽 4시에 백업
0 4 * * 1 /usr/local/bin/gdrive_backup.sh
- 분 시 일 월 요일 순서임. (일요일부터 0임)
확인
crontab -l
확인이 잘 되었다면 자동 백업 설정 끝~
'라즈베리파이' 카테고리의 다른 글
| 라즈베리파이 - OS설치, ssh 연결 (1) | 2025.09.11 |
|---|