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

## الإعداد

من إعدادات المنصة فعّل النسخ واختر كل 12 أو 24 ساعة، مدة الاحتفاظ، ووجهة Local أو S3-compatible. يعمل الفحص عبر Scheduler كل ساعة. يمكن طلب نسخة يدويًا من الشاشة. تشفّر رموز النسخ وChat ID في قاعدة البيانات.

## صيغة النسخة

ينشئ العامل dump من MySQL/MariaDB، يضغطه بـgzip، ثم يشفره على دفعات باستخدام libsodium `secretstream` ومفتاح مشتق من `APP_KEY`. لا ترسل قاعدة بيانات خامًا إلى Telegram؛ إذا ضبطت وجهة Telegram، يُرسل الملف المشفر فقط. يسجل `backup_runs` الحجم وSHA-256 والحالة والوجهة.

## استعادة آمنة يدويًا

نفّذ الاستعادة إلى **قاعدة بيانات فارغة منفصلة** أولًا، وأوقف استقبال الكتابة عند نقل الاستعادة إلى الإنتاج. تحقق من checksum المسجل في `backup_runs` ثم شغّل:

```bash
php artisan sms:backup:restore /secure/path/backup-123.sql.gz.sodium \
  --sha256=EXPECTED_64_CHAR_SHA256 \
  --confirm
```

الأمر يتطلب كتابة `RESTORE` تفاعليًا ويفك التشفير والتحقق من التوقيع قبل تنفيذ SQL. لا توجد استعادة من واجهة الويب. افحص تسجيل الدخول وعدد العملاء والرسائل والعلاقات والطابور بعد الاستعادة. لا تكتب مفاتيح الاستعادة أو محتوى SMS في سجلات الدعم.

## قيود التشغيل

- النسخة تحتاج PHP sodium و`APP_KEY` نفسه الذي استُخدم وقت النسخ.
- أمر Backup يقرأ جميع جداول DB، وقد يتجاوز زمن PHP المتاح لخطة مشتركة كبيرة؛ اختبر الحجم وزمن المهمة أولًا.
- فقد `APP_KEY` يمنع فك النسخ الحالية والحقول المشفرة. خزّن نسخة المفتاح في Vault منفصل ومقيّد.
- ملفات النسخ المحلية تحت storage خاص. ينظف Scheduler النسخ الأقدم من Retention؛ تحقق دوريًا من الحذف على S3.
- نفّذ اختبار استعادة دوريًا على نسخة معزولة. وجود ملف ناجح وحده لا يثبت قابلية الاستعادة.
