اخیراً سؤالاتی در مورد نحوه بکاپ گیری از سایت وردپرسی یا سرور VPS مشاهده کرده ایم. اگرچه بسیاری از افراد برای این کار از پلاگین های وردپرس استفاده می کنند ولی ما تمایلی به این کار نداریم.
روش مورد نظر ما استفاده از اسکریپتی است که از فایل های وب سایت و دیتابیس ما در باکت AWS S3 بکاپ گیری کند. اگرچه اسکریپت انجام این کار را برای معدودی از افراد قرار داده بودیم اما تصمیم گرفتیم پستی ایجاد کنیم و آن ها را در اختیار عموم افراد قرار دهیم.
در این پست به نحوه بکاپ گیری از تمام سرورهای VPS در باکت های Amazon S3 خواهیم پرداخت.
پیش نیازها
سرور VPS لینوکسی (ما از CentOS و Ubuntu استفاده می کنیم)
نصب pigz و gzip بر روی سرور
نصب و پیکربندی AWS CLI بر روی سرور
نحوه بکاپ گیری از سرور VPS بر روی Amazon S3
در اولین گام باید وارد کنسول AWS خود شوید و در ناحیه مورد نظر خود دو باکت S3 جدید ایجاد کنید (برای مثال mySQLbackups و myFilebackups).
توجه: بکاپ های شما در اینجا قرار خواهند گرفت. به همین دلیل پیشنهاد می کنیم باکت های S3 را در ناحیه ای از AWS و جدا از سرور VPS واقعی خود ایجاد کنید.
حال سرور SSH VPS چند پوشه و فایل ایجاد می کند. ما تحت دایرکتوری HOME یک پوشه backups ایجاد می کنیم و زیر آن نیز پوشه files و mysql را می سازیم. در نهایت تحت پوشه backups فایل های database.sh و files.sh را مانند شکل زیر ایجاد می کنیم:
سپس از طریق ترمینال SSH هر دو فایل database.sh و files.sh را به صورت قابل اجرا درمی آوریم:
chmod +x filename.sh
فایل database.sh را باز و کد زیر را کپی و پیست کنید:
1.
2. #!/bin/bash
3. ################################################
4. #
5. # Backup all MySQL databases in separate files and compress each file.
6. # NOTES:
7. # – MySQL and pigz must be installed on the system
8. # – Requires write permission in the destination folder
9. # – Excludes MySQL admin tables (‘mysql’,information_schema’,’performance_schema’)
10.#
11.################################################
12.
13.##### VARIABLES
14.# MySQL User
15.USER=’root’
16.# MySQL Password
17.PASSWORD=’MySQL_ROOT_PASSWORD’
18.# Backup Directory – WITH TAILING SLASH IF PATH OTHER THEN ‘.’!
19.OUTPUT=”/home/backups/mysql”
20.BUCKET=”NAME_OF_S3_BUCKET”
21.
22.##### EXECUTE THE DB BACKUP
23.TIMESTAMP=date +%Y%m%d_%H;
24.OUTPUTDEST=$OUTPUT;
25.echo “Starting MySQL Backup”;
26.echo date;
27.databases=mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database
28.for db in $databases; do
29. if [[ “$db” != “information_schema” ]] && [[ “$db” != _* ]] && [[ “$db” != “mysql” ]] && [[ “$db” != “performance_schema” ]] ; then
30. echo “Dumping database: $db”
31. mysqldump –single-transaction –routines –triggers –user=$USER –password=$PASSWORD –databases $db > $OUTPUTDEST/dbbackup-$TIMESTAMP-$db.sql
32. pigz $OUTPUTDEST/dbbackup-$TIMESTAMP-$db.sql
33. fi
34.done
35./usr/local/bin/aws –only-show-errors s3 sync $OUTPUTDEST s3://$BUCKET/date +%Y/date +%m/date +%d/
36.rm -rf /home/backups/mysql/dbbackup-*
37.echo “Finished MySQL Backup”;
38.echo date;
حتماً خط 12 را با رمز عبور روت VPS MySQL و خط 15 را با نام باکت AWS S3 خود ویرایش کنید.
فایل database.sh را ذخیره کنید و ببندید.
فایل files.sh را باز کنید و کد زیر را در آن کپی کنید:
1.
2. ################################################
3. #
4. # Backup all files in the nginx home directory.
5. # NOTES:
6. # – gzip must be installed on the system
7. #
8. ################################################
9.
10.##### VARIABLES
11.OUTPUT=”/home/backups/files”
12.
13.##### EXECUTE THE FILES BACKUP
14.TIMESTAMP=date +%Y%m%d_%H;
15.OUTPUTDEST=$OUTPUT;
16.echo “Starting Files Backup”;
17.cd /home/nginx/domains/
18.tar -czf $OUTPUTDEST/filesbackup-SERVER_HOST_NAME-$TIMESTAMP.tar *
19./usr/local/bin/aws –only-show-errors s3 cp $OUTPUTDEST/filesbackup-SERVER_HOST_NAME-$TIMESTAMP.tar s3://AWS_BUCKET_NAME/
20.rm -f $OUTPUTDEST/filesbackup-*
21.echo “Finished Files Backup”;
22.echo date;
این بار خطوط 18 و 19 را ویرایش کنید و به جای SERVER_HOST_NAME نام سرور VPS خود را قرار دهید. همچنین در خط 18 نام باکت S3 خود را به جای AWS_BUCKET_NAME قرار دهید.
فایل files.sh را ذخیره کنید و ببندید.
سپس با تایپ عبارت زیر crontab را باز کنید:
crontab -e
کدهای زیر را به انتهای crontab اضافه کنید:
1.
2. 0 0 * * * /home/backups/database.sh
3. 0 1 * * * /home/backups/files.sh
با این کار اسکریپت بکاپ دیتابیس هر نیمه شب انجام خواهد شد و اسکریپت بکاپ فایل ها هر شب ساعت 1 اجرا می شود.
تنظیم کار بکاپ گیری و ذخیره در S3
شما می توانید زمان و نحوه بکاپ گیری را با تغییر ورودی crontab زمانبندی شده تغییر دهید. ما برای تعدادی از سرورهای خود بکاپ گیری را بر روی روزانه و برای مابقی آن ها 2 الی 3 بار در روز را تنظیم کرده ایم.
آخرین توصیه ما این است که یک AWS S3 Lifecycle Policy ایجاد کنید. حال به سراغ تنظیم زمان ذخیره سازی بکاپ ها را در S3 می رویم.
ما نیز برای انتقال بکاپ ها به کلاس های ذخیره سازی مختلف S3 از policy (سیاست) استفاده می کنیم. برای مثال آن را پس از تعداد X روز از Standard به Glacier جابجا می کنیم. علاوه بر این اگر بخواهید چند بکاپ در چند ناحیه مختلف AWS داشته باشید می توانید به سادگی S3 Replication را فعال کنید.
برای بکاپ گیری در AWS گزینه های مختلفی پیش روی شما قرار دارد. تمام این گزینه ها به میزان مهم بودن بکاپ ها و میزان پرداختی شما بستگی دارند.
AWS IAM Backup Account Policy
هنگامی که AWS CLI را بر روی سرور VPS خود پیکربندی می کنید، پیشنهاد ما استفاده از کاربر جدید IAM است که تنها برای کارهای بکاپ گیری (و نه اکانت AWS Root شما) مورد استفاده قرار می گیرد.
در ادامه سیاستی (policy) را مشاهده می کنید که به اکانت VPStoS3Backup IAM خود ضمیمه کرده ایم:
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: “s3:*”,
“Resource”: [
“arn:aws:s3:::mySQLbackups”,
“arn:aws:s3:::mySQLbackups/*”,
“arn:aws:s3:::myFilebackups”,
“arn:aws:s3:::myFilebackups/*”
]
},
{
“Effect”: “Deny”,
“NotAction”: “s3:*”,
“NotResource”: [
“arn:aws:s3:::mySQLbackups”,
“arn:aws:s3:::mySQLbackups/*”,
“arn:aws:s3:::myFilebackups”,
“arn:aws:s3:::myFilebackups/*”
]
},
{
“Effect”: “Deny”,
“Action”: [
“s3:DeleteBucket”,
“s3:DeleteBucketPolicy”,
“s3:DeleteBucketWebsite”,
“s3:DeleteObject”,
“s3:DeleteObjectVersion”
],
“Resource”: [
“arn:aws:s3:::*”
]
}
]
}
حتماً به جای mySQLbackups و myFilebackups نام باکت های AWS S3 خود را قرار دهید که برای ذخیره سازی بکاپ ها استفاده می کنید.
سیاست بالا، اکانت IAM را به خواندن و نوشتن در باکت های ذکر شده محدود می کند.
پس از هک VFEmail، بخش آخر سیاست را اضافه کردیم که امکان حذف از اکانت را رد می کند. پس حتی اگر اکانت IAM به خطر افتاد، هکر نمی تواند تمام بکاپ های ما را حذف کند.
نکات دیگر
ما اسکریپت های بکاپ بالا را در مخزن گیت هاب به آدرس https://github.com/miketabor/vps-backups قرار داده ایم.
اگر به دنبال پلاگین ساده ای برای وردپرس هستید Duplicator Pro را پیشنهاد می کنیم چون از AWS S3، Dropbox، Google Drive، MS OneDrive و … پشتیبانی می کند.
اگر به دنبال ارائه دهنده هاست جدیدی هستید، پیشنهاد ما UpCloud، Linode یا Vultr است. ما از هر سه آن ها برای پروژه های مختلف استفاده کرده ایم و از آن ها رضایت داریم.
فرایند بکاپ گیری شما چگونه است؟
در این پست به نحوه بکاپ گیری سرورهای VPS خودمان بر روی AWS S3 پرداختیم.
شما برای بکاپ گیری سرورهای خود از چه ابزاری استفاده کنید؟ آن ها را کجا ذخیره می کنید (محلی یا خارج از سایت)؟
اگر در مورد بهبود نحوه کار پیشنهادی دارید به ما اطلاع دهید.
روش مورد نظر ما استفاده از اسکریپتی است که از فایل های وب سایت و دیتابیس ما در باکت AWS S3 بکاپ گیری کند. اگرچه اسکریپت انجام این کار را برای معدودی از افراد قرار داده بودیم اما تصمیم گرفتیم پستی ایجاد کنیم و آن ها را در اختیار عموم افراد قرار دهیم.
در این پست به نحوه بکاپ گیری از تمام سرورهای VPS در باکت های Amazon S3 خواهیم پرداخت.
پیش نیازها
سرور VPS لینوکسی (ما از CentOS و Ubuntu استفاده می کنیم)
نصب pigz و gzip بر روی سرور
نصب و پیکربندی AWS CLI بر روی سرور
نحوه بکاپ گیری از سرور VPS بر روی Amazon S3
در اولین گام باید وارد کنسول AWS خود شوید و در ناحیه مورد نظر خود دو باکت S3 جدید ایجاد کنید (برای مثال mySQLbackups و myFilebackups).
توجه: بکاپ های شما در اینجا قرار خواهند گرفت. به همین دلیل پیشنهاد می کنیم باکت های S3 را در ناحیه ای از AWS و جدا از سرور VPS واقعی خود ایجاد کنید.
حال سرور SSH VPS چند پوشه و فایل ایجاد می کند. ما تحت دایرکتوری HOME یک پوشه backups ایجاد می کنیم و زیر آن نیز پوشه files و mysql را می سازیم. در نهایت تحت پوشه backups فایل های database.sh و files.sh را مانند شکل زیر ایجاد می کنیم:
سپس از طریق ترمینال SSH هر دو فایل database.sh و files.sh را به صورت قابل اجرا درمی آوریم:
chmod +x filename.sh
فایل database.sh را باز و کد زیر را کپی و پیست کنید:
1.
2. #!/bin/bash
3. ################################################
4. #
5. # Backup all MySQL databases in separate files and compress each file.
6. # NOTES:
7. # – MySQL and pigz must be installed on the system
8. # – Requires write permission in the destination folder
9. # – Excludes MySQL admin tables (‘mysql’,information_schema’,’performance_schema’)
10.#
11.################################################
12.
13.##### VARIABLES
14.# MySQL User
15.USER=’root’
16.# MySQL Password
17.PASSWORD=’MySQL_ROOT_PASSWORD’
18.# Backup Directory – WITH TAILING SLASH IF PATH OTHER THEN ‘.’!
19.OUTPUT=”/home/backups/mysql”
20.BUCKET=”NAME_OF_S3_BUCKET”
21.
22.##### EXECUTE THE DB BACKUP
23.TIMESTAMP=date +%Y%m%d_%H;
24.OUTPUTDEST=$OUTPUT;
25.echo “Starting MySQL Backup”;
26.echo date;
27.databases=mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database
28.for db in $databases; do
29. if [[ “$db” != “information_schema” ]] && [[ “$db” != _* ]] && [[ “$db” != “mysql” ]] && [[ “$db” != “performance_schema” ]] ; then
30. echo “Dumping database: $db”
31. mysqldump –single-transaction –routines –triggers –user=$USER –password=$PASSWORD –databases $db > $OUTPUTDEST/dbbackup-$TIMESTAMP-$db.sql
32. pigz $OUTPUTDEST/dbbackup-$TIMESTAMP-$db.sql
33. fi
34.done
35./usr/local/bin/aws –only-show-errors s3 sync $OUTPUTDEST s3://$BUCKET/date +%Y/date +%m/date +%d/
36.rm -rf /home/backups/mysql/dbbackup-*
37.echo “Finished MySQL Backup”;
38.echo date;
حتماً خط 12 را با رمز عبور روت VPS MySQL و خط 15 را با نام باکت AWS S3 خود ویرایش کنید.
فایل database.sh را ذخیره کنید و ببندید.
فایل files.sh را باز کنید و کد زیر را در آن کپی کنید:
1.
2. ################################################
3. #
4. # Backup all files in the nginx home directory.
5. # NOTES:
6. # – gzip must be installed on the system
7. #
8. ################################################
9.
10.##### VARIABLES
11.OUTPUT=”/home/backups/files”
12.
13.##### EXECUTE THE FILES BACKUP
14.TIMESTAMP=date +%Y%m%d_%H;
15.OUTPUTDEST=$OUTPUT;
16.echo “Starting Files Backup”;
17.cd /home/nginx/domains/
18.tar -czf $OUTPUTDEST/filesbackup-SERVER_HOST_NAME-$TIMESTAMP.tar *
19./usr/local/bin/aws –only-show-errors s3 cp $OUTPUTDEST/filesbackup-SERVER_HOST_NAME-$TIMESTAMP.tar s3://AWS_BUCKET_NAME/
20.rm -f $OUTPUTDEST/filesbackup-*
21.echo “Finished Files Backup”;
22.echo date;
این بار خطوط 18 و 19 را ویرایش کنید و به جای SERVER_HOST_NAME نام سرور VPS خود را قرار دهید. همچنین در خط 18 نام باکت S3 خود را به جای AWS_BUCKET_NAME قرار دهید.
فایل files.sh را ذخیره کنید و ببندید.
سپس با تایپ عبارت زیر crontab را باز کنید:
crontab -e
کدهای زیر را به انتهای crontab اضافه کنید:
1.
2. 0 0 * * * /home/backups/database.sh
3. 0 1 * * * /home/backups/files.sh
با این کار اسکریپت بکاپ دیتابیس هر نیمه شب انجام خواهد شد و اسکریپت بکاپ فایل ها هر شب ساعت 1 اجرا می شود.
تنظیم کار بکاپ گیری و ذخیره در S3
شما می توانید زمان و نحوه بکاپ گیری را با تغییر ورودی crontab زمانبندی شده تغییر دهید. ما برای تعدادی از سرورهای خود بکاپ گیری را بر روی روزانه و برای مابقی آن ها 2 الی 3 بار در روز را تنظیم کرده ایم.
آخرین توصیه ما این است که یک AWS S3 Lifecycle Policy ایجاد کنید. حال به سراغ تنظیم زمان ذخیره سازی بکاپ ها را در S3 می رویم.
ما نیز برای انتقال بکاپ ها به کلاس های ذخیره سازی مختلف S3 از policy (سیاست) استفاده می کنیم. برای مثال آن را پس از تعداد X روز از Standard به Glacier جابجا می کنیم. علاوه بر این اگر بخواهید چند بکاپ در چند ناحیه مختلف AWS داشته باشید می توانید به سادگی S3 Replication را فعال کنید.
برای بکاپ گیری در AWS گزینه های مختلفی پیش روی شما قرار دارد. تمام این گزینه ها به میزان مهم بودن بکاپ ها و میزان پرداختی شما بستگی دارند.
AWS IAM Backup Account Policy
هنگامی که AWS CLI را بر روی سرور VPS خود پیکربندی می کنید، پیشنهاد ما استفاده از کاربر جدید IAM است که تنها برای کارهای بکاپ گیری (و نه اکانت AWS Root شما) مورد استفاده قرار می گیرد.
در ادامه سیاستی (policy) را مشاهده می کنید که به اکانت VPStoS3Backup IAM خود ضمیمه کرده ایم:
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: “s3:*”,
“Resource”: [
“arn:aws:s3:::mySQLbackups”,
“arn:aws:s3:::mySQLbackups/*”,
“arn:aws:s3:::myFilebackups”,
“arn:aws:s3:::myFilebackups/*”
]
},
{
“Effect”: “Deny”,
“NotAction”: “s3:*”,
“NotResource”: [
“arn:aws:s3:::mySQLbackups”,
“arn:aws:s3:::mySQLbackups/*”,
“arn:aws:s3:::myFilebackups”,
“arn:aws:s3:::myFilebackups/*”
]
},
{
“Effect”: “Deny”,
“Action”: [
“s3:DeleteBucket”,
“s3:DeleteBucketPolicy”,
“s3:DeleteBucketWebsite”,
“s3:DeleteObject”,
“s3:DeleteObjectVersion”
],
“Resource”: [
“arn:aws:s3:::*”
]
}
]
}
حتماً به جای mySQLbackups و myFilebackups نام باکت های AWS S3 خود را قرار دهید که برای ذخیره سازی بکاپ ها استفاده می کنید.
سیاست بالا، اکانت IAM را به خواندن و نوشتن در باکت های ذکر شده محدود می کند.
پس از هک VFEmail، بخش آخر سیاست را اضافه کردیم که امکان حذف از اکانت را رد می کند. پس حتی اگر اکانت IAM به خطر افتاد، هکر نمی تواند تمام بکاپ های ما را حذف کند.
نکات دیگر
ما اسکریپت های بکاپ بالا را در مخزن گیت هاب به آدرس https://github.com/miketabor/vps-backups قرار داده ایم.
اگر به دنبال پلاگین ساده ای برای وردپرس هستید Duplicator Pro را پیشنهاد می کنیم چون از AWS S3، Dropbox، Google Drive، MS OneDrive و … پشتیبانی می کند.
اگر به دنبال ارائه دهنده هاست جدیدی هستید، پیشنهاد ما UpCloud، Linode یا Vultr است. ما از هر سه آن ها برای پروژه های مختلف استفاده کرده ایم و از آن ها رضایت داریم.
فرایند بکاپ گیری شما چگونه است؟
در این پست به نحوه بکاپ گیری سرورهای VPS خودمان بر روی AWS S3 پرداختیم.
شما برای بکاپ گیری سرورهای خود از چه ابزاری استفاده کنید؟ آن ها را کجا ذخیره می کنید (محلی یا خارج از سایت)؟
اگر در مورد بهبود نحوه کار پیشنهادی دارید به ما اطلاع دهید.