ساخت ربات ارسال بکاپ سیستمی هاست دایرکت ادمین به سرویس S3 آمازون
در این مقاله نحوه ساخت ربات بکاپ برای دایرکت ادمین و ارسال آن به S3 آمازون را به شما آموزش می‌دهیم. با ما همراه باشید.

ساخت ربات ارسال بکاپ سیستمی هاست دایرکت ادمین به سرویس S3 آمازون

این مقاله به شما نشان می‌دهد که چگونه با یک ربات، بکاپ‌های هاست دایرکت ادمین را به S3 آمازون ارسال کنید و فایل‌های قدیمی را حذف کنید. گام‌ها شامل ایجاد S3، پیکربندی IAM و نوشتن اسکریپت اتوماسیون است.
0 اشتراک گذاری
0
0
0
0

پیش‌نیازها

برای پیاده‌سازی این ربات پشتیبان‌گیری نیاز است محیط سرور و AWS به‌صورت پایه‌ای آماده باشند. موارد زیر را بررسی و فراهم کنید:

  • دسترسی SSH به سرور دایرکت‌ادمین با دسترسی sudo/root.
  • نصب AWS CLI (نسخه v2 ترجیحاً) یا ابزارهایی مثل rclone.
  • یک S3 bucket در AWS با نام دلخواه و Region مناسب.
  • یک کاربر IAM با دسترسی محدود به آن bucket یا استفاده از IAM Role (درصورت اجرای روی EC2).
  • فضای کافی روی سرور برای نگهداری موقت بکاپ‌ها.
  • فعال‌سازی lifecycle policy در S3 برای حذف پس از 7 روز.

نمود کلی جریان کار

جریان ساده شده فرایند به صورت زیر است:

  1. دایرکت‌ادمین بکاپ تولید می‌کند و در پوشهٔ محلی ذخیره می‌شود (مثلاً /home/admin/backups).
  2. اسکریپت (ربات) به‌صورت برنامه‌ریزی‌شده اجرا می‌شود و بکاپ‌ها را به S3 آپلود می‌کند.
  3. پس از اطمینان از آپلود، اسکریپت فایل‌های محلی که بیش از 2 روز سن دارند را حذف می‌کند.
  4. در S3 یک lifecycle تنظیم شده که نگهداری هر شی را پس از 7 روز حذف می‌کند.

گام به گام پیاده‌سازی

۱) ایجاد S3 Bucket و تنظیم lifecycle (حذف پس از 7 روز)

می‌توانید یک bucket از کنسول AWS بسازید یا از AWS CLI استفاده کنید. نمونهٔ دستور ایجاد bucket (مثال region = eu-central-1):

aws s3api create-bucket --bucket my-da-backups-bucket --region eu-central-1 --create-bucket-configuration LocationConstraint=eu-central-1

نمونهٔ پالیسی lifecycle (فایل lifecycle.json):

{"Rules":[{"ID":"ExpireBackupsAfter7Days","Prefix":"","Status":"Enabled","Expiration":{"Days":7},"NoncurrentVersionExpiration":{"NoncurrentDays":7}}]}

اعمال پالیسی با CLI:

aws s3api put-bucket-lifecycle-configuration --bucket my-da-backups-bucket --lifecycle-configuration file://lifecycle.json

توصیه‌ها: در صورت نیاز به کاهش هزینهٔ ذخیره‌سازی، می‌توانید از storage-class هایی مانند STANDARD_IA یا INTELLIGENT_TIERING استفاده کنید. اگر نسخه‌بندی (versioning) فعال است، پالیسی NoncurrentVersionExpiration را هم تنظیم کنید.

۲) ساخت IAM Policy و کاربر با کمترین دسترسی لازم

نمونهٔ پالیسی محدود به یک bucket (فایل JSON):

{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:PutObject","s3:GetObject","s3:ListBucket","s3:DeleteObject","s3:PutObjectAcl"],"Resource":["arn:aws:s3:::my-da-backups-bucket","arn:aws:s3:::my-da-backups-bucket/*"]}]}

نکتهٔ امنیتی: بهتر است به جای کلیدهای ثابت از IAM Role استفاده شود (اگر سرور شما EC2 است). همچنین محدودسازی دسترسی بر اساس IP یا شرایط اضافی (Condition) را در نظر بگیرید.

۳) نصب و پیکربندی AWS CLI روی سرور

مثال نصب برای Debian/Ubuntu و CentOS/RHEL:

sudo apt update && sudo apt install -y awscli
sudo yum install -y awscli

پیکربندی برای access key در صورت نیاز:

aws configure --profile da-backup

در صورت استفاده از IAM Role روی EC2، نیازی به configure نیست.

۴) اسکریپت نمونه: upload_and_clean.sh

این اسکریپت عملیات آپلود همهٔ بکاپ‌ها به S3 و سپس حذف فایل‌های محلی که بیش از 2 روز از عمرشان گذشته و در S3 وجود دارند انجام می‌دهد. (کد زیر را در مسیر مناسب قرار دهید و اجراپذیر کنید.)

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# Configuration
BACKUP_DIR="/home/admin/backups"
BUCKET="my-da-backups-bucket"
S3_PREFIX="directadmin"
AWS_PROFILE="da-backup"
LOGFILE="/var/log/da_s3_backup.log"
DAYS_LOCAL=2

# Helpers
log() { echo "$(date '+%F %T') $*" | tee -a "$LOGFILE"; }

aws_cmd() {
  if [ -z "${AWS_PROFILE:-}" ]; then
    aws "$@"
  else
    aws --profile "$AWS_PROFILE" "$@"
  fi
}

# Upload files
log "Starting upload from $BACKUP_DIR to s3://$BUCKET/$S3_PREFIX"
aws_cmd s3 cp "$BACKUP_DIR" "s3://$BUCKET/$S3_PREFIX/" --recursive --only-show-errors --storage-class STANDARD --sse AES256
if [ $? -ne 0 ]; then
  log "Error: upload to S3 failed."
  exit 1
fi
log "Upload completed."

# Remove local files older than DAYS_LOCAL if present in S3
log "Searching for local files older than $DAYS_LOCAL days"
find "$BACKUP_DIR" -type f -mtime +"$DAYS_LOCAL" -print0 | while IFS= read -r -d '' file; do
  base=$(basename "$file")
  s3key="$S3_PREFIX/$base"
  if aws_cmd s3api head-object --bucket "$BUCKET" --key "$s3key" >/dev/null 2>&1; then
    log "Removing local file: $file (found in S3)"
    rm -f "$file" && log "Deleted: $file" || log "Error deleting: $file"
  else
    log "S3 object not found: s3://$BUCKET/$s3key — not removed locally."
  fi
done

log "Operation finished."

نکات: فایل اسکریپت را مثلاً در /usr/local/bin/upload_and_clean.sh قرار دهید و با chmod +x اجرایی کنید. مسیر BACKUP_DIR را مطابق با تنظیمات دایرکت‌ادمین خود اصلاح نمایید.

۵) برنامه‌ریزی اجرای خودکار (Cron یا systemd timer)

برای اجرای روزانه در ساعت 02:00 با cron:

0 2 * * * /usr/local/bin/upload_and_clean.sh >> /var/log/da_s3_backup.log 2>&1

در صورت تمایل می‌توانید systemd timer بسازید تا کنترل و لاگینگ بهتری داشته باشید.

۶) بررسی و اطمینان از موفقیت عملیات

بررسی لاگ‌ها در /var/log/da_s3_backup.log و تأیید فایل‌ها در S3:

برای دیدن لیست فایل‌ها در S3:

aws s3 ls s3://my-da-backups-bucket/directadmin

دورهٔ lifecycle را از کنسول یا با دستور CLI بررسی کنید تا مطمئن شوید حذف پس از 7 روز انجام خواهد شد.

گزینه‌های پیشرفته و بهبودها

  • Multipart upload برای فایل‌های بزرگ: AWS CLI به‌صورت خودکار پشتیبانی می‌کند، اما برای فایل‌های بسیار بزرگ می‌توانید تنظیمات concurrency را تغییر دهید.
  • استفاده از SSE-KMS برای رمزنگاری با کلید KMS سازمانی: در aws s3 cp از --sse aws:kms --sse-kms-key-id "arn:aws:kms:..." استفاده کنید.
  • فعال کردن S3 Object Lock و نسخه‌بندی اگر نیاز به محافظت در مقابل حذف ناخواسته دارید.
  • اگر ترافیک خروجی هزینه‌بر است، سرور را نزدیک region S3 یا در زیرساختی با اتصال مستقیم قرار دهید.
  • افزودن نوتیفیکیشن در صورت شکست آپلود با استفاده از AWS SNS یا Webhook برای ارسال پیام به Slack/Email.

نکات امنیتی مهم

چند توصیهٔ کلیدی برای امن نگه داشتن بکاپ‌ها:

  • Least privilege: از حداقل مجوزها برای IAM استفاده کنید.
  • Avoid static keys: کلیدهای دسترسی را در فایل متنی نگه ندارید؛ اگر روی EC2 هستید از IAM Role استفاده کنید.
  • Encryption: از رمزنگاری سمت سرور (SSE) یا رمزنگاری قبل از آپلود (gpg یا rclone encryption) استفاده نمایید.
  • Logging: لاگ‌های دسترسی S3 و CloudTrail را فعال کنید تا هر عملیات ثبت شود.

پایش، هشداردهی و تست بازگردانی (DR)

توصیه‌ها برای اطمینان از کارکرد مداوم:

  • مرتباً فرایند بازگردانی بکاپ از S3 به سرور را تست کنید و این تست را در برنامهٔ ماهیانه قرار دهید.
  • استفاده از S3 Inventory و CloudWatch برای پایش میزان آپلود و خطاها.
  • تنظیم هشدار در صورت وقوع خطا یا شکست در آپلود.

مقایسه گزینه‌ها: awscli vs rclone vs s3fs

AWS CLI: ساده، محبوب و مناسب. از lifecycle و encryption AWS پشتیبانی می‌کند.

rclone: امکانات بیشتر برای sync، encryption سمت کلاینت و کنترل bandwidth. مناسب اگر نیاز به محدود کردن پهنای باند یا رمزنگاری قبل از آپلود دارید.

s3fs: باکت را به‌صورت فایل‌سیستم مانت می‌کند، اما ممکن است برای فایل‌های بکاپ حجیم عملکرد و پایداری کمتری داشته باشد.

چرا انتخاب لوکیشن مناسب اهمیت دارد؟

انتخاب لوکیشن مناسب می‌تواند زمان آپلود و هزینهٔ ترافیک خروجی را کاهش دهد. انتخاب لوکیشن نزدیک به S3 region باعث کاهش latency و زمان عملیات خواهد شد.

اگر نیاز به محافظت بیشتر، اتصال اختصاصی یا تفاوت‌های عملکردی دارید، زیرساخت با لوکیشن‌های متعدد و امکانات خاص می‌تواند کمک کند.

نمونهٔ عملیاتی: تنظیم برای یک VPS ترید

  • انتخاب لوکیشن نزدیک به exchange یا سرور ترید برای کاهش latency.
  • فعال‌سازی محافظت DDoS برای سرور مربوطه.
  • انتقال بکاپ‌های دایرکت‌ادمین به S3 منطقه نزدیک برای کاهش زمان بکاپ‌گیری.

خلاصه و نکات نهایی

ساخت ربات شامل سه بخش اصلی است: آپلود ایمن به S3، حذف محلی فایل‌های قدیمی‌تر از 2 روز پس از تأیید آپلود، و پیکربندی lifecycle در S3 برای نگهداری 7 روزه.

از IAM با کمترین دسترسی، رمزنگاری و مانیتورینگ مناسب استفاده کنید. همیشه فرایند Restore را تست کنید تا از قابلیت بازیابی مطمئن شوید.

فایل‌های نمونه و منابع

سؤالات متداول

شاید دوست داشته باشید