Rclone ile Otomatik Server Yedeklemesi

Bu yazımızda Rclone aracını kullanarak, server üzerinde otomatik nasıl yedek alınabileceğini inceleyeceğiz.

Rclone

Rclone, bir çok bulut hizmet sağlayıcıyı destekleyen ve komut satırı üzerinden bu servislere otomatik senkronizasyon yapabilen, açık kaynak kodlu bir programdır. Desteklediği 43 bulut hizmetinin tam listesine, buradan ulaşabilirsiniz.

Bu yazımızda, Yandex Disk üzerinden edindiğimiz bulut hizmetini kullanarak, Debian temelli sunucumuz üzerinde Rclone ayarımızı yapacak, otomatik yedekleme scriptimizi yazacak ve cronjob ile bu script dosyamızın belli aralıklarla çalışıp yedek almasını sağlayacağız.

Öncelikle aşağıdaki komutu kullanarak Rclone uygulamasını sunucumuza kuralım.

╰─λ curl https://rclone.org/install.sh | sudo bash

Rclone Config Dosyasının Oluşturulması

Rclone uygulamasının ayarlamarını yapabilmek için basitçe konsol üzerinden aşağıdaki komutu çalıştırmamız yeterlidir:

╰─λ rclone config

Yukarıdaki komutu çalıştırdığımızda, configuration dosyasını oluşturmak için bizden bazı bilgiler isteyecektir:

╰─λ rclone config
2019/10/19 17:20:24 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found - make a new one
n) New remote
s) Set configuration password
q) Quit config
n/s/q> n
name> yandex-yedek

Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
...
29 / Yandex Disk
   \ "yandex"
...

Storage> yandex
** See help for yandex backend at: https://rclone.org/yandex/ **

Yandex Client Id
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_id>

Yandex Client Secret
Leave blank normally.
Enter a string value. Press Enter for the default ("").
client_secret>
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
Use auto config?
 * Say Y if not sure
 * Say N if you are working on a remote or headless machine
y) Yes
n) No
y/n> n

For this to work, you will need rclone available on a machine that has a web browser available.
Execute the following on your machine (same rclone version recommended) :
        rclone authorize "yandex"
Then paste the result below:
result>
╰─λ rclone authorize "yandex"
If your browser doesn't open automatically go to the following link: http://127.0.0.1:53682/auth?state=02dc361939035fac2dfdbdb2ab87419c
Log in and authorize rclone for access
Waiting for code...
Got code
Paste the following into your remote machine --->
{"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","refresh_token":"xxxxxxxxxxx","expiry":"2020-10-18T18:44:31.6284049+03:00"}
<---End paste
result> {"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","refresh_token":"xxxxxxxxxxx","expiry":"2020-10-18T18:44:31.6284049+03:00"}

--------------------
[yandex-yedek]
type = yandex
token = {"access_token":"xxxxxxxxxxxxxxx","token_type":"bearer","refresh_token":"xxxxxxxxxxx","expiry":"2020-10-18T18:44:31.6284049+03:00"}
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote

y/e/d> y

Current remotes:

Name                 Type
====                 ====
yandex               yandex

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q
╰─λ rclone about yandex-yedek:
2019/10/19 17:53:09 Automatically upgraded OAuth config.
Total:   20G
Used:    0
Free:    20G

Rclone ile yapılabilecek tüm işlemlerin listesine buradan ulaşabilirsiniz.

Yedekleme Script Dosyasının Yazılması

Otomatik yedek alma işlemlerini yapması için sistemimizde bir script dosyası oluşturmamız gerekmektedir. Bu dosya çalıştırıldığında yapmasını istediğimiz temel işlemler şunlardır:

Yedek almayı istediğimiz dizinin yolunu /important_files, yedek alacağımız dizinin yolunun da /backup olduğunu varsayarsak, script dosyamızın içeriği şöyle olacaktır:

╰─λ vi /auto-backup.sh
#!/bin/sh

BACKUP_PATH="/backup"
FILES_PATH="/important_files"
EXCLUDE_DIRECTORY_COUNT=2

# SON İKİ YEDEK DOSYASINI TUTUP DİĞERLERİNİ SİL
TOTAL_DIRECTORY_COUNT=`ls $BACKUP_PATH | wc -l`
if [ $TOTAL_DIRECTORY_COUNT -gt $EXCLUDE_DIRECTORY_COUNT ]
then
    INCLUDE_DIRECTORY_COUNT=$(( $TOTAL_DIRECTORY_COUNT - $EXCLUDE_DIRECTORY_COUNT ))
    ls $BACKUP_PATH | sort -nr | tail -n $INCLUDE_DIRECTORY_COUNT | xargs -i rm -rf $BACKUP_PATH/{}
fi

# YEDEK ALINACAK DOSYALARI SIKIŞTIRIP YEDEKLE
CURRENT_DATE=`date +%F__%H-%M-%S`
mkdir $BACKUP_PATH/$CURRENT_DATE
zip -s 200m -r $BACKUP_PATH/$CURRENT_DATE/backup.zip $FILES_PATH

# DOSYALARI BULUT İLE EŞİTLE
rclone sync -P $BACKUP_PATH yandex-yedek:backup

# YANDEX ÇÖP KUTUSUNU BOŞALT
rclone cleanup yandex-yedek:

Dosyayı kaydedip çıktıktan sonra, dosyaya çalıştırma izni tanımlıyoruz.

╰─λ chmod a+x /auto-backup.sh

Yukarıdaki script dosyası çalıştırıldığında, /backup dizini içinde daha önceden oluşturulmuş yedek dizinlerinden en son alınan 2 tanesi hariç kalanları silecektir. Daha sonrasında 2019-10-07__23-00-00 formatında, o anki tarih ve saate göre bir dizin oluşturup içine yedekleme yapacaktır. Zip komutu çalıştırıldığında istenilirse yukarıdaki gibi -s parametresiyle sıkıştırma işlemi verilen limite göre birden fazla dosyaya ayrılabilir.

NOT : Eğer dosyaların boyutu çok büyükse (>500mb) Rclone için timeout süresi arttırılmalıdır.

Script dosyası çalıştırıldıktan sonra, yedek dosyaları /backup dizini içinde oluşturulacak ve yedeklemesi yapılacaktır. /backup dizininin ağaç görünümü de aşağıdaki gibi olacaktır.

╰─λ tree /backup
/backup
├── 2019-10-08__00-40-20
│   ├── backup.z01
│   └── backup.zip

Eğer yedeklerin dizin içinde parçalı zip halinde değil de, tek bir zip dosyası halinde yedeklenmesini istiyorsak, script dosyamızı aşağıdaki gibi değiştirebiliriz.

#!/bin/sh

BACKUP_PATH="/backup"
FILES_PATH="/important_files"
EXCLUDE_DIRECTORY_COUNT=2

# SON İKİ YEDEK DOSYASINI TUTUP DİĞERLERİNİ SİL
TOTAL_DIRECTORY_COUNT=`ls $BACKUP_PATH | wc -l`
if [ $TOTAL_DIRECTORY_COUNT -gt $EXCLUDE_DIRECTORY_COUNT ]
then
    INCLUDE_DIRECTORY_COUNT=$(( $TOTAL_DIRECTORY_COUNT - $EXCLUDE_DIRECTORY_COUNT ))
    ls $BACKUP_PATH | sort -nr | tail -n $INCLUDE_DIRECTORY_COUNT | xargs -i rm -rf $BACKUP_PATH/{}
fi

# YEDEK ALINACAK DOSYALARI SIKIŞTIRIP YEDEKLE
CURRENT_DATE=`date +%F__%H-%M-%S`
zip -r $BACKUP_PATH/$CURRENT_DATE.zip $FILES_PATH

# DOSYALARI BULUT İLE EŞİTLE
rclone sync -P $BACKUP_PATH yandex-yedek:backup

# YANDEX ÇÖP KUTUSUNU BOŞALT
rclone cleanup yandex-yedek:

Bu şekilde alınan yedek dosyalarının ağaç görünümü de aşağıdaki gibi olacaktır:

/backup
├── 2019-10-09__16-19-56.zip
└── 2019-10-09__16-21-20.zip

Otomatik Yedekleme İçin Cron Job Ayarlaması

Linux sistemimizde, biraz önce oluşturduğumuz script dosyasının düzenli araklıklarla otomatik olarak çalışmasını ve yedek almasını istiyorsak, bu script dosyasını cron job olarak tanımlamamız gerekmektedir. Cron job tanımlamak için basit olarak aşağıdaki komut yazılabilir:

╰─λ crontab -e

Eğer script dosyamızın her gün saat 01:00’de çalışmasını istiyorsak, açılan dosyanın en altına şu satırı ekleyebiliriz:

0 1 * * * /auto-backup.sh

Farklı zaman ayarlamaları için şu linkten cron job zaman ayarlamalarının nasıl yapılacağı ile ilgili bilgi edinebilirsiniz.

Kaynaklar