چگونه از ابزارهای Duplicity و GPG برای خودکارسازی بکاپها در اوبونتو استفاده کنیم؟
۲۱ اسفند ۱۴۰۳
مقدمه
ابزار Duplicity یک برنامه پشتیبانگیری محلی و آنلاین است که با استفاده از آن میتوانید تعدادی از پروتکلهای انتقال و راهحلهای ذخیرهسازی شخص ثالث را پیادهسازی کنید.
در این آموزش، نحوه نصب Duplicity روی سرور مجازی اوبونتو را بررسی خواهیم کرد. برنامه را از مخزن اوبونتو نصب کرده و سپس آن را برای استفاده از رمزگذاری GPG پیکربندی خواهیم کرد.
قبل از شروع این آموزش، مطمئن شوید که این موارد را در اختیار دارید:
- سرور مجازی با سیستمعامل اوبونتو همراه با یک کاربر غیر روت (non-root) که دسترسی sudo دارد و همچنین شامل یک فایروال فعال است. برای راهاندازی اولیه سرور و پیکربندی این موارد، راهنمای نحوه راهاندازی اولیه سرور مجازی با اوبونتو را دنبال کنید.
- یک سرور مجازی لینوکس که از طریق SSH قابل دسترسی باشد.
در ادامه بخوانید:
- نصب ابزار Duplicity از مخزن
- ایجاد کلیدهای SSH و GPG
- نحوه استفاده از Duplicity
- خودکارسازی بکاپها
- جمعبندی
- سوالات متداول
نصب ابزار Duplicity از مخزن
نصب پکیجهای پیشنیاز
در شروع کار، قبل از دانلود بستهها، باید مخازن اوبونتو را برای گرفتن آپدیتهای جدید بروزرسانی کرده، بعد از آن بستههای مورد نظر را نصب کنید:
sudo apt update
sudo apt install -y python3-pip python3-setuptools librsync-dev gpg
دستور بالا تعدادی از بستههای مختلف را نصب میکند که برای انتقال دادهها به سرور ریموت بهکار میروند.
دانلود و نصب Duplicity از مخزن
برای دانلود به پوشه /usr/local/src/
بروید و آخرین نسخه Duplicity را از مخزن رسمی موجود در GitHub دانلود کنید:
cd /usr/local/src/
wget https://github.com/duplicity/duplicity/releases/latest/download/duplicity-latest.tar.gz
پس از دانلود، فایل را از حالت فشرده خارج کنید و وارد دایرکتوری آن شوید:
tar -xvzf duplicity-latest.tar.gz
cd duplicity-*
حالا آماده نصب برنامه هستید، برای نصب دستور زیر را اجرا کنید:
sudo python3 setup.py install
در آخر، برای اطمینان از اینکه نصب موفق بوده است، این دستور را اجرا کنید:
duplicity --version
اگر در خروجی نسخه Duplicity را نشان داد، یعنی برنامه به درستی نصب شده است.

ایجاد کلیدهای SSH و GPG
برای پیکربندی Duplicity، از دو نوع کلید استفاده میکنیم که تعادلی بین امنیت و راحتی ایجاد میکنند. برای احراز هویت ایمن در سرور راه دور، از کلیدهای SSH استفاده میکنیم تا نیازی به وارد کردن رمز عبور نباشد. همچنین، قبل از انتقال دادهها به محل پشتیبانگیری، آنها را با استفاده از GPG رمزگذاری میکنیم.
ایجاد کلیدهای SSH
اگر هنوز رمز عبور برای کاربر root
در سرور تنظیم نکردهاید، ابتدا وارد سرور شوید (از طریق SSH یا کنسول) و دستور زیر را برای تنظیم رمز عبور وارد کنید:
sudo passwd
در سرور اصلی که Duplicity نصب شده است، با دستور زیر یک جفت کلید SSH ایجاد کنید:
ssh-keygen -t rsa
هنگام ایجاد کلید،Enter
بزنید تا یک کلید SSH بدون رمز عبور با تنظیمات پیشفرض ایجاد شود. سپس با دستور زیر، کلید SSH را به سروری که قرار است بکاپها را در آن ذخیره شوند، ارسال کنید:
ssh-copy-id root@backupHost
برای تایید،yes
را بزنید، سپس رمز عبور کاربرroot
، سرور مقصد را وارد کنید تا کلید عمومی شما ارسال شود.
برای بررسی اینکه آیا اکنون میتوانید از سرور Duplicity خود بدون وارد کردن رمز عبور وارد سرور مقصد شوید، دستور زیر را وارد بزنید:
ssh root@backupHost
حالا باید بدون نیاز به وارد کردن هرگونه اطلاعات اضافی وارد سیستم شوید.
در حالی که از طریق SSH وارد شدهاید، دایرکتوری برای فایلهای بکاپ، ایجاد کنید:
mkdir -p /remotebackup/duplicityDroplet
اکنون شما میتوانید نام دایرکتوری را هرطور که میخواهید انتخاب کنید، اما آن را به خاطر بسپارید تا بتوانید در مراحل بعدی از آن استفاده کنید.
وقتی کار تمام شد، از سرور مقصد خارج شده و به سرور اصلی Duplicity بازگردید:
exit
ایجاد کلیدهای GPG
بهتر است برای امنیت بیشتر و رمزگذاری از GPG استفاده کنید. با دستور زیر، کلیدها را در یک دایرکتوری مخفی در مسیر /root/.gnupg/
ذخیره کنید:
gpg --gen-key
پس از اجرای این دستور از شما یکسری سوالات پرسیده میشود که پارامترهای جفت کلید را تنظیم میکنند:
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Is this correct? (y/N) y
اکنون برای قبول کردن کلیدهای پیشفرض RSA کلید Enter
را بفشارید. مجددا دو بارEnter
بزنید تا اندازه کلید پیشفرض و نداشتن تاریخ انقضای آن را بپذیرید.
در آخر برای تایید پارامترها، حرف y
را تایپ کنید.
در مرحله بعد، طبق کد زیر، نام، آدرس ایمیل و در صورت تمایل، یک توضیح که میخواهید با این کلید مرتبط شود را وارد کنید. برای تایید اطلاعات خود، حرف O
را تایپ کنید.
You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
Real name: Your Name
Email address: your_email@example.com
Comment:
You selected this USER-ID:
"Your Name <your_email@example.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
سپس، در بخش زیر یک پسورد برای استفاده با GPG تنظیم کنید. برخلاف کلیدهای SSH که در آنها از پسورد استفاده نکردید تا Duplicity بتواند در پسزمینه فعال بماند، در این مرحله باید یک پسورد وارد کنید تا رمزگذاری و رمزگشایی امن دادههای شما انجام شود.
Enter passphrase:
Repeat passphrase:
حالا در این مرحله، از شما خواسته میشود که انتروپی تولید کنید. انتروپی به طور کلی معیاری برای میزان غیرقابل پیشبینی بودن یک سیستم است. سرور مجازی شما برای ایجاد یک کلید تصادفی واقعی به انتروپی نیاز دارد.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)
در نهایت، زمانی که اطلاعات تصادفی کافی تولید کردید، کلید شما مانند زیر ایجاد خواهد شد:
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 05AB3DF5 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 2048R/05AB3DF5 2013-09-19
Key fingerprint = AF21 2669 07F7 ADDE 4ECF 2A33 A57F 6998 05AB 3DF5
uid Your Name <your_email@example.com>
sub 2048R/32866E3B 2013-09-19
قسمت هایلایت شده در خروجی بالا، شناسه کلید عمومی شما است.به این شناسه در مراحل بعدی برای رمزگذاری دادههایی که قرار است منتقل کنید، نیاز خواهید داشت. اگر فراموش کردید که شناسه کلید عمومی خود را یادداشت کنید، میتوانید با دستور زیر دوباره آن را بدست آورید:
gpg --list-keys
خروجی نمونه:
/root/.gnupg/pubring.gpg
------------------------
pub 2048R/05AB3DF5 2013-09-19
uid Your Name <your_email@example.com>
sub 2048R/32866E3B 2013-09-19
حالا بعد از ایجاد کلیدهای SSH و GPG تمام اجزای لازم برای پشتیبانگیری امن با استفاده از Duplicity آماده است.
نحوه استفاده از Duplicity
اجرای تست اولیه
برای شروع، یک تست از سیستم Duplicity خود انجام میدهیم. در این تست، یک پوشه با فایلهای آزمایشی میسازیم تا آنها را پشتیبانگیری کنیم. دستورات زیر را وارد کنید:
cd ~
mkdir test
touch test/file{1..100}
این دستورات یک پوشه به نام test
در دایرکتوری root
ایجاد میکنند و سپس 100 فایل با شمارههای 1 تا 100 در آن قرار میدهند.
ابتدا با دستور زیر فایلها را به سرور ریموت منتقل کنید، بدون استفاده از کلید GPG که قبلاً ایجاد کردید. برای این کار از پروتکل امن sftp
استفاده کنید که بخشی از SSH است و عملکرد FTP
را شبیهسازی میکند.
duplicity /root/test sftp://root@backupHost//remotebackup/duplicityDroplet
توجه داشته باشید که بین سرور ریموت و مسیر فایل دو اسلش (//)
وجود دارد.

در این مرحله از شما خواسته میشود که سرور ریموت را تائید کنید و سپس یک کلید برای رمزگذاری دادهها ایجاد و تأیید کنید. همانطور که میبینید، GPG همچنان برای رمزگذاری استفاده میشود، مگر اینکه به طور خاص بگوییم که از آن استفاده نشود. تفاوت فقط این است که ما از کلیدهای خودمان استفاده نخواهیم کرد و میتوانیم هر پسوردی را در اینجا وارد کنیم.
Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
The authenticity of host '162.243.2.14' can't be established.
SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
Are you sure you want to continue connecting (yes/no)? yes
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase:
Retype passphrase to confirm:
پس از تائید، بکاپگیری انجام میشود و بعد از اتمام فرایند، اطلاعات زیر به شما نمایش داده میشود:
No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
ElapsedTime 0.11 (0.11 seconds)
SourceFiles 101
SourceFileSize 4096 (4.00 KB)
NewFiles 101
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 101
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 1022 (1022 bytes)
Errors 0
-------------------------------------------------
اگر از طریق SSH وارد سرور ریموت شوید، میبینید که بکاپگیری با موفقیت کامل شده است:
ssh root@backupHost
cd /remotebackup/duplicityDroplet
ls
duplicity-full.20130919T181705Z.manifest.gpg
duplicity-full.20130919T181705Z.vol1.difftar.gpg
duplicity-full-signatures.20130919T181705Z.sigtar.gpg
همانطور که میبینید این فایلها حاوی اطلاعات بکاپگیری هستند. از آنجا که این مورد تستی بود، میتوانید آنها را با اجرای دستور زیر حذف کنید:
rm duplicity*
حالا، برای بازگشت به duplicity
دستور زیر را اجرا کنید:
exit
در آخر میتوانید دایرکتوری تست و تمامی محتویات آن را با دستور زیر حذف کنید:
rm -r /root/test
ایجاد اولین بکاپ
پس از تست اولیه، حالا میتوانید بکاپ واقعی خود را با دستور زیر ایجاد کنید:
duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityDroplet
ما قصد داریم در این آموزش کل دایرکتوری root
خود را بکاپگیری کنیم، به جز دایرکتوریهای /proc، /sys
و /tmp.
از کلید GPG که ایجاد کردیم استفاده خواهیم کرد. این کار را با مشخص کردن شناسه کلید در دستور و وارد کردن پسورد در ابتدای دستور انجام میدهیم:
PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
اجرای دستور بالا ممکن است کمی طول بکشد، زیرا اولین بار است که بکاپگیری را اجرا میکنیم، دستورduplicity
یک بکاپ کامل ایجاد خواهد کرد. duplicity
دادهها را به قطعات کوچک تقسیم میکند تا انتقال فایلها سادهتر شود.
خروجی نمونه:
--------------[ Backup Statistics ]--------------
StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
ElapsedTime 185.38 (3 minutes 5.38 seconds)
SourceFiles 33123
SourceFileSize 813465245 (776 MB)
NewFiles 33123
NewFileSize 813464221 (776 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 33123
RawDeltaSize 802133584 (765 MB)
TotalDestinationSizeChange 369163424 (352 MB)
Errors 0
-------------------------------------------------
در نهایت، در یک سرور جدید، این پیکربندی، 15بخش (یا حجم) ایجاد کرد که به سرور ریموت منتقل شدند.
از آنجایی که حالا یک بکاپ کامل روی سرور ریموت داریم، بکاپ بعدی به طور خودکار یک بکاپ افزایشی خواهد بود. این نوع بکاپها سریعتر هستند و نیاز به انتقال داده کمتری دارند. اجرای اولین بکاپ بیش از سه دقیقه طول کشید، در حالی که بکاپ افزایشی طبق خروجی زیر کمتر از هشت ثانیه زمان برد.
--------------[ Backup Statistics ]--------------
StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
ElapsedTime 7.57 (7.57 seconds)
SourceFiles 33128
SourceFileSize 820560987 (783 MB)
NewFiles 11
NewFileSize 12217723 (11.7 MB)
DeletedFiles 3
ChangedFiles 1
ChangedFileSize 600 (600 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15
RawDeltaSize 12197851 (11.6 MB)
TotalDestinationSizeChange 12201207 (11.6 MB)
Errors 0
-------------------------------------------------
برای اجباری کردن یک بکاپ کامل دیگر، میتوانید دستورfull
را قبل از هر گزینهای به دستور duplicity
اضافه کنید:
PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
بازیابی بکاپ
تا اینجای آموزش دیدید که Duplicity بازیابی دادهها را آسان کرده است. شما میتوانید با تغییر مکانهای مبدا و مقصد (یعنی جابجا کردن مسیرهای مربوط به سرور راه دور و سیستم محلی)، دادهها را بازیابی کنید. به این صورت که مسیر ذخیرهسازی دادههای بکاپ و مسیر مقصد برای بازگرداندن اطلاعات را معکوس کنید.
برای بازیابی نیازی به گزینه encrypt-key
ندارید زیرا فقط دادهها را رمزگشایی میکنید. همچنین نیازی به پارامترهای exclude
ندارید چون این دادهها اصلاً در بکاپ گنجانده نشدهاند.
برای مثال، اگر بخواهید دادههایی که به تازگی بکاپگیری کردهاید را به طور کامل بازیابی کنید، از دستور زیر استفاده کنید:
PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityDroplet /
یک گزینه امنتر این است که فقط فایلها یا دایرکتوریهایی که به آنها نیاز دارید را بازیابی کنید. برای این کار میتوانید مانند کد زیر گزینهای به دستور بالا اضافه کنید:
PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityDroplet /path/to/restore/file
در نهایت مطمئن شوید که قابلیت بازیابی را بهدرستی آزمایش کردهاید تا در مواقع بحرانی با مشکل مواجه نشوید.
خودکارسازی بکاپها
ایجاد یک فایل پسورد
در این مرحله یک فایل امن ایجاد کنید که رمزعبور GPG را در آن ذخیره کنید، تا دیگر لازم نباشد آن را بهطور مستقیم در اسکریپت خودکارسازی وارد کنید.
برایاینکار به دایرکتوری root
بروید و یک فایل مخفی جدید با ویرایشگر متنیnano
ایجاد کنید:
cd /root
nano .passphrase
حالا تنها چیزی که باید در این فایل وارد کنید، رمز عبور است که قبلاً برای دستوراتduplicity
خود از آن استفاده میکردید.
PASSPHRASE="passphrase_for_GPG"
فایل را ذخیره کرده و ببندید.
برای اینکه این فایل فقط توسط کاربر root
قابل خواندن باشد، دستور زیر را اجرا کنید:
chmod 700 /root/.passphrase
تنظیم بکاپگیری افزایشی روزانه
برای تنظیم این نوع بکاپ با استفاده از Duplicity، ابتدا باید اسکریپت بکاپ را در پوشهای که اسکریپتهای روزانه را اجرا میکند، قرار دهید. اسکریپتهای موجود در پوشه /etc/cron.daily
هر روز یکبار اجرا میشوند، بنابراین این بهترین مکان برای ایجاد اسکریپت بکاپ شماست.
برای این کار، به پوشه /etc/cron.daily
بروید و یک فایل به نام duplicity.inc
بسازید:
cd /etc/cron.daily
nano duplicity.inc
حالا برای تنظیم بکاپگیری افزایشی روزانه، باید اسکریپت زیر را در فایل duplicity.inc
کپی کنید. دستور duplicity
را با دستور مورد نظر خود برای بکاپگیری سیستم جایگزین کنید:
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
فایل را ذخیره کرده و ببندید.
اکنون برای اجرای اسکریپت، دستور زیر را وارد کنید:
chmod 755 duplicity.inc
برای تست اسکریپت، دستور زیر را بزنید:
./duplicity.inc
پس از اجرای اسکریپت نباید خطایی نمایش داده شود.
تنظیم بکاپ کامل هفتگی
بکاپهای افزایشی بر پایه بکاپهای کامل ساخته میشوند. یعنی با افزایش تغییرات، بکاپها سنگینتر و پیچیدهتر میشوند. برای حل این مشکل، ما در این آموزش،بکاپهای کامل هفتگی را تنظیم خواهیم کرد تا پشتیبانها بهطور منظم بهروز شوند.
برای انجام این کار، یک اسکریپت مشابه در دایرکتوری /etc/cron.weekly
ایجاد خواهیم کرد.
بنابراین به دایرکتوری فوق بروید و یک فایل جدید بسازید:
cd /etc/cron.weekly
nano duplicity.full
این اسکریپت در کد زیر را در فایل duplicity.full
کپی کنید. توجه داشته باشید که ما دستور full
را اضافه کردهایم تا به duplicity
دستور دهیم که یک بکاپگیری کامل انجام دهد.
#!/bin/sh
test -x $(which duplicity) || exit 0
. /root/.passphrase
export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet
علاوهبر این یک دستور اضافی duplicity
در انتهای فایل اضافه کنید تا اسکریپت، فایلهای بکاپ قدیمی را پاک کند.
کد زیر را به انتهای فایل اضافه کنید:
$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet
فایل را ذخیره کرده و ببنیدید.
سپس برای اجرای اسکریپت، دستور زیر را بزنید:
chmod 755 duplicity.full
در آخر اسکریپت را تست کنید:
./duplicity.full
این اسکریپت باید ابتدا یک بکاپ کامل (Full Backup) ایجاد کند و سپس هر فایل غیرضروری را حذف کند.
جمع بندی
اکنون خیالتان راحت است زیرا یک راهحل بکاپگیری خودکار و کاملاً عملیاتی دارید. حتماً بهطور منظم بکاپهای خود را بررسی کنید. ابزارهای خودکار بکاپگیری دیگری نیز وجود دارند، اما Duplicity یک راهحل انعطافپذیر و ساده است که نیازهای بسیاری از کاربران را برآورده میکند.
سواالات متداول
1- چگونه میتوانم از صحت و قابل بازیابی بودن بکاپهایم مطمئن باشم؟
حتماً باید بهطور منظم از صحت پشتیبانهای خود مطمئن شوید تا از احساس امنیت کاذب جلوگیری کنید. این کار را میتوان با تستهای بازیابی منظم انجام داد. در صورت نیاز، میتوان از اسکریپتها برای بررسی پشتیبانها استفاده کرد تا اطمینان حاصل شود که دادهها بهدرستی پشتیبانگیری شدهاند.
2- آیا ابزارهای پشتیبانگیری دیگری هم به جز Duplicity وجود دارند؟
بله، ابزارهای دیگری مانند Rsync و Bacula نیز وجود دارند. اما با توجه به سادگی و انعطافپذیری Duplicity، این ابزار بهطور خاص نیازهای من را بهخوبی برطرف میکند و گزینهای مناسب برای پشتیبانگیری خودکار است.
3- آیا Duplicity از انواع مختلف ذخیرهسازی پشتیبانی میکند؟
بله، Duplicity از انواع مختلف ذخیرهسازی پشتیبانی میکند، از جمله ذخیرهسازی محلی، FTP، SFTP، Amazon S3، Google Drive و سایر سرویسهای ابری. این ابزار به شما این امکان را میدهد که دادههای خود را در مکانهای مختلف ذخیره کرده و از امنیت و دسترسپذیری آنها اطمینان حاصل کنید.