كتابة سكربتات أتمتة لمهام النسخ الاحتياطي والصيانة


كتابة سكربتات أتمتة لمهام النسخ الاحتياطي والصيانة

كتابة سكربتات أتمتة لمهام النسخ الاحتياطي والصيانة

أهلاً يا شباب! بصفتي مهندس أنظمة لينكس، بعرف قد إيش الأتمتة بتوفر علينا وقت وجهد. اليوم رح نحكي عن سكربتات بسيطة بس قوية لمهام النسخ الاحتياطي والصيانة اللي لازم تكون جزء من روتين كل سيرفر.

1. سكربتات النسخ الاحتياطي (Backups)

النسخ الاحتياطي هو أهم شي. لو ضاع الداتا، راحت عليك. خلينا نشوف كيف نعمل سكربتات بسيطة وفعالة.

أ. نسخ احتياطي للملفات والمجلدات باستخدام tar و rsync

أسهل طريقة لنسخ مجلد كامل هي بـ tar، وممكن نضغطه كمان. أما rsync فهو ممتاز للنسخ التزايدي (incremental) عشان ما ينسخ إلا الملفات اللي تغيرت.

ملاحظة: دائماً فكر وين رح تخزن النسخة الاحتياطية. يفضل تكون على سيرفر تاني، جهاز تخزين شبكي (NAS)، أو حتى سحابة (cloud storage).

مثال على سكربت tar لضغط مجلد:

هذا السكربت بياخد نسخة من مجلد معين، بيضغطها، وبيسميها بتاريخ اليوم.

#!/bin/bash

# المتغيرات
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/mnt/backups/web_data"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILENAME="web_data_backup_${DATE}.tar.gz"

# إنشاء مجلد النسخ الاحتياطي إذا لم يكن موجوداً
mkdir -p "${BACKUP_DIR}"

# إنشاء النسخة الاحتياطية باستخدام tar
echo "بدء عملية النسخ الاحتياطي للملفات من ${SOURCE_DIR}..."
tar -czf "${BACKUP_DIR}/${BACKUP_FILENAME}" "${SOURCE_DIR}"

if [ $? -eq 0 ]; then
    echo "تم النسخ الاحتياطي بنجاح إلى ${BACKUP_DIR}/${BACKUP_FILENAME}"
else
    echo "فشل النسخ الاحتياطي!"
fi

# تنظيف النسخ القديمة (احتفظ بآخر 7 أيام)
echo "تنظيف النسخ الاحتياطية القديمة..."
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete
echo "اكتمل التنظيف."
مثال على سكربت rsync للنسخ التزايدي:

الـ rsync عظيم لنسخ الملفات بين سيرفرات، أو حتى داخل نفس السيرفر بكفاءة.

#!/bin/bash

# المتغيرات
SOURCE_DIR="/home/user/documents/"
DEST_DIR="/mnt/backups/home_docs/"
LOG_FILE="/var/log/rsync_home_docs.log"

# إنشاء مجلد الوجهة إذا لم يكن موجوداً
mkdir -p "${DEST_DIR}"

# بدء عملية النسخ الاحتياطي باستخدام rsync
echo "$(date): بدء عملية النسخ الاحتياطي لـ ${SOURCE_DIR} إلى ${DEST_DIR}" >> "${LOG_FILE}"
rsync -avz --delete "${SOURCE_DIR}" "${DEST_DIR}" >> "${LOG_FILE}" 2>&1

if [ $? -eq 0 ]; then
    echo "$(date): تم النسخ الاحتياطي بنجاح." >> "${LOG_FILE}"
else
    echo "$(date): فشل النسخ الاحتياطي!" >> "${LOG_FILE}"
fi

ب. نسخ احتياطي لقواعد البيانات (Databases)

قواعد البيانات تحتاج معاملة خاصة. mysqldump للـ MySQL و pg_dump للـ PostgreSQL هم أصدقائك هنا.

مثال على سكربت mysqldump (MySQL/MariaDB):
#!/bin/bash

# المتغيرات
DB_USER="backup_user"
DB_PASS="your_db_password" # يفضل استخدام ملف .my.cnf
DB_NAME="your_database_name"
BACKUP_DIR="/mnt/backups/mysql"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
BACKUP_FILENAME="${DB_NAME}_backup_${DATE}.sql.gz"

# إنشاء مجلد النسخ الاحتياطي
mkdir -p "${BACKUP_DIR}"

# إنشاء النسخة الاحتياطية لقاعدة البيانات
echo "بدء عملية النسخ الاحتياطي لقاعدة البيانات ${DB_NAME}..."
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" | gzip > "${BACKUP_DIR}/${BACKUP_FILENAME}"

if [ $? -eq 0 ]; then
    echo "تم النسخ الاحتياطي لقاعدة البيانات بنجاح إلى ${BACKUP_DIR}/${BACKUP_FILENAME}"
else
    echo "فشل النسخ الاحتياطي لقاعدة البيانات!"
fi

# تنظيف النسخ القديمة (احتفظ بآخر 7 أيام)
echo "تنظيف النسخ الاحتياطية القديمة..."
find "${BACKUP_DIR}" -type f -name "*.sql.gz" -mtime +7 -delete
echo "اكتمل التنظيف."

نصيحة أمنية: لا تضع كلمة المرور مباشرة في السكربت. استخدم ملف ~/.my.cnf مع الصلاحيات المناسبة (chmod 600 ~/.my.cnf) لتخزين بيانات الاعتماد بأمان.

2. سكربتات الصيانة (Maintenance)

الصيانة الدورية بتخلي السيرفر شغال زي الفل وبتقلل المشاكل.

أ. تنظيف سجلات النظام (Log Cleanup)

ملفات السجلات (logs) ممكن تكبر بسرعة وتستهلك مساحة القرص. logrotate هو الأداة الأفضل، بس ممكن نعمل سكربت بسيط كمان.

مثال على سكربت بسيط لتنظيف السجلات:
#!/bin/bash

# المتغيرات
LOG_DIR="/var/log"
DAYS_TO_KEEP=30
LOG_FILES=(
    "${LOG_DIR}/nginx/*.log"
    "${LOG_DIR}/apache2/*.log"
    "${LOG_DIR}/syslog"
    "${LOG_DIR}/auth.log"
)

echo "بدء تنظيف السجلات القديمة في ${LOG_DIR}..."

for log_file in "${LOG_FILES[@]}"; do
    # حذف الملفات الأقدم من DAYS_TO_KEEP
    find $(dirname "${log_file}") -type f -name "$(basename "${log_file}")*" -mtime +${DAYS_TO_KEEP} -delete
done

echo "اكتمل تنظيف السجلات."

ملاحظة: الأداة القياسية لتنظيف السجلات هي logrotate، وهي أكثر مرونة وقوة. هذا السكربت مثال بسيط فقط.

ب. مراقبة مساحة القرص (Disk Space Monitoring)

مراقبة مساحة القرص مهمة عشان ما يتعبى فجأة ويوقف السيرفر.

مثال على سكربت لمراقبة مساحة القرص وإرسال إيميل:
#!/bin/bash

# المتغيرات
THRESHOLD=90 # النسبة المئوية للمساحة المستخدمة التي عندها يتم التنبيه
ALERT_EMAIL="your_email@example.com"
HOSTNAME=$(hostname)

# الحصول على استخدام القرص
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//g')

if [ "${DISK_USAGE}" -ge "${THRESHOLD}" ]; then
    echo "تنبيه: مساحة القرص على ${HOSTNAME} تجاوزت ${THRESHOLD}%! الاستخدام الحالي: ${DISK_USAGE}%" | mail -s "تنبيه: مساحة قرص عالية على ${HOSTNAME}" "${ALERT_EMAIL}"
    echo "تم إرسال تنبيه بالبريد الإلكتروني."
else
    echo "مساحة القرص طبيعية على ${HOSTNAME}. الاستخدام الحالي: ${DISK_USAGE}%"
fi

تنبيه: تأكد من تثبيت حزمة mailutils أو ما يعادلها (مثل sendmail أو postfix) على نظامك لكي يعمل أمر mail.

ج. تحديثات النظام (System Updates)

تحديث النظام بانتظام ضروري للأمان والاستقرار.

مثال على سكربت لتحديث نظام Debian/Ubuntu:
#!/bin/bash

# المتغيرات
LOG_FILE="/var/log/system_update.log"

echo "بدء تحديث النظام على $(hostname) في $(date)..." | tee -a "${LOG_FILE}"

# تحديث قائمة الحزم
apt update -y | tee -a "${LOG_FILE}"

# ترقية الحزم المثبتة
apt upgrade -y | tee -a "${LOG_FILE}"

# إزالة الحزم غير الضرورية
apt autoremove -y | tee -a "${LOG_FILE}"

echo "اكتمل تحديث النظام على $(hostname) في $(date)." | tee -a "${LOG_FILE}"

تحذير: تشغيل التحديثات تلقائياً ممكن يسبب مشاكل أحياناً، خصوصاً في بيئات الإنتاج الحرجة. يفضل مراجعة التحديثات يدوياً أو استخدام أدوات مثل unattended-upgrades مع ضبط دقيق.

3. جدولة السكربتات باستخدام cron

بعد ما كتبنا السكربتات، لازم نخليها تشتغل لحالها. cron هو الأداة اللي بتعمل هيك.

خطوات جدولة سكربت:
  1. اجعل السكربت قابلاً للتنفيذ:

    chmod +x /path/to/your_script.sh
  2. افتح جدول cron للمستخدم الحالي:

    crontab -e
  3. أضف السطر الخاص بالجدولة:

    مثلاً، لتشغيل سكربت النسخ الاحتياطي كل يوم الساعة 3 صباحاً:

    0 3 * * * /path/to/your_backup_script.sh >> /var/log/backup_cron.log 2>&1

    الـ >> /var/log/backup_cron.log 2>&1 بيضمن إنه أي إخراج أو أخطاء للسكربت رح تتسجل بملف، وهذا مهم جداً للمتابعة.

صيغة cron:
* * * * * command_to_execute
| | | | |
| | | | ----- يوم الأسبوع (0-7, 0 و 7 هي الأحد)
| | | ------- الشهر (1-12)
| | --------- يوم الشهر (1-31)
| ----------- الساعة (0-23)
------------- الدقيقة (0-59)

خاتمة

الأتمتة هي عمود أساسي في إدارة أنظمة لينكس. السكربتات اللي شفناها اليوم هي مجرد بداية. بتقدر تطورها وتضيف عليها ميزات مثل إرسال التقارير، التكامل مع أنظمة المراقبة، وغيره. بس الأهم إنك تبدأ وتخلي سيرفراتك آمنة ومستقرة.

بالتوفيق!