서버 백업 (linux server -> MS OneDrive , GoogleDrive)
2022.05.31
서버 자료의 보험은 복구 가능한 데이터 백업인데, 단계적으로 서버의 여유 공간이나 블록 스토리지 또는 NAS를 사용해왔었다.
개인적인 서버의 수익이 전무한 상황에 비용이 발생하는 백업 솔루션을 제외하고 안정적인 방법을 찾다 보니, OneDrive에 백업할 수 있는 방법을 찾게 되어 적용해 보았다.
fuseZ(Filesystem in Userspace) 가 설치되어 있는지 먼저 확인 (이것 때문에 고생 했다..)
> yum install unzip
> yum install fuse
> yum install p7zip
원드라이브(to OneDrive)
rclone 설치
> curl https://rclone.org/install.sh | sudo bash
설정 프로그램 실행
> rclone config
설치중 name을 "onedrive" 로 지정
설치중 root_folder_id을 "backup_my_server" 로 지정
MS 원드라이브 루트에 "backup_my_server" 폴더를 생성
>> https://onedrive.live.com/?id=~~~&cid=~~~
연결 테스트
> rclone lsd onedrive:
> rclone ls onedrive:
FILE 백업 스크립트
> vi /home/_script/rclone_onedrive_files.sh
#!/bin/bash
# Set
BACKUPDIRHOME="/home"
BACKUPDIRCONFIG1="/home/_backup_config/etc"
BACKUPDIRCONFIG2="/home/_backup_config/opt"
# Config file copy
#\cp -af /etc /home/_backup_config/
rsync -a /etc/* ${BACKUPDIRCONFIG1}
rsync -a /opt/* ${BACKUPDIRCONFIG2}
# 원드라이브 파일버전 최대 25개, 수시 변경프로젝트는 별도 백업 필요
backup_target=/FILES
pid_rclone=`ps -ef | grep "rclone" | grep -v 'grep' | awk '{print $2}'`
if [ $pid_rclone ]; then
# 이미 실행중이라면 실행 안함
# 이미 실행중이라면 중지 후 실행
#pkill -9 -ef rclone
#/usr/bin/rclone copy "$BACKUPDIRHOME" "onedrive:$backup_target" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress
else
# 실행중인 프로세스가 없다면 실행
echo ""
echo "OneDrive Remote backup start : `date '+%Y-%m-%d %H:%M:%S'`"
/usr/bin/rclone copy "$BACKUPDIRHOME" "onedrive:$backup_target" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress
echo ""
echo "OneDrive Remote backup end : `date '+%Y-%m-%d %H:%M:%S'`"
fi
exit 0
DATABASE 백업 스크립트
> vi /home/_script/rclone_onedrive_database.sh
#!/bin/bash
# Set
DBSOCK=""
DBHOST="localhost"
DBUSER="backupUSER"
DBPASS="backupPASS"
MYSQL="/usr/bin/mysql"
MYSQLDUMP="/usr/bin/mysqldump"
BACKUPDIRDB="/backup/_backup_database"
BACKUP_DATE=`date +%Y-%m-%d`
compress_password="7zipPASSWORD"
echo ""
echo "DB dump start : `date '+%Y-%m-%d %H:%M:%S'`"
# DB List
DBLIST=`$MYSQL ${DBSOCK} --user=$DBUSER --password=$DBPASS -e "SHOW DATABASES;" | tail -n+2`
# Old db backup delete
rm -rf ${BACKUPDIRDB}/*
DIR="${BACKUPDIRDB}/${BACKUP_DATE}"
mkdir $DIR
for THISDB in $DBLIST
do
TABLELIST=`$MYSQL ${DBSOCK} -h${DBHOST} -u${DBUSER} -p${DBPASS} ${THISDB} -e "show tables" | /bin/grep -v Tables_in_${THISDB}`
DIR="${BACKUPDIRDB}/${BACKUP_DATE}/${THISDB}"
mkdir $DIR
for THISTABLE in $TABLELIST
do
TABLEDIR="${DIR}/${THISDB}.${THISTABLE}.sql"
echo "mysqldump $TABLEDIR"
$MYSQLDUMP ${DBSOCK} -h$DBHOST -u$DBUSER -p$DBPASS $THISDB $THISTABLE > $TABLEDIR
#echo "-->compress ${THISDB}.${THISTABLE}.bz2"
#bzip2 ${DIR}/${THISDB}.${THISTABLE}.sql
echo "-->compress ${THISDB}.${THISTABLE}.7z"
7za a ${DIR}/${THISDB}.${THISTABLE}.7z ${DIR}/${THISDB}.${THISTABLE}.sql -p${compress_password} -sdel
done
echo ""
done
echo ""
echo "DB dump end : `date '+%Y-%m-%d %H:%M:%S'`"
echo ""
echo "OneDrive Remote backup start : `date '+%Y-%m-%d %H:%M:%S'`"
# 매일 백업 (원드라이브 파일버전이 최대 25개)
backup_month=`date +%Y-%m`
backup_target=/DB/${backup_month}
#/usr/bin/rclone copy "/home/" "onedrive:$backup_target" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress
/usr/bin/rclone copy "$BACKUPDIRDB" "onedrive:$backup_target" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress
echo ""
echo "OneDrive Remote backup end : `date '+%Y-%m-%d %H:%M:%S'`"
exit 0
백업 스케쥴 등록
> vi /etc/crontab
5 3 * * * root /home/_script/rclone_onedrive_database.sh
5 4 * * * root /home/_script/rclone_onedrive_files.sh
아래 부터는 마운트가 필요할 경우에 적용 (백업만 할 경우에는 불필요)
원드라이브를 마운트
> mkdir /mnt/oneDrive_myOnedrive
마운트
> rclone mount onedrive: /mnt/oneDrive_myOnedrive --daemon --allow-other
언마운트
> fusermount -uz /mnt/oneDrive_myOnedrive
테스트
> sudo rclone sync /mnt/data1/plain_folders/ onedrive:mnt/data1/plain_folders/
> rclone copy "/home/" "onedrive:/home" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress --ignore-existing
사용자 설정
/root/.config/rclone/rclone.conf
/etc/fuse.conf
> vi /etc/systemd/system/rclone-onedrive.service
[Unit]
Description=rclone mount for one drive
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
KillMode=none
RestartSec=5
ExecStart=/usr/bin/rclone mount onedrive:/ /mnt/oneDrive_myOnedrive \
--config /root/.config/rclone/rclone.conf \
--umask 002 \
--allow-other \
--allow-non-empty \
--fast-list \
--drive-skip-gdocs \
--poll-interval=1m \
--buffer-size=32M \
--vfs-read-chunk-size=32M \
--vfs-read-chunk-size-limit 2048M \
--vfs-cache-mode writes \
--dir-cache-time=1m
ExecStop=/usr/bin/fusermount -uz /mnt/oneDrive_myOnedrive
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
서비스 시작
> sudo systemctl start rclone-onedrive.service
> systemctl status rclone-onedrive.service
부팅시 자동 시작
> sudo systemctl enable rclone-onedrive.service
구글드라이브 (to GoogleDrive)
rclone 설치
> curl https://rclone.org/install.sh | sudo bash
설정 프로그램 실행
> rclone config
설치중 name을 "gdrive" 로 지정
설치중 root_folder_id을 "backup_XXXX_server" 로 지정
>> https://drive.google.com/drive/folders/~~~~
구글드라이브를 마운트
> mkdir /mnt/gDrive_MYNAME
마운트
> rclone mount gdrive: /mnt/gDrive_MYNAME --daemon --allow-other
언마운트
> fusermount -uz /mnt/gDrive_MYNAME
테스트
> sudo rclone sync /mnt/data1/plain_folders/ gdrive:mnt/data1/plain_folders/
> rclone copy "/home/" "gdrive:/home" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress --ignore-existing
사용자 설정
/root/.config/rclone/rclone.conf
/etc/fuse.conf
> vi /etc/systemd/system/rclone-gdrive.service
[Unit]
Description=rclone mount for google drive
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
KillMode=none
RestartSec=5
ExecStart=/usr/bin/rclone mount gdrive:/ /mnt/gDrive_MYNAME \
--config /root/.config/rclone/rclone.conf \
--umask 002 \
--allow-other \
--allow-non-empty \
--fast-list \
--drive-skip-gdocs \
--poll-interval=1m \
--buffer-size=32M \
--vfs-read-chunk-size=32M \
--vfs-read-chunk-size-limit 2048M \
--vfs-cache-mode writes \
--dir-cache-time=1m
ExecStop=/usr/bin/fusermount -uz /mnt/gDrive_MYNAME
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
서비스 시작
> sudo systemctl start rclone-gdrive.service
> systemctl status rclone-gdrive.service
부팅시 자동 시작
> sudo systemctl enable rclone-gdrive.service
스케쥴 프로그램
> vi /home/_script/rclone_gdrive.sh
#!/bin/bash
/usr/bin/rclone copy "/home/" "gdrive:/home" --create-empty-src-dirs --transfers=20 --copy-links --bwlimit 10M --progress --ignore-existing
> vi /etc/crontab
@reboot root /home/_script/rclone_gdrive.sh