التنظيف
يقوم التنظيف بإزالة الحالة التي لم تعد تتوافق مع مورد حي. تغطي ثلاثة أوامر ثلاثة نطاقات مختلفة:
| الأمر | ما الذي يُنظِّفه | مكان مصدر الحقيقة |
|---|---|---|
rdc storage prune --name <storage> -m <machine> | النسخ الاحتياطية المعزولة في التخزين السحابي | إعدادات CLI المحلية (مع التحقق المتقاطع مع جهاز التنفيذ لأمان التحميل) |
rdc machine prune --name <machine> | عناصر مخزن البيانات على الجهاز (دائماً)؛ صور المستودعات المعزولة أو غير المعروفة (اختياري) | إعدادات CLI المحلية + مرآة .interim/state على الجهاز |
rdc config prune | بقايا الإعدادات المحلية (ذاكرة شهادات مؤقتة، أرشيفات منتهية، إشارات متقاطعة معلقة) | إعدادات CLI المحلية فقط |
الأوامر الثلاثة مستقلة. يمكن تشغيل أي منها دون الآخرين. تتشارك في نموذج أمان مشترك موصوف في قسم نموذج الأمان أدناه.
فحص أمان التحميل المسبق
كل من storage prune و machine prune --prune-unknown يُجريان فحص أمان تحميل مسبقاً قبل حذف أي شيء: يستعلمان من جهاز التنفيذ عن المستودعات المُحمَّلة أو العاملة حالياً، ويتقاطعان مع المرشحات للحذف، ويرفضان حذف مرشح لا يزال حياً على الجهاز. حذف النسخة الاحتياطية خارج الجهاز لمستودع مُحمَّل، أو حذف صورة مستودع حية، هو فخ حقيقي لفقدان البيانات. يجعل الفحص المسبق ذلك مستحيلاً عرضياً.
للتجاوز (نادر؛ فقط عندما تعرف فعلاً أن الحالة الحية خاطئة)، مرّر --force-delete-mounted. هذه راية منفصلة عن --force (التي تتحكم في فترة سماح الأرشيف) بحيث يبقى منفذا الهروب متمايزين.
تنظيف التخزين
يفحص مزود تخزين ويحذف النسخ الاحتياطية التي لم تعد معرّفات GUID الخاصة بها تظهر في أي ملف إعدادات محلي.
# المعاينة فقط — إظهار ما سيتم حذفه
rdc storage prune --name my-s3 -m server-1 --dry-run
# حذف النسخ الاحتياطية المعزولة فعلياً (السلوك الافتراضي)
rdc storage prune --name my-s3 -m server-1
# تجاوز فترة السماح (الافتراضي 7 أيام)
rdc storage prune --name my-s3 -m server-1 --grace-days 14
# تجاوز فحص أمان التحميل (استخدم بحذر)
rdc storage prune --name my-s3 -m server-1 --force-delete-mounted
--machine مطلوب لأن استدعاءات rclone تعمل على جهاز التنفيذ، وليس على جهازك المحمول. لا يُتوقع من العملاء تثبيت rclone محلياً. لا تزال بيانات اعتماد التخزين تأتي من إعداداتك المحلية؛ الجهاز هو مجرد مُشغِّل لـ rclone.
ما الذي يتم فحصه
- يسرد جميع معرّفات GUID للنسخ الاحتياطية في التخزين المحدد (عبر مجلدَي
hot/وcold/الفرعيين. راجع النسخ الاحتياطي والاستعادة). - يفحص كل ملف إعدادات على القرص (
~/.config/rediacc/*.json). - تكون النسخة الاحتياطية معزولة إذا لم يكن معرّف GUID الخاص بها مُشاراً إليه في قسم المستودعات في أي إعدادات.
- المستودعات المؤرشفة حديثاً ضمن فترة السماح تكون محمية حتى لو أُزيلت من الإعدادات النشطة.
- فحص أمان التحميل المسبق: معرّفات GUID المُحمَّلة حالياً على
--machineيتم تخطيها والإبلاغ عنها، ولا تُحذف أبداً.
الأداء
تُجمَّع عمليات الحذف لكل مسار فرعي في التخزين: استدعاء rclone واحد لكل مجلد hot/ أو cold/ بغض النظر عن عدد معرّفات GUID التي ستُزال. تتقلص قائمة انتظار من 11 معزولاً من نحو 50 ثانية من أعباء SSH إلى رحلة ذهاب وإياب واحدة لكل مسار فرعي.
تنظيف الجهاز
ينظف الموارد على الجهاز في ثلاث مراحل. تعمل المرحلة 1 دائماً؛ بينما المرحلتان 2 و 3 اختياريتان ومتكاملتان.
المرحلة 1: تنظيف مخزن البيانات (يعمل دائماً)
يزيل كل نوع من الموارد الذي قد يتبقى عند حذف مستودع أو عندما تؤدي إعادة هيكلة على مستوى الجهاز إلى التخلص من اتفاقية تسمية قديمة. يتم فحص كل فئة بشكل مستقل، والتنظيف عبارة عن تمرير واحد قابل للتكرار (idempotent)، لذا فإن تشغيل prune مرات متعددة آمن ويتقارب نحو مخزن بيانات نظيف.
| الفئة | ما يتم إزالته |
|---|---|
| مجلدات تحميل فارغة | مجلدات mounts/<guid>/ بدون صورة مستودع خلفها |
| مجلدات غير قابلة للنقل معزولة | مجلدات immovable/<guid>/ بدون صورة مستودع خلفها |
| ملفات قفل قديمة | repositories/.lock-<guid> لمستودعات محذوفة |
| لقطات نسخ احتياطي قديمة | .snapshot-* و .backup-* تركتها عمليات نسخ احتياطي أُوقفت قسراً |
| مجلدات sandbox خاصة بـ VS Code معزولة | .interim/sandbox/<name> لمستودعات لم تعد نشطة على الجهاز |
| سلاسل iptables معزولة | سلاسل REDIACC_WILDCARD_<N> و DOCKER_ISOLATED_NET_<N> لشبكات محذوفة |
مُدخلات authorized_keys معزولة | أسطر sandbox-gateway <repo> --guid <uuid> التي لم يعد وسمها --guid يتطابق مع أي مجلد تحميل نشط |
يبحث ماسح authorized_keys في /home/*/.ssh/authorized_keys و /root/.ssh/authorized_keys. يُحتفظ بالمدخلة فقط إذا كان وسم --guid الخاص بها يُعيّن إلى GUID لمجلد تحميل حي، لذا تُحفظ دائماً المستودعات المنشورة حالياً على الجهاز بصرف النظر عما إذا كان اسمها يظهر في أي مكان على القرص. المدخلات القديمة التي كُتبت قبل أن يبدأ renet بإضافة وسم --guid لا يمكن التحقق منها ويُبلَّغ عنها دائماً كمعزولة.
# تشغيل تجريبي يُظهر ما سيُزال (دون تطبيق أي تغيير)
rdc machine prune --name server-1 --dry-run
# تنفيذ التنظيف
rdc machine prune --name server-1
تنظيف تتالي. تعتمد بعض الفئات على فئات سابقة. على سبيل المثال، قد يكشف حذف مجلدات التحميل الفارغة عن مجلدات sandbox معزولة إضافية فقدت لتوها مجلد التحميل الذي كان يدعمها. يؤدي تشغيل
rdc machine pruneللمرة الثانية إلى التقاط هذا التتابع وإكمال التنظيف. ينتهي التشغيل التجريبي الأخير بالرسالةNo orphaned resources found. Datastore is clean.عندما لا يتبقى شيء للقيام به.
المرحلة 2: --orphaned-repos (تنظيف خشن)
باستخدام --orphaned-repos، يحذف CLI أيضاً صور المستودعات على الجهاز التي لا تظهر في أي ملف إعدادات محلي.
rdc machine prune --name server-1 --orphaned-repos --dry-run
rdc machine prune --name server-1 --orphaned-repos
هذا خشن. يحذف كل ما هو غير موجود في إعداداتك المحلية، بما في ذلك النسخ المتفرعة الشرعية المُدارة بأدوات أخرى أو من نسخة CLI لمشغل آخر. إذا كانت مرآة renet .interim/state تُحدد بشكل صحيح أن مستودعاً ما هو نسخة متفرعة لكن الإعدادات المحلية لم تره أبداً، تظل هذه المرحلة تزيله. يُفضَّل استخدام المرحلة 3 (--prune-unknown) عندما تريد التحفظ.
المرحلة 3: --prune-unknown (دقيق)
باستخدام --prune-unknown، يحذف CLI فقط المستودعات التي تفشل كلتا الإشارتين في تصنيفها: ليست في أي إعدادات محلية و لا يوجد لها إدخال موسوم كنسخة متفرعة في مرآة .interim/state على الجهاز (راجع المستودعات. عمود Type).
rdc machine prune --name server-1 --prune-unknown --dry-run
rdc machine prune --name server-1 --prune-unknown
في الممارسة، --prune-unknown هو ما تريده للتنظيف الروتيني؛ بينما --orphaned-repos صحيح فقط عندما تكون متأكداً أن إعداداتك المحلية هي الجرد الكامل والموثوق لكل مستودع على الجهاز. تقع كل من النسخ المتفرعة القديمة السابقة للمرآة والمستودعات التي حُذف إدخالها من الإعدادات عن طريق الخطأ في حاوية “غير معروف”. فهي حالات غير مؤكدة فعلاً، والراية الدقيقة تطلب من المشغل الإقرار بذلك صراحةً.
يعمل فحص أمان التحميل المسبق في هذه المرحلة أيضاً: مستودع مُحمَّل حالياً على --machine يُبلَّغ عنه ويُتخطى ما لم يُمرَّر --force-delete-mounted.
# مدموج: تنظيف كامل للجهاز عبر المسار الجراحي المدرك للنسخ المتفرعة
rdc machine prune --name server-1 --prune-unknown
تنظيف الإعدادات
يكنس البقايا القديمة داخل ملف الإعدادات المحلي على ~/.config/rediacc/<config>.json. محلي بحت. بدون SSH، بدون استدعاءات renet. يتم تنظيف ثلاث حاويات:
- مدخلات ذاكرة شهادات ACME المؤقتة التي لم تعد نقطة ارتكازها (GUID أو اسم مستودع أو اسم جهاز) في الإعدادات النشطة. لا يمكن لرموز الشهادات العامة (wildcards) التوجيه إلى أي مكان، لذا فهي وزن ميت.
- المستودعات المؤرشفة المنتهية في
resources.deletedRepositories[]. المدخلات التي يكونdeletedAtالخاص بها أقدم منdefaults.pruneGraceDays(الافتراضي 7 أيام). يُبلَّغ عن المدخلات داخل فترة السماح (مع الأيام المتبقية) ويُحتفظ بها. - الإشارات المتقاطعة المعلقة بين حاويات الإعدادات:
- مدخلات
resources.machines.<m>.backupStrategies[]التي تُسمي استراتيجية لم تعد موجودة. - مدخلات
resources.backupStrategies.<s>.exclude[]وinclude[]التي تُسمي مستودعاً لم يعد موجوداً. - وجهات التخزين التي يكون التخزين المستهدف لها مفقوداً. يُؤشَّر عليها كتحذير، ولا تُزال تلقائياً (الإزالة التلقائية ستغيّر دلالات الاستراتيجية).
- مدخلات
# المعاينة فقط
rdc config prune --dry-run
# التطبيق (السلوك الافتراضي)
rdc config prune
# التقييد إلى حاوية واحدة
rdc config prune --certs-only
rdc config prune --archives-only
rdc config prune --refs-only
# إسقاط جميع المستودعات المؤرشفة بصرف النظر عن السماح
rdc config prune --purge-archived
# تجاوز نافذة سماح الأرشيف لهذا الاستدعاء
rdc config prune --grace-days 30
ما الذي لا يلمسه
- الموارد النشطة (الأجهزة، وحدات التخزين، المستودعات، استراتيجيات النسخ الاحتياطي، مزودو السحابة).
- بيانات الاعتماد، كتلة الحساب، كتلة التشفير، الإعدادات الافتراضية.
vaultContentللتخزين (بما في ذلكaccess_tokenالمنتهي لـ OneDrive. لا يزال refresh_token يُولِّد رموزاً جديدة؛ التنظيف سيفرض إعادة المصادقة).- مدخلات
knownHosts(مسار التحديث التلقائي هوrdc config machine scan-keys). - مصفوفة كتلة الشهادات المضغوطة (
infra.acmeCertCache.<base>.data[]) تُعاد بناؤها من قائمة الشهادات المُنظَّفة تلقائياً؛ لن تفقد أي سلسلة لا تزال تغطي اسماً محتفظاً به.
مثال عملي
إخراج من تشغيل حقيقي على جهاز يحتوي على أربعة wildcards بمعرّفات GUID معزولة و wildcardين قديمين باسم جهاز:
Scanning local config for stale leftovers...
6 cert cache entry/entries would be removed:
*.linode-1.rediacc.io (unknown machine linode-1)
*.marketing.linode-1.rediacc.io (unknown machine linode-1)
*.5b749533-99be-446c-9fe3-e6d0eec905a6.hostinger.rediacc.io (unknown GUID 5b749533-…)
*.5d09f3a6-9558-4df1-8a6e-b63140a6a7a6.hostinger.rediacc.io (unknown GUID 5d09f3a6-…)
*.e18d8c0f-367e-43c7-919e-2dbc59db4b5e.hostinger.rediacc.io (unknown GUID e18d8c0f-…)
*.9806c9b8-6bfb-4a87-9eaa-4b757ce1daca.hostinger.rediacc.io (unknown GUID 9806c9b8-…)
Dry run: 6 change(s) would be applied. Re-run without --dry-run to commit.
أسماء الشهادات التي تكون نقطة ارتكازها جهازاً حياً أو مستودعاً أو GUID. وأي wildcard أحادي التسمية <service>.<base> أو wildcard جذر *.<base>. تُترك دون مساس.
الترحيل: إعادة ملء مرآة الحالة
مرآة .interim/state/<guid>/.rediacc.json التي تُشغِّل --prune-unknown وعمود Type في rdc repo list -m تُكتب:
- عند إنشاء النسخة المتفرعة (
rdc repo fork). فوراً، حتى قبل أن تُحمَّل النسخة المتفرعة. - عند كل حفظ للحالة (
rdc repo mountوأي عملية تُحدِّث حالة المستودع). للمستودعات التي أُنشئت قبل شحن كود المرآة.
المستودعات التي أُنشئت قبل وجود المرآة ولم يُعَد تحميلها منذ الترقية ليس لها ملف مرآة. تظهر كـ unknown في rdc repo list -m رغم أن بعضها نسخ متفرعة شرعية. لإصلاح ذلك للمستودعات اليتيمة القديمة، شغّل إعادة الملء لمرة واحدة على الجهاز:
sudo /usr/local/bin/renet repository backfill-state-mirror \
--datastore /mnt/rediacc \
--mark-as-fork <guid1>,<guid2>,<guid3>
تُنسخ إعادة الملء الحالة الحية الموجودة داخل الوحدة إلى المرآة للمستودعات المُحمَّلة حالياً، وتكتب مرآة اصطناعية موسومة كنسخة متفرعة لأي معرّفات GUID تُدرجها تحت --mark-as-fork. بعد إعادة الملء، تتوقف النسخ الاحتياطية المجدولة عن رفع النسخ المتفرعة المُدرجة (يفحص خط أنابيب الرفع المرآة بحثاً عن is_fork: true).
نموذج الأمان
التنظيف مصمم ليكون آمناً بشكل افتراضي عبر إعدادات التكوين المتعددة.
الوعي بالتكوينات المتعددة
يفحص storage prune و machine prune --orphaned-repos جميع ملفات الإعدادات في ~/.config/rediacc/، وليس فقط الإعدادات النشطة. لن يتم حذف مستودع مُشار إليه في production.json حتى لو كان غائباً عن staging.json. هذا يمنع الحذف العرضي عندما تكون الإعدادات مخصصة لبيئات مختلفة.
فترة السماح
عند إزالة مستودع من إعدادات باستخدام --archive-config، يُنقل إدخال بيانات الاعتماد الخاص به إلى resources.deletedRepositories[] مع طابع زمني deletedAt. تحترم أوامر التنظيف فترة سماح (الافتراضي 7 أيام) يتم خلالها حماية المستودعات المؤرشفة حديثاً من الحذف. يمنحك هذا وقتاً لاستعادة مستودع (rdc config repository restore-archived --name <guid>) إذا أُزيل عن طريق الخطأ. بمجرد انتهاء فترة السماح، يقوم storage prune و machine prune و config prune جميعها بمسح الإدخال تلقائياً.
فحص أمان التحميل المسبق
تمت تغطيته أعلاه. storage prune و machine prune --prune-unknown يرفضان حذف المستودعات المُحمَّلة أو العاملة حالياً على جهاز التنفيذ. التجاوز فقط عبر --force-delete-mounted.
التطبيق افتراضياً؛ --dry-run للمعاينة
تطبق جميع أوامر التنظيف الثلاثة التغييرات افتراضياً. مرّر --dry-run للمعاينة دون كتابة. هذا يطابق الفعل: “prune” مدمّر بحد ذاته، وراية التشغيل التجريبي هي الانسحاب الصريح.
التكوين
pruneGraceDays
عيّن فترة سماح افتراضية مخصصة في ملف الإعدادات حتى لا تحتاج إلى تمرير --grace-days في كل مرة:
# تعيين فترة السماح إلى 14 يوماً في الإعدادات النشطة
rdc config field set --pointer /defaults/pruneGraceDays --new 14
تتجاوز راية CLI --grace-days هذه القيمة عند تقديمها.
الأولوية
- راية
--grace-days <N>(الأولوية الأعلى) pruneGraceDaysفي ملف الإعدادات- القيمة الافتراضية المدمجة: 7 أيام
أفضل الممارسات
- شغّل التشغيل التجريبي أولاً على الإنتاج. قم دائماً بالمعاينة قبل تنفيذ تنظيف مدمر، خاصة على تخزين الإنتاج.
- حافظ على تحديث الإعدادات المتعددة. يفحص تنظيف التخزين والجهاز جميع الإعدادات في مجلد الإعدادات. إذا كان ملف إعدادات قديماً أو محذوفاً، تفقد مستودعاته الحماية. حافظ على دقة ملفات الإعدادات.
- يُفضَّل
--prune-unknownعلى--orphaned-repos. الراية الدقيقة تحترم مرآة renet؛ بينما الراية الخشنة تحذف بسرور النسخ المتفرعة التي أنشأتها أدوات أخرى. - استخدم فترات سماح سخية للإنتاج. فترة السماح الافتراضية 7 أيام تناسب معظم سيناريوهات العمل. لبيئات الإنتاج ذات فترات الصيانة غير المتكررة، فكر في 14 أو 30 يوماً.
- جدوِل تنظيف التخزين بعد عمليات النسخ الاحتياطي. اربط
storage pruneبجدول النسخ الاحتياطي للتحكم في تكاليف التخزين دون تدخل يدوي. - ادمج تنظيف الجهاز مع جدول النسخ الاحتياطي. بعد نشر جداول النسخ الاحتياطي (
rdc machine backup schedule)، أضف تنظيفاً دورياً للجهاز لتنظيف اللقطات القديمة وعناصر مخزن البيانات المعزولة. - شغّل
config pruneبشكل دوري. يتراكم تضخم الإعدادات المحلية (خاصة ذاكرة الشهادات المؤقتة) بصمت؛ يكفيconfig prune --dry-runربع سنوي لاكتشافه. - راجع قبل استخدام
--forceأو--force-delete-mounted. كلتا الرايتين تتجاوزان فحوصات الأمان. استخدم--forceفقط عندما تكون متأكداً أن لا إعدادات أخرى تشير إلى المستودعات المعنية؛ استخدم--force-delete-mountedفقط عندما تكون متأكداً أن الحالة الحية على الجهاز خاطئة.