서버 백업 (linux server -> MS OneDrive , GoogleDrive)

서버 자료의 보험은 복구 가능한 데이터 백업인데, 단계적으로 서버의 여유 공간이나 블록 스토리지 또는 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