sbarbase
المحتويات

الاستعادة

ما هي

يوفر دليل النسخ الاحتياطي والاستعادة إجراءات المشغّل الحالية: النسخ اليومي عبر lab/backup.py، والاستعادة، والنسخ المشفّرة خارج الخادم عبر lab/backup_offsite.py (مجموعات التشغيل، وهي الطريقة الموصى بها) وlab/offsite.py. في 2026-10-17 نجحت على الخادم الحقيقي استعادة من مجموعة تشغيل في Cloudflare R2 وحدها. ويأخذ الإجراء نفسه نسخة من قاعدة بيانات الإدارة، ويعيد إنشاء بيئة منسوخة على تثبيت جديد بالأمر sbarbase relink، ويعيد بناء عنقود قاعدة البيانات كله من تشغيل نسخ واحد بـlab/cluster_rebuild.py، خطوةً يشرف عليها المشغّل. والمفتاح الجذري لـVault يخص الخادم، ولا تحمله النسخة الاحتياطية. ولم تُجرَّب بعد إعادة بناء التثبيت كله بعد فقد خادمه من النسخة الخارجية.

وتصف بقية هذه الصفحة تجربة سابقة للنقل إلى محرك منفصل باستخدام بيئة اختبار محددة. هذه التجربة تأخذ بيئة واحدة، فتوقف الكتابة فيها، وتصدّرها مشفّرة، وتستعيدها إلى محرك قاعدة بيانات منفصل، وتتحقق من وصول كل شيء، وبعد ذلك فقط توجّه حركتها إلى النسخة الجديدة. تحتفظ البيئات الأخرى على الخادم ببياناتها، ويُعاد تشغيلها بعد ذلك.

لماذا

الخيار: استعد إلى هدف معزول، وتحقق، ثم حوّل. الاستعادة التي تكتب فوق القاعدة العاملة في مكانها لا تترك شيئًا ترجع إليه إذا ساءت الأمور. أما الاستعادة إلى محرك جديد فتُبقي المصدر سليمًا، وإن كان مسيّجًا، حتى تُفحص النسخة، بما في ذلك الهويات وأمان مستوى الصفوف وروابط الملفات الموقّعة القديمة.

البدائل المرفوضة.

كيف بُنيت تجربة النقل إلى محرك منفصل

خمس خطوات: إيقاف الكتابة، ثم تصدير مشفّر، ثم استعادة إلى محرك مستقل، ثم تحقق، ثم تحويل المسار؛ إذا فشل التحقق تبقى بيانات المصدر سليمة ومسيّجة حتى يعيد المشغّل فتحها، والتصدير يوقف Storage المشترك لكل البيئات على المحرك

تحقق قبل التحويل. التصدير ما زال يوقف Storage المشترك لكل البيئات على المحرك.

  1. السياج. يوضع سجل توجيه البيئة في الصيانة، فتجيب البوابة بـ503 بدل تمرير الطلب. وتُحوَّل حسابات دخول خدماتها الثلاثة المحصورة إلى NOLOGIN، وتُكتب حالتها الأصلية في سجل العملية، بينما يبقى المشغّل قادرًا على القراءة والتفريغ.
  2. التصدير. يلتقط lab/cutover-export.py تفريغ القاعدة، وحسابات الدخول المحصورة وعضوياتها، وصلاحيات القاعدة وإعداداتها، ومحتوى الملفات وسماتها الممتدة، وإعدادات مستأجر Storage ومفاتيح توقيع روابطه. تُشفَّر الحزمة بـ AES-256-GCM، ويُحفظ المفتاح منفصلًا عنها، وكلاهما بصلاحيات 0600 وخارج Git.
  3. الإغلاق. بعد حفظ الملف المشفّر، تُضبط قاعدة المصدر لترفض كل الاتصالات. هذه حالة داخل PostgreSQL، فتبقى بعد إعادة التشغيل.
  4. الاستعادة. محرك PostgreSQL جديد مثبّت الإصدار، بكلمة مرور مدير جديدة وشبكة ووحدة تخزين خاصة به، يستقبل التفريغ في معاملة واحدة. تُعاد بناء بيانات Storage الوصفية وملفاته، ويُعاد تشفير مفاتيح التوقيع بمفتاح الهدف نفسه مع الإبقاء على معرّفاتها.
  5. التحقق. تُقارن أعداد الصفوف في الجداول وبصمات المحتوى، وتُفحص الأدوار المحصورة والصلاحيات. يبدأ Auth وREST الأصليان على النسخة، ويدخل المستخدم الأصلي بكلمة مروره الأصلية، ويقرأ صفوفًا يحميها أمان مستوى الصفوف، ويعيد رابط موقّع صدر قبل التصدير تنزيل البايتات نفسها.
  6. التحويل. يُجهَّز مكان التشغيل الجديد على سجل التوجيه، ثم يُستأنف التوجيه مع فحص رقم المراجعة.
  7. البيئات المجاورة. اضطر التصدير إلى إيقاف Storage المشترك، فتوقفت كل بيئات المصدر طوال مدته. تعود البيئات غير المعنية الآن إلى العمل على المصدر، بينما تبقى البيئة المنقولة موجّهة إلى الهدف.

الكود: lab/source_fence.py، lab/cutover-export.py، lab/recovery_bundle.py، lab/recovery-restore-db.py، lab/recovery-check-services.py، lab/recovery_reconcile.py، lab/target_runtime.py، src/control/placement.ts. إجراء المشغّل موجود في النسخ الاحتياطي والاستعادة.

حدود تجربة النقل السابقة

ما تحتاجه الاستعادة الكاملة

ما زال قبول الاستعادة الكاملة يحتاج إثبات اتساق الملفات مع قاعدة البيانات، ونقل أعضاء التثبيت ومفاتيحه وإعداداته وحالة الميزات، والتحقق على خادم مستقل. حدود الحزمة ذات 32 MiB المذكورة أعلاه تخص تجربة النقل السابقة وحدها. كما لا يثبت فحص المحرك الأصلي التجريبي استعادة بيئة بكل آثارها الخارجية؛ تسجّل خطة المنتج وسجل الأدلة هذه الفجوات.

للتعمق

عدّل على GitHub