Duplicity یک ابزار کامندلاینی است که به زبان پایتون نوشته شده است و والیوم‌های tar رمزگذاری شده را برای ذخیره‌سازی در یک مخزن محلی یا remote تولید می‌کند. از GNU Privacy Guard (GPG) برای رمزگذاری و امضای آرشیوهای خود و الگوریتم rsync برای ایجاد پشتیبان‌های افزایشی و کارآمد استفاده می‌کند. بکاپ‌ها را می‌توان به مخازن مختلفی از جمله ذخیره‌سازی فایل محلی، سرورهای SFTP یا FTP و ذخیره‌های شی سازگار با S3 منتقل کرد.

در این آموزش، Duplicity را نصب می‌کنیم و به نحوه پشتیبان‌گیری از داده‌های پروژه در فضای ابری آروان می‌پردازیم. ما برای این منظور یک صندوقچه ایجاد خواهیم کرد و نحوه پشتیبان‌گیری دستی از داده‌ها در آن را پوشش خواهیم داد. در نهایت، با ایجاد یک اسکریپت که برنامه‌های بکاپ کامل هفتگی و افزایشی را تنظیم می‌کند، این فرآیند را خودکار می‌کنیم.

پیش‌نیازها

برای این آموزش شما به موارد زیر نیاز دارید:

  • یک سرور Ubuntu
  • یک صندوقچه در فضای ابری آروان به همراه اطلاعات موجود در پیشخان پنل کاربری:
    • Secret Key
    • Access Key
    • Endpoint URL
    • نام باکت

نصب Duplicity

برای دریافت نسخه به‌روز Duplicity، می‌توانیم آن را از نسخه‌های Personal Package Archive Duplicity (PPA) نصب کنیم:

sudo apt-add-repository ppa:duplicity-team/ppa

هم‌چنین بسته python-boto را نصب خواهیم کرد تا به Boto دسترسی داشته باشیم. Boto یک بسته Python است که رابط هایی را برای خدمات وب آمازون ارائه می‌دهد. این به ما کمک می‌کند از قابلیت ارتباط  فضای ابری آروان با APIهای  AWS S3استفاده کنیم. ما python-boto را از مخازن رسمی اوبونتو نصب خواهیم کرد. اگر ترجیح می‌دهید از Boto3 استفاده کنید، می‌توانید آن را از منبع نصب کنید.

علاوه بر python-boto ،haveged را نیز نصب خواهیم کرد، ابزاری که به ما کمک می‌کند آنتروپی لازم برای ایجاد کلیدهای GPG را ایجاد کنیم. برای ایجاد این کلیدها، GPG از سطح آنتروپی یا غیرقابل پیش بینی بودن سیستم ما استفاده می‌کند. نصب haveged به ما کمک می‌کند تا روند ایجاد کلید را تسریع کنیم.

قبل از نصب این بسته ها، فهرست مخازن محلی را به روز کنید:

sudo apt-get update

سپس duplicity ،python-boto و haveged را با وارد کردن دستور زیر نصب کنید:

apt install -y python3-boto python3-pip haveged gettext librsync-dev
wget https://gitlab.com/duplicity/duplicity//archive/rel.0.8.23/duplicity-rel.0.8.23.tar.gz
tar xaf duplicity-rel.0.8.23.tar.gz
/cd duplicity-rel.0.8.23
pip3 install -r requirements.txt
python3 setup.py install

ایجاد یک دایرکتوری برای بکاپ

برای بررسی نحوه عملکرد فرآیند بکاپ، در دایرکتوری home کاربری غیر از  root یک دایرکتوری برای بکاپ‌های خود و داده‌های نمونه ایجاد می‌کنیم. ما دایرکتوری خود را test_backups صدا خواهیم کرد:

mkdir ~/test_backups

سپس یک نمونه فایل به نام smaple.txt ایجاد کنید:

echo " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam porta lacinia risus, ut ultrices nulla suscipit at. Nunc quis egestas metus, in ultrices urna." >> ~/test_backups/sample.txt

در مرحله‌ی بعد لازم است تا یک کلید GPG بسازیم.

ایجاد کلید GPG

در مرحله بعد، یک جفت کلید GPG برای کاربر خود ایجاد می‌کنیم. برای اطمینان از انتقال ایمن اطلاعات، GPG از رمزگذاری کلید عمومی استفاده می‌کند. معنی این موضوع در زمینه ما این است که داده ها در کلید عمومی ما رمزگذاری شده و به مخزن ما ارسال می‌شود.

کلیدهای ما در حساب کاربری ما در دایرکتوری به نام ~/.gnupg ذخیره می‌شوند که با تولید کلیدها ایجاد می‌شود. هنگامی که از دستور duplicity استفاده می‌کنیم، یک شناسه کلید عمومی را مشخص می‌کنیم که به جفت کلید ما اشاره می‌کند. استفاده از این شناسه رمزگذاری داده ها و امضایی را فعال می‌کند که مالکیت ما بر کلید خصوصی را تأیید می‌کند. داده های رمزگذاری شده به مخزن ما منتقل می‌شود. این کار از داده های ما محافظت می‌کند، که کاربر ما می‌تواند در هر زمانی که بخواهد با کلید خصوصی آنها را به طور کامل بازیابی کند.

GPG باید به طور پیش فرض روی سرور ما نصب شود. برای تست این، تایپ کنید:

gpg –version

هنگامی که بررسی کردید که GPG نصب شده است، می‌توانید یک جفت کلید به شکل زیر ایجاد کنید:

gpg --gen-key

برای پیکربندی کلیدها از شما تعدادی سوال پرسیده می‌شود:

  • Type of Key (نوع کلید): (1) RSA و RSA (پیش‌فرض) را انتخاب کنید.
  • Size of Key (اندازه کلید): با فشار دادن ENTER اندازه پیش فرض 2048 بیت تایید می‌شود.
  • Key Expiration Date (تاریخ انقضای کلید): با وارد کردن 1y کلیدی ایجاد می‌کنیم که پس از یک سال منقضی می‌شود.
  • انتخاب های خود را با وارد کردن y تایید کنید
  • ID/Real Name (شناسه کاربری/نام واقعی): اسم خود را وارد کنید
  • Email Address (آدرس ایمیل): آدرس ایمیل خود را وارد کنید.
  • Comment (توضیحات): در این‌جا می‌توانید یک توضیح اختیاری وارد کنید که با امضای شما قابل مشاهده خواهد بود.
  • a(N)me ،©omment ،(E)mail تغییر داده شود یا k(O)ay/(Q)uit خارج می‌شوید؟ O را تایپ کنید.
  • Enter Passphrase: از شما خواسته می‌شود که یک عبارت عبور یا passphrase را در اینجا وارد کنید. حتما به این عبارت توجه کنید. ما در ادامه این آموزش به عنوانPassphrase GPG به آن اشاره خواهیم کرد.

پس از پایان مراحل، کلید تولید شده را که ممکن است ۸، ۱۶ یا ۴۰ کاراکتر باشد کپی کنید. هم‌چنین می‌توانید با دستور زیر اطلاعات کلید خود را مشاهده کنید.

gpg --list-keys

اتصال Duplicity به فضای ابری

زمانی‌ که همه‌ چیز نصب و آماده شد، می‌توانیم ارتباط بین سرور و فضای ابری را پیکربندی کنیم.

ویرایش پیکربندی

  1. در مرحله اول فایل های اسکریپت و لاگ را با مجوزهای لازم به شکل زیر ایجاد کنید:
touch Arvan-backups.sh Arvan-restore.sh .Arvan-configrc

chmod 700 Arvan-backups.sh Arvan-restore.sh

chmod 600 .Arvan-configrc



mkdir -p /var/log/duplicity

touch /var/log/duplicity/logfile{.log,-recent.log}
  1. به فایل .Arvan-configrc خط‌های زیر را اضافه کنید. مقادیر اعتبارسنجی را با اطلاعات مربوط به حساب خود جایگزین کنید.
"<export AWS_ACCESS_KEY_ID="<ArvanStorage ACCESS KEY
"<export AWS_SECRET_ACCESS_KEY="<ArvanStorage SECRET ACCESS KEY

"<export Arvan_REGION="<REGION OF YOUR BUCKET
"export Arvan_ENDPOINT_URL="https://s3.${Arvan_REGION}.arvanstorage.ir

set Arvan_BUCKET as follows for duplicity < 0.8.23 #

for higher versions, see below #

"<export Arvan_BUCKET="s3://s3.${Arvan_REGION}.arvanstorage.ir/<NAME OF YOUR BUCKET #

set the next two variables for duplicity >= 0.8.23 #

it uses the boto3 library, which uses a different naming scheme for bucket names #

 

"<export Arvan_BUCKET="s3://<NAME OF YOUR BUCKET

GPG Key information #

 

"<export PASSPHRASE="<YOUR GPG KEY PASSPHRASE
"<export GPG_FINGERPRINT="<YOUR GPG KEY FINGERPRINT


Folder to backup #

 

"<export SOURCE="<PATH TO FOLDER TO BACKUP


Will keep backup up to 1 month #

 

"export KEEP_BACKUP_TIME="1M


Will make a full backup every 10 days #

 

"export FULL_BACKUP_TIME="10D

# Log files

"export LOGFILE_RECENT="/var/log/duplicity/logfile-recent.log

"export LOGFILE="/var/log/duplicity/logfile.log

} () log
      `date=`date +%Y-%m-%d
      `hour=`date +%H:%M:%S
echo "$date $hour $*" >> ${LOGFILE_RECENT}
{
export -f log

تنظیمات بالا هر ۱۰ روز یک بکاپ می‌گیرد و همه‌ی بکاپ‌ها که عمری بیش‌تر از یک ماه داشته باشند را حذف می‌کند.

اسکریپت بکاپ

به کمک اسکریپت زیر می‌توانید فرآیند پشتیبان‌گیری را با استفاده از Duplicity به شکل خودکار انجام دهید:

  1. مقادیر زیر را در فایل Arvan-backups.sh ذخیره کنید:
  /bin/bash!#

    source <FULL PATH TO>/. Arvan-configrc

    currently_backing_up=$(ps -ef | grep duplicity | grep python | wc -l)




    if [ $currently_backing_up -eq 0 ]; then

       Clear the recent log file #

      cat /dev/null > ${LOGFILE_RECENT}




      log ">>> removing old backups"

       \ duplicity remove-older-than 

       \ --s3-endpoint-url ${Arvan_ENDPOINT_URL}

       \ --s3-region-name ${ Arvan_REGION}

   $1<2 {LOGFILE_RECENT} $ << { Arvan_BUCKET} $ {KEEP_BACKUP_TIME}$

      duplicity >= 0.8.23 #

      determine S3_ENDPOINT_URL for Arvanstorage #

      "S3_ENDPOINT_URL="https://s3.${S3_REGION_NAME}.arvanstorage.ir




      "log ">>> creating and uploading backup to Arvanstorage

      \duplicity incr --full-if-older-than ${FULL_BACKUP_TIME} 

      \asynchronous-upload-- 

      \s3-endpoint-url ${ Arvan_ENDPOINT_URL}-- 

      \s3-region-name ${ Arvan_REGION}-- 

      \encrypt-key=${GPG_FINGERPRINT}-- 

      \sign-key=${GPG_FINGERPRINT}-- 

     1$<2 {LOGFILE_RECENT}$ << {Arvan_BUCKET}${SOURCE}$
      cat ${LOGFILE_RECENT} >> ${LOGFILE}

    fi
  1. یک بار اسکریپت را اجرا کنید تا از صحت آن مطمین شوید. صندوقچه‌ی خود را چک کنید که فایل بکاپ موجود باشد و همینطور لاگ مربوطه در فایل درج شده باشد.
cat /var/log/duplicity/logfile-recent.log

اسکریپت بازیابی دیتا

به کمک Duplicity می‌توانید داده‌های بکاپ‌تان را هم بازیابی کنید. در این بخش یک اسکریپت برای آسان‌تر کردن این فرآیند ایجاد می‌کنیم.

  1. مقادیر زیر را در فایل Arvan-restore.sh ذخیره نمایید:
    bin/bash/!#
    source <FULL PATH TO>/.Arvan-configrc

    if [ $# -lt 2 ]; then
      <echo -e "Usage $0 <time or delta> [file to restore] <restore to
  :Exemple
  t$ $0 2018-7-21 recovery/  ## recovers * from closest backup to date\
  ;"'t$ $0 0D secret data/  ## recovers most recent file nammed 'secret\
    exit; fi

    if [ $# -eq 2 ]; then
      \duplicity 
      \s3-endpoint-url ${Arvan_ENDPOINT_URL}-- 
      \s3-region-name ${Arvan _REGION}-- 
      \time $1-- 
      $2 {Arvan_BUCKET}$ 
    fi

    if [ $# -eq 3 ]; then
        \duplicity 
        \s3-endpoint-url ${Arvan_ENDPOINT_URL}-- 
        \s3-region-name ${Arvan_REGION}-- 
        \time $1--
        \file-to-restore $2-- 
        $3 {Arvan_BUCKET}$ 
    fi
  1. برای بازیابی داده های آپلود شده در قسمت قبل، می‌توانید از این دستور استفاده کنید:
/Arvan-restore.sh 0D /tmp/backup-recovery-test/.

هم‌چنین برای بازیابی یک فایل مشخص از ۵ روز پیش می‌توانید از دستور زیر استفاده کنید:

/Arvan-restore.sh 5D <file> /tmp/backup-recovery-test/.

پشتیبان‌گیری خودکار

با استفاده از سرویس crontab میتوانید برنامه ریزی کنید تا در زمان های دلخواه اسکریپت پشتیبان‌گیری اجرا شود. با استفاده از دستور cronetab -e فایل پیکربندی سرویس cron را مطابق دستورهای زیر ویرایش کنید. در این مثال اسکریپت روزی دو بار در ساعات ۳:۰۰ و ۱۵:۰۰ اجرا می‌شود.

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SHELL=/bin/bash
3,15 00 * * * 
FULL PATH TO>/Arvan-backups.sh > /dev/null 2>&1>