Relayium

أتمتة النسخ الاحتياطي المُشفَّر للخادم باستخدام مهمة cron

آخر تحديث: 2026-09-01

النسخ الاحتياطي الذي عليك أن تتذكر تشغيله لا يحدث. أما cron فيتذكر، وواجهة Relayium CLI مبنية لذلك: أمر واحد غير تفاعلي ينسخ (أو يعكس) مجلدًا إلى جهاز آخر ويتحقق من كل ملف يَنقله.

يغطي هذا الدليل جدولة relayium push وrelayium sync التزايدي عبر cron، ووسيلة النقل daemon direct التي يستخدمها كلاهما، وأسطر crontab الجاهزة للنسخ.

push مقابل sync: نسخة كاملة أم مرآة تزايدية

كلٌّ من push وsync ينقل مجلدًا إلى جهاز آخر، وكلاهما آمن للتشغيل المتكرر، لكنهما يحلّان مشكلتَي نسخ احتياطي مختلفتَين قليلًا.

ينشئ push نسخة daemon direct لمرة واحدة آمنة من التعارض، ويرفض وجهة موجودة بدل الكتابة فوقها أو الاستئناف — ولذا لا يناسب مهمة متكررة نحو مجلد استقبال ثابت. أما sync فيُبقي الوجهة مرآة تزايدية أحادية الاتجاه للمصدر: يتخطى الملفات غير المتغيّرة ويرسل المتغيّرة ويُكمل الملف الجزئي في التشغيل التالي. ولأنه مرآة فهو يعكس الحالة الحالية لا التاريخ: فقد يُنقل حذف ملف في المصدر أو تلفه.

  • استخدم push نحو وجهة مؤرَّخة حين تريد أن يكون كل تشغيل قائمًا بذاته وأن تبقى النسخ الأقدم.
  • استخدم sync لمجلد كبير أو كثير التغير حيث تكون إعادة إرسال كل شيء كل ليلة إهدارًا.
  • يتحقق كلاهما من كل ملف منقول بـ SHA-256. لا يستأنف push، بينما يُكمل sync الملف الجزئي في تشغيل لاحق.

قبل أن تبدأ

كل ما يلي هو relayium CLI، فثبّته أولًا إن لم تكن قد فعلت. على macOS وLinux، يُسقط أمر واحد ملفًا ثنائيًا مُسبق البناء في PATH الخاص بك:

curl -fsSL https://relayium.com/install.sh | sh
  • تفضّل اختيار الملف بنفسك، أو تعمل على Windows؟ احصل على ملف ثنائي من صفحة الإصدارات — يسرد relayium.com/cli كل خيارات التثبيت (أو go build ./cmd/relayium إن كان لديك Go).
  • يؤكّد relayium --version أنه مثبَّت. تخطَّ هذا وستطبع الأوامر أدناه ‘command not found’ لا غير.

وسيلة نقل واحدة: daemon-direct

وجّه أيًّا من الأمرين إلى وجهة relayium:// يشغّل جهاز الاستقبال فيها relayium serve. أما وجهات SSH فقد أُوقفت.

# daemon-direct: الوجهة تشغّل "relayium serve"
relayium push ./data relayium://backup-server:9031
  • اتصالات daemon-direct مثبَّتة على TLS 1.3 مع الثقة عند الاستخدام الأول، ثم تُثبَّت على تلك البصمة في كل تشغيل لاحق.
  • يقبل sync صيغة الوجهة relayium:// نفسها التي يقبلها push.

جدولته باستخدام cron

ما تحتاجه قبل الخطوة 1

  • واجهة CLI على الجهازين، مع تشغيل relayium serve على الوجهة.
  • وجهة تشغّل relayium serve واعتمدت هذا المُرسِل مسبقًا. ليس لدى cron طرفية، لذا تُرفض البصمة المجهولة بدل السؤال عنها.
  • دليل مصدر موجود فعلًا في اللحظة التي ينطلق فيها cron — لا دليل على مشاركة شبكية لا تُركَّب إلا وأنت مسجَّل الدخول.
  • مكان تكتب فيه سجلًا. فمهمة cron التي تذهب مخرجاتها إلى العدم هي نسخة احتياطية لن تعرف حالها إلا يوم تحتاجها.

بعد اعتماد المُرسِل مسبقًا، يصبح sync أمرًا واحدًا غير تفاعلي يدخل مباشرةً في crontab. سجّل المخرجات كي تظهر الإخفاقات:

# مرآة تزايدية كل 15 دقيقة
*/15 * * * * relayium sync ~/documents relayium://backup-server:9031 >> ~/relayium-sync.log 2>&1
  1. اعرف أين يوجد relayium فعلًا. فـ cron لا يستخدم PATH الخاص بصدفتك، وinstall.sh يتراجع إلى ‎~/.local/bin‎ حين يتعذّر الكتابة في ‎/usr/local/bin‎ — وهو بالضبط الموضع الذي لا يراه cron أبدًا.

    command -v relayium
  2. تأكّد من أن المستمع قابل للوصول وأن هذا المُرسِل قد اعتُمد بالفعل.

    relayium id
  3. شغّل الأمر كاملًا يدويًا مرة واحدة، مكتوبًا تمامًا كما سيشغّله cron، بما في ذلك المسار المطلق.

    /usr/local/bin/relayium sync ~/documents relayium://backup-server:9031
  4. عندها فقط أضف الجدولة. أبقِ المسار المطلق وإعادة التوجيه كما هما.

    crontab -e
  5. بعد أول تشغيل مجدول، اقرأ السجل بدل أن تفترض. هذه هي الخطوة التي يتخطّاها الناس، وهي نفسها التي كانت ستخبرهم.

    tail -n 20 ~/relayium-backup.log

كيف يبدو إعداد يعمل بشكل صحيح

يُحلّ relayium إلى مسار مطلق يمكنك لصقه في crontab، وينتهي sync يدوي عبر daemon direct برمز 0 دون أن يطلب اعتماد مُرسِل مجهول. والنسخة التي لا تعمل إلا بعد موافقة تفاعلية ليست مجدولة بعد.

$ command -v relayium
/usr/local/bin/relayium
$ /usr/local/bin/relayium sync ~/documents relayium://backup-server:9031
$ echo $?
0
  • يخرج الأمر بحالة غير صفرية إذا فشل أي ملف في فحص سلامته، فتلتقط رسالة cron عند الفشل المشكلات.
  • يلحق sync المنقطع بالركب في التشغيل المجدول التالي: يتخطى ما يطابق سلفًا ويُكمل الملف الجزئي.

عكس عمليات الحذف والمزامنة الفورية

افتراضيًا، لا يفعل sync سوى إضافة الملفات أو تحديثها في الوجهة. أضف --delete لجعله مرآة حقيقية تزيل أيضًا الملفات التي لم تعد موجودة في المصدر — يجب أن يكون الطرف المستقبِل مُنصِتًا صراحةً بـ serve --allow-delete، وإلا تُتجاهَل عمليات الحذف بصمت ويُبلَّغ عنها بأنها مرفوضة. كما يرفض sync استخدام --delete تمامًا إذا لم يُحلَّل مجلد المصدر إلى أي ملف، فلا يمكن لخطأ مطبعي في مسار المصدر أن يمحو الوجهة.

إذا كنت تفضّل ألا تنتظر الدورة التالية لـ cron، يُبقي --watch عمل relayium sync مستمرًا ويعيد المزامنة تلقائيًا بعد لحظة من تغيّر أي ملف تحت المصدر — بديل خفيف عن الاستطلاع وفق جدول زمني.

  • relayium sync ./data relayium://backup-server:9031 --delete يعكس عمليات الحذف (يحتاج المستقبِل إلى serve --allow-delete).
  • relayium sync ./data relayium://backup-server:9031 --watch يبقى مستمرًا ويعيد المزامنة عند التغيّر بدلًا من التشغيل مرة واحدة من cron.

حين لا ينجح الأمر

كل حالة من هذه غير مرئية حتى تنظر في السجل — ولهذا كُتبت إعادة التوجيه ضمن سطر crontab لا كخيار إضافي. والحالة الخامسة أسوأ من كونها غير مرئية: فهي تبدو كالنجاح.

العَرَض، الفحص، الإصلاح

يقول السجل relayium: command not found بينما الأمر نفسه يعمل في صدفتك.
tail -n 5 ~/relayium-backup.log
# /bin/sh: relayium: command not found

يعمل cron بمسار PATH أدنى، غالبًا ‎/usr/bin:/bin‎ فقط. وإن لم يتمكّن install.sh من الكتابة في ‎/usr/local/bin‎ فقد وضع الثنائي في ‎~/.local/bin‎، وهو موضع لن يبحث فيه cron قط. ضع المسار المطلق الذي يعطيه command -v في سطر crontab، أو أضف سطر ‎PATH=‎ في أعلى crontab.

يُظهر السجل «SSH transfers are currently disabled»، أو لا شيء بعد التشغيل الأول.
grep -i "SSH transfers" ~/relayium-sync.log
# SSH transfers are currently disabled. Use relayium pair, or relayium serve with push/sync to relayium://host.

ما زال الأمر المجدول يسمّي وجهة SSH قديمة، وقد أُوقفت عمليات النقل عبر SSH. شغّل relayium serve على خادم النسخ الاحتياطي، واعتمد هناك بصمة relayium id لهذا الجهاز، وغيّر الهدف إلى relayium://backup-server — لم يعد لمفتاح SSH ولا للوكيل ولا لعبارة المرور أي دور.

يعمل sync بنظافة، لكن الملفات المحذوفة من المصدر ما تزال في الوجهة.
grep -i deni ~/relayium-sync.log

الحذف اختيار يفعّله الطرف المستقبِل. وبلا serve --allow-delete في الجهة المقابلة تُتخطّى عمليات الحذف ويُبلَّغ عنها بأنها مرفوضة، ولهذا يوجد الجواب في السجل لا في رمز الخروج. أعد تشغيل مُنصِت الطرف المقابل مع ‎--allow-delete‎.

يرفض sync الخيار ‎--delete‎ رفضًا قاطعًا.
relayium sync ~/documents relayium://backup-server:9031 --delete
# refusing --delete with an empty source: this would delete everything on the destination. Check the path(s).

لم يُحلّ المصدر إلى أي ملف، فكانت المرآة ستفرغ الوجهة. وهذا الرفض مقصود. تحقّق من المسار بحثًا عن خطأ مطبعي، وتحقّق أن ما يُفترض تركيبه هناك مُركَّب فعلًا وقت انطلاق cron لا حين تكون مسجَّل الدخول فقط.

تعمل النسخة الاحتياطية وتنتهي بالرمز 0، لكنها ليست ما تظنه.
ssh user@backup-server command -v relayium

يتطلب push وsync الحاليان مستمع Relayium. ثبّت CLI على الوجهة وشغّل serve واعتمد المُرسِل واستخدم هدف relayium://؛ لا توجد وسيلة نقل بديلة صامتة.

الأسئلة الشائعة

هل يحتاج خادم النسخ الاحتياطي إلى تثبيت relayium؟

نعم. يستخدم push وsync الحاليان بروتوكول daemon direct الأصلي ويتطلبان relayium serve على جهاز الاستقبال. لا يوجد تراجع إلى SSH أو tar.

هل النسخة الاحتياطية مُشفَّرة ومُتحقَّق منها؟

نعم أثناء النقل، ويُتحقق من كل ملف منقول بـ SHA-256. يقرر sync ما يرسله بحسب الحجم ووقت التعديل، فلا يُعاد حساب تجزئة الملف المُتخطّى. وتطابق أحجام المجلدات فحص تقريبي، لا دليل على أن المحتويات المُتخطّاة ما زالت متطابقة.

ماذا يحدث إذا قوطعت مهمة cron في منتصفها؟

يعتمد على الأمر الذي جدولته. sync يُكمل: التشغيل التالي يتخطى ما يطابق سلفًا ويُكمل ملفًا جزئيًا، و‏--no-resume يوقف ذلك. أما push فلا يستأنف — فهو يرفض وجهة موجودة سلفًا؛ لذا جدوِل sync للتشغيل المتكرر أو ادفع بـ push إلى وجهة جديدة في كل تشغيل. و‏--no-resume مقبول في push ولا يفعل شيئًا.

هل يمكن أن يمحو --delete وجهتي بالخطأ؟

يرفض sync التشغيل مع --delete إذا لم يحتوِ مجلد المصدر على أي ملف، ويجب تشغيل المستقبِل بـ serve --allow-delete حتى تسري عمليات الحذف أصلًا — وإلا تُتجاهَل ويُبلَّغ عنها إليك.

هل أحتاج إلى حساب، وهل يكلّف هذا شيئًا؟

لا. واجهة CLI مجانية، ولا يحتاج push/sync عبر daemon direct إلى حساب Relayium ولا إلى دفع لكل عملية نقل.

ضع نسخك الاحتياطية على جدول لا يتوجب عليك تذكّره — مُشفَّرة أثناء النقل، مُتحقَّق منها لكل ملف، ومجانية.

احصل على CLI

تابع القراءة