نسخ مستودع
انسخ بيئة إنتاجية كاملة (التطبيق وقاعدة البيانات وملفات الإعداد) في ثوانٍ. بأي حجم. دون قرص إضافي. انسخ كما تشاء.
الشعار: انسخ الإنتاج، دون أي خطر.
شاهد الدرس التعليمي
جهّز شيئًا للمخاطرة به
أولًا، أضف ملفًا للتطبيق الجاري حتى تتمكن من إثبات عزل النسخة. افتح المستودع في VS Code، ثم داخل المستودع أنشئ ملف علامة:
rdc vscode connect -m my-server -r my-app
echo "Hello from production" > index.html
الآن انسخه.
النسخ
rdc repo fork --parent my-app -m <machine-name> --tag experiment --up أمر واحد يستنسخ الـ repo بالكامل: التطبيق وقاعدة البيانات وملفات الإعداد. وقت الـ fork ثابت بغض النظر عن حجم الـ repo، سواء كان غيغابايت واحداً أو مئة غيغابايت أو تيرابايت.
أمر واحد. نسخ كل شيء (التطبيق وقاعدة البيانات وملفات الإعداد) وحدث ذلك في ثوانٍ. شغّله مرة أخرى وتحصل على نسخة مستقلة أخرى.
لماذا هو سريع جدًا؟
السبب هو الروابط الناسخة بـ btrfs. النسخة تنشئ شجرة نظام ملفات جديدة تشير إلى كتل البيانات ذاتها من المستودع الأصل. لا يتم نسخ أي بيانات عند إنشاء النسخة. كل شيء هو بيانات وصفية، لذا حجم المستودع الأصل لا يؤثر على المدة التي تستغرقها النسخة.
النسخ يعمل بالطريقة نفسها. 1 جيجابايت، 100 جيجابايت، 1 تيرابايت. نفس الوقت، في كل مرة.
ما هو مشترك، وما هو لك
فكّر في المستودع الأصل كمصدر ثابت. نسختك هي عرض نسخ-عند-الكتابة منه. عندما تكتب في النسخة، تبقى الكتابة في النسخة. المستودع الأصل لا يتحرك، مهما كان عدد النسخ التي تشير إليه.
لا يمكنك الإمساك بالشمس، لكن يمكنك الإمساك بها في مرآة.
ماذا لو تغيّر الأصل لاحقًا؟
الآن فكّر في لقطة فوتوغرافية. عندما تنسخ، تجمّد المستودع الأصل في تلك اللحظة بالذات. المستودع الأصل يواصل الحركة. نسختك لا تتحرك.
إذا تغيّر المستودع الأصل لاحقًا، تبقى نسختك في مكانها.
لا يمكنك الإمساك بنهر، لكن يمكنك الإمساك به في صورة.
استخدام القرص يبقى ثابتًا
لهذا السبب لا ينفجر قرصك. خمس نسخ من مستودع 100 جيجابايت؟ لا تزال حوالي 100 جيجابايت إجمالًا. تدفع قرصًا فقط لما تغيّره في كل نسخة.
انسخ خمس مرات إذا أردت. قرصك لن يلاحظ حتى.
ما لا ترثه النسخ: الأسرار
هناك شيء واحد لا تتبعه النسخة عن قصد: الأسرار. تبدأ النسخة بدون مفاتيح API، دون كلمات مرور قواعد البيانات، دون رموز Stripe. لهذا السبب يعمل شعار “انسخ الإنتاج، دون أي خطر” بالفعل. لا يمكن لصندوق الرمل الخاص بك محاسبة عملاء حقيقيين لأنه لا يستطيع التظاهر بأنه أنت. سنُعدّ ذلك بشكل صحيح في درس إدارة الأسرار.
التحقق من العزل
أدرج المستودعين جنبًا إلى جنب:
rdc repo list -m <machine-name> يتعايش كلا الـ repos الآن على نفس الجهاز والقرص كبيئتين مستقلتين تماماً.
ستجد my-app وmy-app:experiment يعملان بالتزامن. في المستودع الأصلي، ملف العلامة موجود تمامًا حيث تركته:
rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html' تحقق من العزل بفحص الـ repo الأصلي: يبقى ملف العلامة في مكانه. إنشاء fork لا يعدّل الأصل.
الآن أجرِ تغييرًا تدميريًا، لكن داخل النسخة فقط:
rdc term connect -m <machine-name> --repository my-app:experiment --command 'rm index.html && echo removed' احذف ملف العلامة داخل الـ fork فقط. هذا تغيير مدمر مقتصر على الـ fork.
ارجع إلى الأصلي وتحقق:
rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html' ارجع إلى الـ repo الأصلي: يبقى ملف العلامة سليماً. يتشارك الأصل والـ fork نفس الصورة لكنهما يعملان على Docker daemons منفصلة وأنظمة ملفات منفصلة.
ملف العلامة لا يزال هنا سليمًا. بقيت تغييرات النسخة في النسخة. نفس الصور، محركات Docker منفصلة، أنظمة ملفات منفصلة.
التنظيف
عند الانتهاء، احذف النسخة فقط:
rdc repo delete --name my-app:experiment -m <machine-name> احذف الـ fork عند الانتهاء. الـ repo الأصلي لا يتأثر، مما يتيح سير عمل آمن قائم على fork والتجريب والتجاهل.
يبقى الأصل كما كان تمامًا. انسخ، وجرّب، وكسّر الأشياء، واحذف. دون أي خطر.
التالي: عزل النسخة في العمل.