النسخ الاحتياطي والاستعادة
0

لماذا نحتاج نسخاً احتياطية أصلاً؟

قاعدة البيانات (MySQL) تحفظ كل شيء: أسماء الموظفين، سجل الحضور، الرواتب المرتبطة، الطلبات، المهام. لو انمحت بالخطأ (أمر خاطئ، قرص تالف، هجوم فدية) بدون نسخة احتياطية، فهذا يعني فقدان كل تاريخ الشركة مع الموظفين للأبد. النسخ الاحتياطي ليس رفاهية، بل تأمين إجباري لأي نظام يحتوي بيانات حقيقية للموظفين.
1

نسخة يدوية سريعة

قبل أن نُؤتمت أي شيء، جرّب الأمر يدوياً مرة حتى تفهم بالضبط ماذا يحدث.
1

تصدير قاعدة البيانات كاملة إلى ملف واحد

mysqldump -u workup_user -p workup > ~/workup_backup_$(date +%F).sql

mysqldump يقرأ كل جدول بقاعدة workup ويحوّله لأوامر SQL نصّية داخل ملف واحد (نفس فكرة ملف db.sql الذي استوردناه بالتثبيت، لكن هذه المرة يحتوي بياناتك الحقيقية). $(date +%F) يضيف تاريخ اليوم لاسم الملف تلقائياً (مثل workup_backup_2026-07-17.sql) حتى لا تخلط بين النسخ.

تأكد أن الملف تكوّن فعلاً وحجمه منطقي (ليس صفراً):

ls -lh ~/workup_backup_*.sql
2

نسخ تلقائي يومي عبر Cron

لا تعتمد على ذاكرتك لتشغيل الأمر يدوياً كل يوم — اجعل السيرفر يفعلها بنفسه في وقت ثابت (مثلاً 3 فجراً، عندما لا أحد يستخدم النظام).
2

إنشاء سكربت نسخ احتياطي بسيط

sudo mkdir -p /var/backups/workup
sudo nano /usr/local/bin/workup-backup.sh

الصق هذا المحتوى بالضبط:

#!/bin/bash
# تاريخ اليوم، يُستخدم بتسمية الملفات
DATE=$(date +%F)

# نسخة قاعدة البيانات
mysqldump -u workup_user -p'ضع_كلمة_المرور_هنا' workup > /var/backups/workup/db_$DATE.sql

# نسخة مجلد files (الصور والمرفقات) كملف مضغوط واحد
tar -czf /var/backups/workup/files_$DATE.tar.gz -C /var/www/html/WorkUp files

# نحذف أي نسخة أقدم من 14 يوماً حتى لا يمتلئ القرص
find /var/backups/workup -type f -mtime +14 -delete

هذا السكربت يفعل ثلاثة أشياء بالترتيب: (1) ينسخ قاعدة البيانات، (2) يضغط مجلد files بأكمله بملف واحد صغير، (3) يحذف النسخ الأقدم من أسبوعين تلقائياً حتى لا تمتلئ مساحة القرص بمرور الوقت.

اجعل السكربت قابلاً للتنفيذ:

sudo chmod +x /usr/local/bin/workup-backup.sh
ضع كلمة مرور workup_user الحقيقية بدل ضع_كلمة_المرور_هنا، واحرص أن يكون هذا الملف مقروءاً فقط من المدير: sudo chmod 700 /usr/local/bin/workup-backup.sh — لأنه يحتوي كلمة مرور قاعدة البيانات كنص صريح.
3

جدولته يومياً عبر crontab

sudo crontab -e

أضف هذا السطر بآخر الملف (اختر nano إن سألك عن محرر):

0 3 * * * /usr/local/bin/workup-backup.sh

هذا يعني حرفياً: "شغّل هذا السكربت كل يوم الساعة 3:00 فجراً". الأرقام الخمسة هي (بالترتيب): الدقيقة، الساعة، يوم الشهر، الشهر، يوم الأسبوع — والنجمة * تعني "كل قيمة، بدون شرط".

3

نسخ مجلد files (الصور والمرفقات)

قاعدة البيانات وحدها لا تكفي! صور الموظفين ومرفقات المهام مخزّنة كملفات فعلية داخل مجلد files/ على القرص، وليست بداخل قاعدة البيانات. لهذا السكربت بالأعلى يأخذ نسخة منه أيضاً (tar -czf) بجانب نسخة قاعدة البيانات — الاثنان معاً يشكّلان "نسخة احتياطية كاملة" حقيقية.
4

حفظ نسخة خارج السيرفر

أخطر خطأ شائع: ترك كل النسخ الاحتياطية على نفس القرص الصلب للسيرفر الأصلي. لو تعطّل السيرفر نفسه (حريق، سرقة، عطل قرص)، تضيع النسخ معه أيضاً!
4

انسخ النسخ الاحتياطية لمكان آخر تماماً بشكل دوري

أبسط طريقة: انسخها من جهازك الشخصي (وليس من السيرفر) بأمر واحد أسبوعياً:

scp root@عنوان_IP_السيرفر:/var/backups/workup/*.sql ~/workup-backups-local/
scp root@عنوان_IP_السيرفر:/var/backups/workup/*.tar.gz ~/workup-backups-local/

بدائل أفضل للمدى الطويل: رفعها تلقائياً لخدمة تخزين سحابي (Google Drive، Dropbox، أو Amazon S3) عبر أداة مثل rclone. الفكرة الأساسية واحدة دائماً: لا تثق بمكان واحد فقط.

5

كيف تستعيد نسخة عند الحاجة

هذا القسم الأهم — تدرّب عليه قبل أن تحتاجه فعلياً في موقف طارئ.
5

استعادة قاعدة البيانات

mysql -u workup_user -p workup < /var/backups/workup/db_2026-07-17.sql
هذا الأمر "يكتب فوق" أي بيانات موجودة حالياً بقاعدة workup. تأكد أنك فعلاً تريد الاستعادة (وليس فقط تجربة) قبل تنفيذه على سيرفر فيه بيانات حيّة.
6

استعادة مجلد files

# فك الضغط في مكان مؤقت أولاً للتأكد من محتواه
tar -xzf /var/backups/workup/files_2026-07-17.tar.gz -C /tmp/restore-check

# بعد التأكد، انسخه للمكان الفعلي (يستبدل المجلد الحالي)
sudo rm -rf /var/www/html/WorkUp/files
sudo tar -xzf /var/backups/workup/files_2026-07-17.tar.gz -C /var/www/html/WorkUp
sudo chown -R www-data:www-data /var/www/html/WorkUp/files
sudo chmod -R 775 /var/www/html/WorkUp/files

لا تنسَ إعادة ضبط الصلاحيات بعد الاستعادة (نفس صلاحيات خطوة التثبيت) — الملفات المستعادة من نسخة احتياطية قد تحمل صلاحيات مختلفة عن ما يحتاجه الخادم.

6

قائمة تحقق سريعة

جرّبت أمر mysqldump يدوياً مرة واحدة على الأقل ورأيت الملف الناتج.
سكربت النسخ التلقائي مجدول عبر crontab ويعمل يومياً.
النسخ القديمة (أكثر من 14 يوم) تُحذف تلقائياً بدل ملء القرص.
يوجد نسخة من النسخ الاحتياطية في مكان آخر غير السيرفر نفسه (جهازك، أو تخزين سحابي).
جرّبت عملية الاستعادة الكاملة مرة واحدة على الأقل (على سيرفر تجريبي، وليس الحقيقي) حتى تعرف أنها تعمل فعلاً.
نسخة احتياطية لم تُختبَر يوماً = لا نسخة احتياطية أصلاً. اختبرها بانتظام.
النسخ الاحتياطي WorkUp