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

نسخة احتياطية مشفّرة لـVPS في ست خطوات: من خادم غير محمي إلى مستودع مشفّر مُتحقَّق منه على جهاز ثانٍ في ولاية قضائية ثانية — مقارنة بين restic وBorg، وتفريغات قواعد بيانات تُستعاد سليمة، ومؤقت systemd، ومستودع append-only لا يستطيع خادم مخترق محوه. الجهاز الثاني يكلف $3.90 شهرياً. اختُبر على Debian 12.
الجرد
ما لا يمكن إعادة بنائه
تثبيت
restic أو Borg
الوجهة
معقل ثانٍ
التهيئة
المستودع + أول تشغيل
الأتمتة
التفريغات، والمؤقت، والاحتفاظ
التمرين
استعِد، واحسب الوقت
يخطئ كل نقاش تقريباً حول النسخ الاحتياطي في الدقيقة الأولى، لأن المتحدثين يتخيلان عطلاً مختلفاً كل منهما. أحدهما يتخيل قرصاً ميتاً. والآخر يتخيل صباح ثلاثاء يختفي فيه الحساب بأكمله. كل منهما يحتاج إجابة مختلفة، وأي إعداد ينجو من الحالة الأولى فقط يبدو آمناً إلى أن يختبره الثاني.
هناك أربعة أنماط فشل تستحق التصميم لمواجهتها، وهي ليست تنويعات على فكرة واحدة — كل نمط منها يُسقط دفاعاً مختلفاً.
العتاد. يتعطل NVMe، أو تموت العقدة المضيفة، أو تفقد المصفوفة عضوين دفعة واحدة. هذا هو العطل الذي يخطط له الجميع، وهو الأندر وقوعاً على البنية التحتية الافتراضية الحديثة. التخزين الزائد يتكفل به. لكن التخزين الزائد لا يتكفل بأي شيء آخر، ولهذا فإن RAID ليس نسخة احتياطية ولم يكن كذلك قط: فهو ينسخ كل عملية كتابة بأمانة، بما في ذلك الكتابة التي تقول «احذف كل شيء».
بشري. سكربت ترحيل شُغِّل على الإنتاج. أمر DROP TABLE في الطرفية الخطأ. أمر rsync بمعطيات معكوسة. هذا هو السبب الأكثر شيوعاً بفارق كبير لضياع البيانات الفعلي، والدفاع الوحيد ضده هو التاريخ — نسخة من قبل الخطأ، محفوظة في مكان لم يصله الخطأ. العنصر الحاسم هو الزمن: إذا كانت النسخة الوحيدة مرآة متأخرة ثلاثين ثانية فقط، فهي تحتوي على الخطأ بالفعل.
خبيث. يحصل أحدهم على صلاحيات root، أو تتسلل برمجية فدية عبر تطبيق لم يُحدَّث. أول ما تفعله برمجيات الفدية الحديثة هو البحث عن إعداد النسخ الاحتياطي — بيانات الاعتماد، المشاركات المُوصَّلة، مفاتيح السحابة — وتدمير ما تجده، تحديداً لأن استعادة ناجحة تحوّل كارثة إلى مجرد بعد ظهر. بيانات اعتماد نسخ احتياطي قادرة على الحذف هي بيانات اعتماد يرثها المهاجم. هذا هو الخلل الذي وُجد فصل append-only في هذا الدليل من أجله.
احتجازي. لم ينكسر شيء ولم يتعرّض شيء لهجوم؛ فقدت الوصول ببساطة. حساب عُلِّق بسبب إشارة احتيال آلية، أو بطاقة فشلت أثناء سفرك، أو نزاع، أو مراجعة امتثال، أو أمر قضائي مُبلَّغ إلى المزوّد. الجهاز سليم وغير قابل للوصول، وكل لقطة داخل ذلك الحساب غير قابلة للوصول معه. هذا هو العطل الذي لا يستطيع أي قدر من التكرار داخل مزوّد واحد الإجابة عنه، وهو السبب في أن نسخة احتياطية جادة تعيش تحت سقف مختلف.
| الدفاع | العتاد | خطأ بشري | برمجيات الفدية | حساب مفقود |
|---|---|---|---|---|
| RAID / التخزين الزائد | نعم | لا | لا | لا |
| لقطة لدى المزوّد، ضمن نفس الحساب | نعم | جزئياً | لا | لا |
| مستودع خارج الموقع، مفتاح قابل للكتابة | نعم | نعم | لا | نعم |
| مستودع خارج الموقع، append-only، ولاية قضائية أخرى | نعم | نعم | نعم | نعم |
الصف الأخير هو ما يبني عليه بقية هذا الدليل. وهو ليس أغلى من الصف الذي فوقه — فإعداد append-only مجاني، والولاية القضائية الثانية تكلف نفس $3.90 التي تكلفها الأولى.
قاعدة 3-2-1، مُعاد صياغتها لـVPS واحد. ثلاث نسخ من البيانات، على نوعين مختلفين من التخزين، إحداها خارج الموقع. الصياغة الكلاسيكية تعود إلى عصر الأشرطة وخوادم المكاتب، وروحها تصمد في النقل أفضل من حرفيتها. بالنسبة لجهاز واحد مُستضاف ذاتياً، تصبح كالتالي: البيانات الحية على VPS، ومستودع على جهاز ثانٍ في مكان آخر، و — لأي شيء لا يمكن تعويضه فعلاً — نسخة ثالثة يمكنك حملها بيدك، على قرص في المنزل أو في درج. الرقم الذي يهم فعلاً ليس ثلاثة. بل عدد الأشياء المستقلة التي يجب أن تسوء قبل ضياع البيانات. اثنان هو الحد الأدنى الذي يستحق أن تملكه.
الفئة التي تبحث عنها تُسمى أداة لقطات تُزيل التكرار وتُشفّر. فهي تُقسّم كل ملف إلى قطع مُحدَّدة بمحتواها، وتُشفّر كل قطعة على الجهاز المالك للبيانات، وتُخزّنها مرة واحدة مهما بلغ عدد اللقطات التي تشير إليها. هذا يمنحك ثلاث خصائص في آن واحد: نقاط استعادة عديدة مقابل مساحة إضافية زهيدة، ونص صريح لا يغادر المصدر أبداً، ونقل لا يحرّك سوى ما تغيّر.
برنامجان يهيمنان على هذا المجال وكلاهما ممتاز. restic هو ملف Go ثنائي ساكن واحد بمجموعة واسعة من خلفيات التخزين. أما BorgBackup فهو برنامج Python يتحدث SSH مع نسخة من نفسه على الطرف البعيد. كل ما يلي هو الفرق الصادق بينهما.
| الخاصية | restic | BorgBackup | rsync / rclone |
|---|---|---|---|
| التشفير من جهة العميل | مفعّل دائماً، وليس اختيارياً | مفعّل دائماً، وليس اختيارياً | فقط عبر وجهة rclone crypt بعيدة |
| إزالة التكرار | قطع محدَّدة بالمحتوى | قطع محدَّدة بالمحتوى | لا شيء، أو أشجار hardlink |
| تاريخ اللقطات | نعم، مع سياسات احتفاظ | نعم، مع سياسات احتفاظ | مرآة للحظة الراهنة |
| متطلبات الوجهة | لا شيء — SFTP، وS3، وREST، وrclone | Borg مُثبَّت على الطرفين | حساب SSH أو واجهة API |
| فرض append-only | عبر rest-server أو قفل الكائن | مدمج، عبر SSH عادي | لا شيء |
| مناسب لـ | أغلب المستخدمين، ومعظم الخلفيات | جهاز SSH تملكه، بنمط append-only | المرآة، لا النسخ الاحتياطي |
rsync موجود في الجدول لأنه أول ما يلجأ إليه معظم الناس، ولأنه فعلاً الأداة الخاطئة: المرآة تُعيد إنتاج عملية الحذف بأمانة، ومرآة لقرص مشفّر أثناء السكون ليست هي نفسها مشفّرة في أي مكان. يكتسب مكانه داخل عملية النسخ الاحتياطي كأداة تنقل أرشيفاً منتهياً، لا كأرشيف بحد ذاته.
يعرض هذا الدليل كلاً من restic وBorg لكل أمر يختلف بينهما، حتى تتمكن من اتّباعه بأيّهما. وحيثما وجب اتخاذ خيار واحد — المثال العملي، والمؤقت، والسكربت — فإنه يستخدم restic، لأن الوجهة عندها لا تحتاج إلى أكثر من حساب SSH، وهذا يُبقي الجهاز الثاني بسيطاً بلا مفاجآت.
نسخ نظام الملفات بأكمله احتياطياً خيار يمكن الدفاع عنه لكنه مُبذِّر. معظم الخادم لا يبعد عن إعادة إنشائه سوى أمر من مدير الحزم، وكل جيجابايت تحمله يجعل المستودع أبطأ في التقليم، وأغلى في الحفظ، وأبطأ في البحث عندما تكون مستعجلاً. التمرين المفيد هو العكس: اسرد ما لن يعيده لك تثبيت جديد.
بالنسبة لخادم VPS نموذجي مُستضاف ذاتياً، هذه القائمة قصيرة، وتحتوي دائماً على هذه الأشياء الخمسة:
حوّل القائمة إلى ملفين على الخادم المصدر. قائمة include تُبقي القصد واضحاً؛ وقائمة exclude تُبقي الضوضاء خارجاً. كلاهما يُقرأ من قبل أمر النسخ الاحتياطي، وكلاهما ينبغي أن يكون جزءاً من النسخة الاحتياطية نفسها.
/etc/backup/include.txt
/etc
/opt
/root
/var/backups
/var/lib/docker/volumes
/home
/etc/backup/exclude.txt
# Caches and rebuildable artefacts
**/node_modules
**/.cache
**/*.tmp
/var/lib/docker/volumes/*/_data/cache
# Log noise — keep the config, drop the volume
/var/log/journal
# Never back up the mount point you restore into
/mnt/restore
ملاحظتان حول سطر Docker ذاك، لأنه يوقع كثيرين في الخطأ. الأحجام المُسمّاة تعيش تحت /var/lib/docker/volumes وهي ما تريده؛ أما bind mounts فتعيش أينما وضعتها أنت، غالباً بجانب ملف Compose، ويغطيها /opt. صور الحاويات ليست بيانات — فهي تعود بأمر pull، والنسخة الاحتياطية التي تحملها تحمل جيجابايتات لا تحتاج إليها.
أخيراً، قِس النتيجة قبل أن تبني أي شيء حولها. هذا الرقم يخبرك أي فئة مستودع تطلبها وهل سيستغرق التشغيل الأول أربع دقائق أم أربعين:
du -sh --exclude=/var/lib/docker/overlay2 /etc /opt /root /home /var/lib/docker/volumes
ثبّت الأداة على الجهاز الذي يملك البيانات. في Debian وUbuntu كلتاهما مُعبَّأتان كحزمة، وبالنسبة لـ restic فإن حزمة التوزيعة غالباً ما تكون متأخرة بإصدار أو اثنين — وهذا مهم، لأن ميزات المستودع وتحسينات الأداء تصل في الإصدارات الفرعية. ثبّت الحزمة، ثم دع restic يُحدِّث نفسه في مكانه:
apt update && apt install -y restic
restic self-update
restic version
بالنسبة لـ Borg، فإن حزمة التوزيعة هي الخيار الصحيح، لأن إصدار المصدر وإصدار الوجهة يجب أن يفهم كل منهما الآخر، وزوج متطابق من نفس إصدار التوزيعة هو أقل الطرق إيلاماً لتحقيق ذلك:
apt install -y borgbackup
borg --version
كلمة عن الإصدارات الرئيسية قبل أن تُودِع سنوات من التاريخ في مستودع: تغيّرت صيغة مستودع Borg بين خطوطه الرئيسية، ونقل مستودع عبر تلك الحدود هو تحويل، لا ترقية. اقرأ ملاحظات إصدار النسخة التي تُثبّتها، وأبقِ الوجهة على نفس الخط الرئيسي للمصدر. أما restic فقد ظل متوافقاً إلى الأمام عبر إصداراته ويضيف ميزاته خلف إصدار مستودع صريح، لذا فإن القلق المماثل هناك أصغر.
لا تحتاج أي من الأداتين إلى daemon أو عميل أو منفذ مفتوح على المصدر. يستحق هذا أن يُقال بوضوح: نظام النسخ الاحتياطي الذي تُثبّته لا يضيف أي خدمة استماع ولا أي سطح هجوم جديد إلى الجهاز الذي يحميه. كل ما يفعله صادر، وفق جدول، عبر SSH.
مضيف المستودع له مهمة واحدة وشبه لا متطلبات له. لا يحتاج إلى أنوية معالج، لأنه لا يقرأ بياناتك أبداً — إنه يحتفظ بـblobs مشفّرة لا يستطيع فتحها. ولا يحتاج إلى ذاكرة، لأن عمل إزالة التكرار يحدث على المصدر. إنه يحتاج إلى قرص، وعنوان ثابت، وأن يكون في مكان لا تلحقه فيه مشاكل الجهاز المصدر.
في لوحة التحكم: اطلب → VPS → Sentinel، بصورة Debian 12، و — وهذا هو بيت القصيد — معقل مختلف عن المعقل الذي يعمل فيه المصدر. Helsinki للعمل، وReykjavík للحفظ. لا حاجة إلى بريد إلكتروني لفتح الحساب، وتُسدَّد الفاتورة بـMonero أو Bitcoin أو Lightning أو أي من الأصول الأخرى المدعومة، ما يعني أن الجهاز الثاني لا يُعيد إدخال الهوية التي حرص الأول على حمايتها.
| وجهة المستودع | شهرياً | التخزين | مجموعة العمل التي يحتفظ بها | تكلفة الاستعادة |
|---|---|---|---|---|
| Sentinel | $3.90 | 120 GB NVMe | ~30 GB | لا شيء — غير مُقاس |
| Garrison | $7.90 | 240 GB NVMe | ~70 GB | لا شيء — غير مُقاس |
| Ravelin | $16.90 | 480 GB NVMe | ~150 GB | لا شيء — غير مُقاس |
| Bulwark | $32.90 | 960 GB NVMe | ~300 GB | لا شيء — غير مُقاس |
| تخزين كائنات من فئة S3 | ~$0.023/GB | مرن | أيّ | نقل صادر مُقاس |
عمود مجموعة العمل يفترض لقطات يومية محفوظة لمدة سنة مع معدل تغيّر طبيعي؛ فالمستودع الذي يحتفظ في معظمه بملفات بطيئة التغيّر يذهب أبعد من ذلك بكثير، والمستودع المليء بملفات ثنائية كبيرة يُعاد كتابتها باستمرار يذهب أقل. الصف الأخير موجود لأجل الحجم الكبير، ولأجل التفصيل الذي ينساه الناس حتى اليوم السيئ: التخزين السحابي من نوع الكائنات يفرض رسوماً على التنزيل أيضاً، والتنزيل هو ما تفعله في حالة الطوارئ.
على الوجهة — مستخدم بلا صلاحيات ومجلد.
adduser --disabled-password --gecos "" backup
install -d -m 0700 -o backup -g backup /srv/restic/web01
مستخدم النسخ الاحتياطي لا كلمة مرور له، ولا صلاحية sudo، ولا شيء يمكنه تسجيل الدخول إليه. وجوده فقط لامتلاك مجلد. امنحه مجلداً خاصاً به لكل جهاز مصدر إذا كنت تنسخ عدة أجهزة احتياطياً — فمستودع واحد لكل مصدر يمنع اختراق جهاز واحد من المساس بتاريخ جهاز آخر.
على المصدر — مفتاح لا يُستخدم لأي شيء آخر.
ssh-keygen -t ed25519 -f /root/.ssh/id_backup -N "" -C "backup:web01"
cat /root/.ssh/id_backup.pub
لا تُعِد استخدام مفتاح تسجيل الدخول الخاص بك. هذا المفتاح يعيش بلا تشفير على القرص لأن مؤقتاً بلا مراقبة يجب أن يستخدمه في الثالثة فجراً، وهذا بالضبط نوع المفتاح الذي تريده مقصوراً على وجهة واحدة وغرض واحد.
عودة إلى الوجهة — قيّد ما يمكن لذلك المفتاح فعله. الصق المفتاح العام في /home/backup/.ssh/authorized_keys مع إضافة بادئة أمامه. لـrestic عبر SFTP:
restrict,from="198.51.100.7" ssh-ed25519 AAAAC3NzaC1lZDI1... backup:web01
خيار restrict يوقف بكلمة واحدة إعادة توجيه المنافذ، وإعادة توجيه الوكيل، وX11، وتخصيص PTY، تاركاً نقل الملفات فقط ولا شيء غيره. عبارة from= تُقيّد المفتاح بعنوان المصدر، لذا فإن نسخة منه مسروقة من الخادم تصبح عديمة الفائدة في أي مكان آخر. بالنسبة لـBorg، اذهب خطوة أبعد وافرض الأمر، حيث يعيش نمط append-only الخاص به:
command="borg serve --append-only --restrict-to-path /srv/borg/web01",restrict ssh-ed25519 AAAAC3NzaC1lZDI1... borg:web01
هذا السطر هو دفاع كامل ضد برمجيات الفدية في مكان واحد: مهما أرسل المصدر، فإن الوجهة لن تُشغّل سوى borg serve، وداخل ذلك المسار فقط، وفي نمط لا يفعل سوى الإلحاق. صدفة root على المصدر لا تستطيع استخدام هذا المفتاح لمحو الشهر الماضي.
سمِّ الوجهة مرة واحدة، على المصدر. ضعه في /root/.ssh/config حتى يكون كل أمر لاحق قصيراً ويبقى العنوان في ملف واحد بعينه:
Host rkv-repo
HostName 198.51.100.42
User backup
IdentityFile /root/.ssh/id_backup
IdentitiesOnly yes
ثم اتصل مرة واحدة يدوياً — ssh rkv-repo — لقبول مفتاح المضيف. المؤقت غير المُراقَب لن يجيب على مطالبة بصمة الاتصال، وأول نسخة احتياطية تتجمد بصمت لأسبوع كامل هي حالة كلاسيكية. وبينما أنت على الوجهة، عاملها كما تعامل أي جهاز آخر تملكه: شغّل التصليب في الساعة الأولى عليها أيضاً. فهي تحتفظ بنسخة من كل شيء، وتستحق الساعة كاملة.
وَلِّد عبارة مرور لن تكتبها يدوياً أبداً. يقرؤها سكربت من ملف، لذا فالطول لا يكلف شيئاً ولا داعي لجعلها سهلة التذكر:
openssl rand -base64 32 > /root/.restic-pass
chmod 600 /root/.restic-pass
cat /root/.restic-pass
توقّف الآن وانسخ تلك السلسلة إلى مكان ليس هذا الخادم. مدير كلمات مرور، أو ورقة في درج، أو جهاز ثانٍ — أي مكان ينجو من فقدان المصدر. هذا هو نفس الخلل الذي يدمّر الخزائن المُستضافة ذاتياً ومحركات الأتمتة: المفتاح الذي يفك تشفير كل شيء مُخزَّن بجانب كل شيء، فيضيع الاثنان معاً. مستودع لم تكن عبارة مروره موجودة إلا على الجهاز الذي كان يحميه ليس نسخة احتياطية؛ إنه كومة ضجيج مرتّبة بعناية.
اكتب ملف البيئة الذي سيقرأه كل أمر لاحق:
/etc/backup/restic.env
RESTIC_REPOSITORY=sftp:rkv-repo:/srv/restic/web01
RESTIC_PASSWORD_FILE=/root/.restic-pass
chmod 600 /etc/backup/restic.env
set -a; . /etc/backup/restic.env; set +a
restic init
الزوج المكافئ في Borg — نمط repokey يُخزّن مفتاح التشفير داخل المستودع نفسه، محمياً بعبارة المرور، وهذا مريح، وهو تحديداً سبب تصديرك نسخة منه أيضاً:
export BORG_REPO=ssh://borg@rkv-repo/srv/borg/web01
export BORG_PASSCOMMAND="cat /root/.restic-pass"
borg init --encryption=repokey-blake2
borg key export :: /root/borg-key.txt # copy this off the server too
اللقطة الأولى. شغّله يدوياً، وراقبه، ودعه ينتهي قبل أن تُؤتمت أي شيء. هذا هو التشغيل البطيء — فكل قطعة (chunk) جديدة — وهو التشغيل الذي يخبرك ما إذا كانت قائمة include صحيحة:
restic backup \
--files-from /etc/backup/include.txt \
--exclude-file /etc/backup/exclude.txt \
--tag nightly --one-file-system --verbose
إذا كان المصدر يخدم حركة مرور وكان الرفع يُشبع الرابط، قيّد معدله. الخيار يأخذ كيبيبايت في الثانية، لذا فإن 20000 يساوي تقريباً 20 MB/s:
restic backup --limit-upload 20000 --files-from /etc/backup/include.txt
عند الانتهاء، انظر إلى ما حصلت عليه فعلاً. هذه الأوامر الثلاثة هي التي يجب تشغيلها الآن، ومرة أخرى بعد ستة أشهر حين تكون قد توقفت عن التفكير في كل هذا:
restic snapshots # the list, with dates and tags
restic stats latest # what the newest snapshot contains
restic ls latest /etc/backup # confirm a path you expected is in there
ذلك الأمر الثالث يستحق وقفة. نصف النسخ الاحتياطية «المعطوبة» ليست معطوبة إطلاقاً — إنها مستودعات كاملة وسليمة، لكن للمجلد الخطأ. سرد مسار كنت تتوقع إيجاده، منذ أول لقطة، يكشف ذلك بينما لا يزال ملف include حاضراً في ذهنك.
قاعدة قواعد البيانات، مذكورة مرة واحدة. محرك قاعدة بيانات يعمل يحتفظ بحالته في الذاكرة ويكتبها إلى القرص في وقته الخاص. اقرأ ملفاته أثناء ذلك وستحصل على مجموعة صفحات من لحظات مختلفة عدة — ملف قد يُستعاد، وقد يُستعاد تالفاً، أو قد يُستعاد كشيء يُفتح بسلاسة لكنه يفتقد الساعة الأخيرة بصمت. لا سبيل لمعرفة أي احتمال تحقق من الخارج. لذلك لا تلمس النسخة الاحتياطية الملفات الحيّة أبداً: تُكتب تفريغة إلى القرص أولاً، وتأخذ النسخة الاحتياطية تلك التفريغة.
كل شيء يذهب إلى سكربت واحد. ضعه في /usr/local/sbin/nb-backup.sh، واجعله قابلاً للتنفيذ، واحتفظ به داخل النسخة الاحتياطية نفسها:
#!/bin/sh
set -eu
# ---- 1. Consistent dumps, written where the include list will find them.
install -d -m 0700 /var/backups/db
# PostgreSQL in a container:
docker exec -t app-db pg_dumpall -U postgres | gzip -9 > /var/backups/db/postgres.sql.gz
# MariaDB / MySQL, InnoDB tables:
# docker exec -t mail-db mariadb-dump --single-transaction --all-databases \
# | gzip -9 > /var/backups/db/mariadb.sql.gz
# SQLite — never a plain file copy:
# sqlite3 /opt/app/data/app.db ".backup '/var/backups/db/app.db'"
# ---- 2. The snapshot.
restic backup \
--files-from /etc/backup/include.txt \
--exclude-file /etc/backup/exclude.txt \
--tag nightly --one-file-system
# ---- 3. Retention, then reclaim the space it freed.
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
# ---- 4. Structural check every night; read 5% of the data on Sundays.
restic check
[ "$(date +%u)" = "7" ] && restic check --read-data-subset=5%
echo "backup ok: $(date -u +%FT%TZ)"
ثلاثة تفاصيل في ذلك السكربت تؤدي عملاً أكبر مما تبدو عليه. set -eu في الأعلى تعني أن فشل التفريغة يُوقف التشغيل بدلاً من أخذ لقطة بصمت لتفريغة الأمس لستة أشهر قادمة. forget وprune هما أمر واحد، لأن سياسة احتفاظ لا تستعيد مساحة أبداً هي قرص سيمتلئ عاجلاً. وفحص يوم الأحد يقرأ شريحة من البيانات الفعلية وليس الفهرس فقط — فتلف المستودع نادر، وصامت، والشيء الوحيد الذي يكشفه هو القراءة.
المؤقت. ملفا وحدة صغيران. systemd هو المُجدوِل الصحيح هنا وليس cron، لأن المؤقت يمنحك Persistent — فالتشغيل الذي يفوت أثناء إطفاء الجهاز يحدث عند الإقلاع التالي بدلاً من تخطّيه بصمت — ولأن journalctl عندها يحتفظ بتاريخ كل تشغيل.
/etc/systemd/system/nb-backup.service
[Unit]
Description=Nightly encrypted offsite backup
Wants=network-online.target
After=network-online.target docker.service
[Service]
Type=oneshot
EnvironmentFile=/etc/backup/restic.env
ExecStart=/usr/local/sbin/nb-backup.sh
Nice=10
IOSchedulingClass=idle
/etc/systemd/system/nb-backup.timer
[Unit]
Description=Nightly encrypted offsite backup
[Timer]
OnCalendar=*-*-* 03:00:00
RandomizedDelaySec=45m
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now nb-backup.timer
systemctl list-timers nb-backup.timer
systemctl start nb-backup.service && journalctl -u nb-backup.service -n 40 --no-pager
التأخير العشوائي ليس زخرفة. كل خادم مُستضاف ذاتياً على الإنترنت يشغّل صيانته عند الساعة 03:00 بالضبط، والنسخة الاحتياطية التي تبدأ في نفس الثانية التي يبدأ فيها تدوير السجلات وتجديد الشهادة وتحديث الحاوية تقضي ليلتها في التنافس معها على عمليات الإدخال والإخراج. توزيع لحظة البدء عبر خمس وأربعين دقيقة لا يكلف شيئاً ويُزيل فئة كاملة من الليالي البطيئة الغامضة.
ثم اجعل الفشل صاخباً. هذه هي الخطوة التي يتخطاها الجميع، وهي التي تحدد ما إذا كان كل ما سبق يستحق العناء. النسخة الاحتياطية التي تتوقف عن العمل لا تُعلن ذلك: المؤقت يستمر في الإطلاق، والخدمة تستمر في الفشل، وآخر لقطة سليمة تتراجع إلى الماضي بينما تبقى لوحة التحكم خضراء. أضف وحدة OnFailure= إلى الخدمة تُرسل لك شيئاً سترى فعلاً، وألقِ نظرة مرة في الشهر على أعلى قائمة اللقطات. سطر واحد، وعادة واحدة.
restic snapshots --latest 3 # is the newest one from last night?
systemctl list-timers nb-backup.timer # is the timer still armed?
هناك تمرينان، وكل منهما يجيب عن سؤال مختلف. الصغير يسأل «هل البيانات فعلاً موجودة هناك وقابلة للقراءة؟» ويستغرق تسعين ثانية. الكبير يسأل «كم من الوقت سيستغرق فعلاً استعادة الخدمة؟» ويستغرق بعد ظهر كامل، مرة في السنة. نفّذ الصغير شهرياً. نفّذ الكبير مرة واحدة على الأقل، لأن الإجابة لا تكون أبداً كما يتوقع الناس.
التمرين الصغير. اسحب مجلداً واحداً وتفريغة واحدة إلى مسار تجريبي، ثم قارنهما بما هو قائم فعلياً:
install -d -m 0700 /mnt/restore
restic restore latest --target /mnt/restore --include /etc/backup
restic restore latest --target /mnt/restore --include /var/backups/db
diff -r /etc/backup /mnt/restore/etc/backup && echo "config identical"
gzip -t /mnt/restore/var/backups/db/postgres.sql.gz && echo "dump readable"
والأفضل من ذلك، حين تتيحه الأداة: اربط المستودع (mount) للقراءة فقط وتصفّحه كنظام ملفات. تظهر كل لقطة كمجلد مؤرَّخ، ويمكنك تصفّح التاريخ باستخدام ls وcat دون استعادة أي شيء إطلاقاً. يحتاج ذلك إلى FUSE على الجهاز الذي يقوم بالربط:
restic mount /mnt/snapshots # then: ls /mnt/snapshots/snapshots/latest/
borg mount :: /mnt/snapshots # the Borg equivalent
التمرين الكبير. اطلب VPS تجريبياً بالساعة، وأعد بناء الخدمة عليه انطلاقاً من المستودع وحده — بلا ملاحظات من الذاكرة، وبلا ملفات منسوخة من الجهاز الفعلي. اعمل وفق دليل تشغيل (runbook) مكتوب وصحّحه أثناء التقدم، لأن الثغرات التي تكتشفها هي بيت القصيد من هذا التمرين. الاكتشافات المعتادة، مرتبة حسب التكرار: عبارة المرور كانت موجودة فقط على الجهاز المُعطَّل؛ سجلات DNS لم تُدوَّن قط؛ مجلد bind mount كان خارج كل مسار include؛ الاستعادة احتاجت إصدار حزمة لم يعد الافتراضي؛ لم يكن أحد يعرف أي حاوية يجب أن تبدأ أولاً.
احسب الوقت. اكتب الرقم في أعلى دليل التشغيل مع التاريخ. هذا الرقم — لا حجم المستودع، ولا عدد اللقطات — هو المقياس الصادق الوحيد لمدى حماية الخدمة فعلياً.
واقرأ البيانات من حين لآخر. الفحص الليلي يتحقق من البنية: أن الفهرس متّسق مع نفسه وأنه لا يوجد أي blob مفقود. إنه لا يقرأ الـblobs. مرة في الشهر، أو في تشغيل يوم الأحد، اقرأ شريحة منها — نسبة خمسة بالمئة متجددة تغطي المستودع بأكمله خلال شهرين تقريباً دون أن تكلّف أبداً ليلة طويلة:
restic check --read-data-subset=5%
borg check --verify-data # the Borg equivalent, slower and thorough
كل ما سبق هنا يحمي من الحوادث. هذا الفصل يحمي من خصم، ومشكلة التصميم غير مريحة بمجرد أن تراها: يجب على الجهاز المصدر أن يصل إلى المستودع كل ليلة، ما يعني أن الجهاز المصدر يحمل بيانات اعتماد فعّالة للمستودع. من يملك المصدر يملك تلك البيانات. إذا كانت بيانات الاعتماد قادرة على الحذف، فالمهاجم يحذف — وبرمجيات الفدية الحديثة تفعل ذلك بالضبط، وعن قصد، قبل أن تُشفّر أي شيء، لأن الضحية القادرة على الاستعادة لا تدفع.
الحل ليس كلمة مرور أقوى. إنه صلاحية غير متماثلة: يمكن للمصدر إضافة بيانات ولا يمكنه إزالة أي منها. ثلاث طرق لبنائها، مرتبة تنازلياً بحسب سهولة تنفيذها بشكل صحيح.
الأولى — وضع append-only المفروض عبر SSH. هذا هو الميدان الأصلي لـBorg وهو الحل الأنظف المتاح على جهاز تملكه. مُدخل authorized_keys من الخطوة 03 يفرض borg serve --append-only، لذا يرفض الطرف البعيد أي حذف مهما طلب الطرف القريب. لا يزال التقليم يجب أن يحدث، لكنه يحدث من جهة الوجهة، وفق جدول لا يستطيع المصدر التأثير فيه، ويُشغّله حساب لا يستطيع المصدر الوصول إليه. مهاجم يملك صلاحيات root على المصدر يستطيع ملء المستودع بالقمامة؛ لكنه لا يستطيع إزالة الأرشيف الخاص بالليلة السابقة لوصوله.
الثانية — نقطة نهاية REST من نوع append-only. rest-server المرافق لـrestic يملك نمط --append-only بنفس الخاصية: الكائنات الجديدة تُقبل، والموجودة لا يمكن حذفها. شغّله على الوجهة خلف TLS، ووجّه RESTIC_REPOSITORY إلى رابط https:// بدلاً من sftp:، ويصبح شكل الدفاع مطابقاً. هذا يكلف خدمة إضافية واحدة على الوجهة ويمنح نفس الضمان.
الثالثة — قفل الكائن. على تخزين متوافق مع S3، يجعل تفعيل الإصدارات إلى جانب فترة احتفاظ بقفل الكائن الحذفَ مستحيلاً حتى تنتهي الفترة، وهو أمر تفرضه طبقة التخزين لا برنامج. إنه الأقوى بين الثلاثة والأكثر كلفة، ويُدخِل حساب مزوّد — ما يُعيد المخاطرة الاحتجازية التي يحاول هذا الدليل بأكمله توزيعها. معقول كنسخة ثالثة، ومحرج كنسخة وحيدة.
إذا لم يناسبك أي من هذه — SFTP عادي، مفتاح قادر على الكتابة وبالتالي على الحذف — فلا تتظاهر بغير ذلك؛ أضِف نسخة ثانية مستقلة لا يستطيع المصدر لمسها إطلاقاً. اسحب بدلاً من أن تدفع: دع الوجهة تسجّل الدخول إلى المصدر، وتقرأ ما تحتاجه، وتخزّنه. عندها تعيش بيانات الاعتماد على الجهاز غير المكشوف، ولا يجد مهاجم على المصدر شيئاً يشير إلى النسخة الاحتياطية. الأمر يتطلب عملاً إضافياً بسيطاً لإعداده، لكنه يقلب المخاطرة في الاتجاه الصحيح تماماً.
أياً كان ما تختاره، تحقق منه بالطريقة نفسها التي تتحقق بها من أي ضابط أمني آخر — بمحاولة كسره. من المصدر، وباستخدام مفتاح النسخ الاحتياطي، حاول تنفيذ حذف. النتيجة الصحيحة هي الرفض.
borg delete ::name-of-an-old-archive
# → Remote: Repository is in append-only mode. Refusing to delete.
لكل خدمة قطعة صغيرة من الحالة ليست بيانات وليست إعداداً، وفقدانها لا يُتلف الخدمة — بل يستبدلها بخدمة مختلفة تحمل الاسم نفسه مصادفة. تنكسر الروابط القديمة، وترفض النظائر الفدرالية الهوية الجديدة، وتُعيد العملاء توليد مفاتيحها. هذه هي تلك القطع، حسب المكدّس، لكل ما يملك هذا الموقع دليلاً عنه.
مجلد البيانات، وconfig/config.php، وتفريغة لقاعدة البيانات. فعّل وضع الصيانة أثناء التفريغة، وأوقفه بعدها — وإلا فإن Nextcloud يكتب إلى الاثنين في آن واحد.
مجلد البيانات بأكمله: db.sqlite3 مأخوذ باستخدام .backup بدلاً من نسخه مباشرة، بالإضافة إلى ملفات rsa_key، والمرفقات، والرسائل المرسلة.
مفتاح التوقيع، وhomeserver.yaml، ومخزن الوسائط، وتفريغة PostgreSQL. فقدان مفتاح التوقيع يعني ضياع هوية الفدرالية نهائياً.
مخزن البريد نفسه، وجداول المستخدمين الافتراضيين، ومفاتيح DKIM الخاصة — مفتاح DKIM جديد يعني أن كل رسالة تبقى غير موقّعة حتى يلحق DNS بالتغيير.
N8N_ENCRYPTION_KEY أولاً، ثم تفريغة PostgreSQL. قاعدة البيانات بلا ذلك المفتاح هي قائمة بسير عمل تكون كل بيانات اعتماده غير قابلة للقراءة.
مجلد الخدمة المخفية. تلك الملفات القليلة هي عنوان .onion — فبدونها تعود الخدمة تحت اسم مختلف ويصبح كل رابط يشير إليها ميتاً.
/etc/wireguard كاملاً. صغير ومملّ، وهو الفارق بين إعادة بناء تستغرق خمس دقائق وإعادة توليد مفاتيح كل جهاز تملكه.
البذرة وحالة القناة، وفق شروط العقدة الخاصة بها. استعادة بيانات قناة قديمة يمكن أن تكلفك أموالاً — اتبع إجراء النسخ الاحتياطي الخاص بالتطبيق نفسه، لا مجرد نسخ ملفات عام.
اسأل معظم الناس لماذا يجب أن تكون النسخة الاحتياطية في مكان آخر، وستكون الإجابة حريقاً، أو فيضاناً، أو انقطاع كهرباء في مركز بيانات. كلها حقيقية، وكلها نادرة أكثر فأكثر، وكلها تجيب عنها مئة كيلومتر من المسافة. الأعطال التي تُسقط الشركات فعلاً في 2026 إدارية، والمسافة وحدها لا تفعل شيئاً حيالها.
حساب واحد هو نقطة فشل واحدة. تعليق بسبب إشارة احتيال آلية، أو استرداد مبلغ بينما كنت على متن طائرة، أو مراجعة امتثال، أو إخطار إزالة موجَّه إلى الشركة لا إلى جهاز بعينه — كل واحد من هذه يصل إلى كل خادم تحت ذلك الحساب في اللحظة نفسها، بما في ذلك الخادم الذي يحمل اللقطات. كان التكرار التقني مثالياً وغير ذي صلة. مزوّدان، أو على الأقل حسابان تحت سقفين قانونيين مختلفين، هما البنية الوحيدة التي تجيب عن هذا.
ولاية قضائية واحدة هي إطار قانوني واحد. المعاقل النوردية الأربعة ليست قابلة للتبادل — فالسويد وفنلندا والنرويج وآيسلندا تحمي كل منها شيئاً مختلفاً قليلاً، والنرويج وآيسلندا تقعان بالكامل خارج الاتحاد الأوروبي. تقسيم جهاز عامل ومستودعه بين اثنتين منهما يعني أن النسخة ليست فقط في مكان آخر؛ بل هي تحت مجموعة ثانية ومستقلة من القواعد. مرجع الولايات القضائية النوردية يستعرض القوانين واحداً تلو الآخر.
والوجهة لا تعرف شيئاً. هذا ما يجعل الفصل رخيصاً بدلاً من أن يكون مقايضة. كل من restic وBorg يُشفّر قبل أن يغادر أي شيء المصدر، لذا يخزّن مضيف المستودع blobs لا يملك مفتاحاً لها. إنه لا يعرف أي الملفات يحتفظ بها، ولا كم عددها، ولا ما هي أسماؤها. أنت لا تمنح ثقة لطرف ثانٍ؛ بل تستأجر قرصاً لا يستطيع قراءة نفسه. وهذه أيضاً الإجابة الصادقة عن سؤال «هل يجب أن أستخدم مزوداً لا أثق به تماماً كوجهة للنسخ الاحتياطي؟» — بالنسبة لمستودع مشفّر، فإن الثقة بالكاد تدخل في المعادلة.
زمن الاستجابة ليس عاملاً مؤثراً. المسافة من Helsinki إلى Reykjavík هي 30 ms على العمود الفقري، ومن Helsinki إلى Stockholm 8 ms، ومن Stockholm إلى Oslo 11 ms. النسخ الاحتياطي الليلي لا يهتم بأي من هذه الأرقام، ولا تهتم بها استعادة محكومة بسرعة القرص. اختر الزوج من أجل المسافة القانونية، لا مسافة الشبكة — فمسافة الشبكة عبر الدول النوردية خطأ تقريب لا أكثر.
شيء أخير يستحق أن يُقال بوضوح، لأنه سبب وجود هذا الدليل على هذا الموقع بدلاً من مدونة سيسادمن عامة: الجهاز الثاني يعيد فتح كل سؤال أجاب عنه الأول. إذا طُلب VPS العامل بلا وثيقة هوية ودُفع بـMonero، ثم طُلب جهاز النسخ الاحتياطي الخاص به ببطاقة شركة ومسح جواز سفر، يصبح الزوج قابلاً للتعرّف بقدر النصف الأضعف بالضبط. الدليل الرئيسي حول استضافة VPS مجهولة الهوية يستعرض الطبقات الثلاث — التسجيل، والدفع، والشبكة — وتنطبق على هدف نسخ احتياطي بقدر انطباقها تماماً على خادم ويب.
المستودع سليم، ومشفّر، وغير قابل للقراءة بشكل دائم. احفظ عبارة المرور — وبالنسبة لـBorg المفتاح المُصدَّر — في مدير كلمات مرور وعلى الورق، قبل أول لقطة.
نُسخت ملفات البيانات الحيّة بدلاً من تفريغها. اكتب تفريغة في خطوة سابقة للنسخ الاحتياطي وانسخ التفريغة احتياطياً؛ ولا تُوجِّه قائمة include أبداً إلى مجلد بيانات محرك يعمل.
بيانات اعتماد قادرة على الكتابة على جهاز مخترق هي بيانات اعتماد قادرة على الكتابة بيد المهاجم. افرض append-only على الوجهة، أو خذ النسخة الثانية بالسحب (pull) بدلاً من الدفع (push).
forget بدون prune تُعلّم اللقطات ولا تستعيد أي مساحة. شغّلهما معاً، وأبقِ مساحة حرة على الوجهة، ولا تنسخ احتياطياً أبداً صور الحاويات أو node_modules.
المؤقت تعطّل بعد ترقية ولم يُخبر أحداً بذلك. أضف وحدة OnFailure=، وتحقق من أعلى قائمة اللقطات مرة كل شهر — الأمر يستغرق عشر ثوانٍ.
مجلد bind mount خارج /opt، أو volume نُقل أثناء ترحيل، أو نمط exclude طابق أكثر مما كان مقصوداً. اسرد مساراً معروفاً في كل لقطة جديدة، وأعد قراءة ملف include بعد أي تغيير في المكدّس.
عشرة أسئلة تُطرح أثناء الإعداد — وسؤالان لا يُطرحان إلا لاحقاً، مرة واحدة.
لا — إنها تراجع (rollback)، ومفيد، لكنها تفشل بالضبط في اللحظات التي وُجدت النسخة الاحتياطية من أجلها. تعيش اللقطة داخل حساب المزوّد نفسه الذي يعيش فيه الخادم الذي تنسخه. إذا عُلِّق الحساب، أو نُوزع دفع، أو أخطأ موظف دعم فحذف بالخطأ، أو حصل مهاجم على بيانات اعتماد لوحتك، تذهب اللقطة مع الجهاز. كما أنها لا تمنحك أي دقّة تفصيلية: لا يمكنك سحب ملف واحد محذوف من الأمس، بل فقط إرجاع القرص بأكمله وخسارة كل شيء منذ ذلك الحين. احتفظ باللقطات — فهي أسرع طريقة للتراجع عن ترقية سيئة — لكن لا تخلط بينها وبين نسخة موجودة في مكان لا تصل إليه المشكلة الأصلية. القاعدة العامة: إذا كان بإمكان بيانات اعتماد واحدة مخترقة تدمير النسختين معاً، فأنت تملك نسخة واحدة فقط.
كلاهما يشفّر من جهة العميل، وكلاهما يُزيل التكرار على مستوى القطعة، وكلاهما ناضج، وكلاهما يؤدي المهمة. اختر restic إذا أردت ملفاً ثنائياً ساكناً واحداً، ومستودعاً يمكن أن يعيش على SFTP، أو تخزين كائنات متوافق مع S3، أو خادم REST، أو أي شيء يستطيع rclone الوصول إليه، ولا شيء مُثبَّت على الوجهة إطلاقاً. اختر Borg إذا كانت الوجهة جهاز SSH تتحكم فيه، وتريد أقوى فرض لـ append-only متاح دون تخزين بقفل كائن، وتُعجبك ضغطه الأكثر إحكاماً قليلاً. الفروق العملية التي تحسم الأمر: يحتاج Borg إلى تثبيت borg على الطرفين ولا يتحدث سوى SSH أو مساراً محلياً؛ ويحتاج restic إلى مرحلة تقليم تأخذ قفلاً حصرياً وجيزاً على المستودع. إن لم تستطع الحسم، استخدم restic — فقلة الأجزاء المتحركة على الوجهة تساوي أكثر من أي اختبار أداء.
ابدأ من حجم ما تنسخه احتياطياً فعلياً — لا من حجم القرص الذي يوجد عليه. الحزمة النموذجية المستضافة ذاتياً هي بضعة جيجابايتات من قاعدة البيانات والإعداد بالإضافة إلى ما رفعه المستخدمون. عندئذٍ يُثبت الترحيل عن التكرار والضغط جدواهما: لقطة يومية لمجموعة عمل حجمها 20 GB مع سياسة احتفاظ لاثني عشر شهراً تصل عادة إلى ما بين 40 و80 GB من المستودع، لأن القطع المتغيرة فقط هي التي تُخزَّن مرتين. خادم Sentinel ($3.90 شهرياً، 120 GB من NVMe) يغطي ذلك براحة. انتقل إلى Garrison (240 GB، $7.90) عندما تنسخ عدة خوادم احتياطياً إلى نفس مضيف المستودع، وإلى Bulwark (960 GB، $32.90) عندما تصل مجموعة العمل نفسها إلى مئات الجيجابايتات. حدد الحجم بناءً على المستودع، ثم ضاعِفه — فالمستودع الذي لا مساحة حرة فيه لا يستطيع التقليم، والمستودع الذي لا يستطيع التقليم لا يفعل شيئاً سوى النمو.
يمكنك نسخها. لكن قد لا تستطيع استعادتها. قاعدة بيانات تكتب إلى القرص بينما تقرأها أنت تعطيك مجموعة ملفات من عدة لحظات مختلفة، وهذا هو تعريف النسخة الاحتياطية «الممزقة» — فهي تُستعاد كقاعدة بيانات تالفة، أو أسوأ، كقاعدة بيانات تفتح بشكل طبيعي لكنها تفتقد صفوفاً بصمت. الحل هو تفريغة: pg_dump أو pg_dumpall لـPostgreSQL، وmariadb-dump --single-transaction لـMariaDB وMySQL على جداول InnoDB، وsqlite3 db .backup out.db أو VACUUM INTO لـSQLite. اكتب التفريغة إلى ملف، ثم انسخ الملف احتياطياً. إذا كانت قاعدة البيانات أكبر من أن تُفرَّغ ليلياً، فالبدائل هي لقطة نظام ملفات تُؤخذ أثناء تجميد المحرك لفترة وجيزة، أو أداة النسخ الاحتياطي المادي الخاصة بالمحرك نفسه — لكن بالنسبة لأي شيء يشغّله VPS واحد، فإن التفريغة هي الخيار الصحيح والبسيط.
تكون النسخ الاحتياطية قد ضاعت. كل من restic وBorg يُشفّران من جهة العميل، ولا يملك أي منهما مسار استرداد، أو مفتاحاً رئيسياً، أو تذكرة دعم تفتح لك المستودع. هذا هو المغزى: مضيف الوجهة — حتى لو لم يكن مضيفاً تملكه — لا يرى نصك الصريح أبداً. وهذا يعني أيضاً أن عبارة المرور أصبحت الآن قطعة بيانات تساوي بالضبط كل ما تحميه، ويجب ألا تبقى فقط على الجهاز الذي يُنسخ احتياطياً. ضعها في مدير كلمات المرور الخاص بك، وضع نسخة منها في مكان مادي. بالنسبة لـBorg، صدّر أيضاً مفتاح المستودع باستخدام borg key export واحفظه إلى جانبها؛ ففي نمط repokey يعيش المفتاح داخل المستودع نفسه، لذا فإن مستودعاً لم يعد بإمكانك الوصول إليه يأخذ المفتاح معه.
تمنحه بيانات اعتماد قادرة على الإضافة لا على الحذف. هذا هو القرار التصميمي الأهم في كامل هذا التمرين، لأن برمجيات الفدية الحديثة تبحث أولاً عن إعداد النسخ الاحتياطي وتتعقبه حتى مصدره. ثلاث طرق لتحقيق ذلك. Append-only عبر SSH: في ملف authorized_keys الخاص بالوجهة، افرض الأمر borg serve --append-only --restrict-to-path /srv/borg — يمكن للمصدر كتابة أرشيفات جديدة ولا يمكنه حذف القديمة. Append-only عبر REST: شغّل rest-server الخاص بـrestic مع --append-only ووجّه المستودع إليه عبر HTTPS. قفل الكائن: حاوية متوافقة مع S3 بخاصية الإصدارات وقفل احتفاظ. بروتوكول SFTP العادي لا يمنحك شيئاً من هذا — فمفتاح قادر على الكتابة في مستودع قادر أيضاً على محوه — لذا إن كان SFTP هو وسيلة النقل لديك، اقرنه بنسخة ثانية من نوع pull تُؤخذ من جهة الوجهة، حيث لا تصل إليها بيانات الاعتماد التي يلتقطها المهاجم من المصدر.
اطرح السؤال بالاتجاه المعاكس: كم من العمل أنت مستعد لإعادته؟ هذا الرقم هو هدف نقطة الاستعادة الخاص بك، وهو ما يحدد الفاصل الزمني. التشغيل الليلي مناسب لأغلب الخدمات المُستضافة ذاتياً تقريباً — خادم بريد، أو Nextcloud، أو خادم Matrix الرئيسي، أو محرك سير عمل. أما التشغيل كل ساعة فيستحق العناء عندما تكون البيانات معاملاتية وإعادة إدخالها مستحيلة. أما بالنسبة للاحتفاظ، فالنمط الذي يصمد أمام الواقع هو --keep-daily 7 --keep-weekly 4 --keep-monthly 12: أسبوع من التراجع الدقيق، وشهر من نقاط تفتيش أسبوعية، وسنة من نقاط شهرية، أي نحو 23 لقطة. الذيل الطويل أهم مما يتوقعه الناس، لأن العطل الذي يرصده ليس قرصاً ميتاً — بل تلفاً أو حذفاً لم يلاحظه أحد لستة أسابيع.
مبنى مختلف هو الحد التقني الأدنى؛ أما الولاية القضائية المختلفة فهي الجزء الذي يتخطاه معظم الناس ثم يندمون عليه. حريق أو فيضان أو عطل على مستوى الرف تجيب عنه المسافة وحدها. ما لا تجيب عنه المسافة هو الجانب القانوني أو التجاري: حساب عُلِّق من قِبل مزوّد واحد، أو نزاع دفع، أو إخطار إزالة يصل إلى كل جهاز تحت السقف المؤسسي نفسه، أو أمر قضائي مُبلَّغ لشركة واحدة. إذا كانت النسختان لدى المزوّد نفسه، فرسالة واحدة تصل إلى الاثنين. تقسيم الزوج بين معقلين نورديين — الجهاز العامل في Helsinki، والمستودع في Reykjavík، على بُعد 30 ms على العمود الفقري — لا يكلف شيئاً في زمن الاستجابة ويشتري إطاراً قانونياً ثانياً. تُشفَّر البيانات قبل أن تغادر المصدر على أي حال، لذا فإن الوجهة لا تعرف عنها شيئاً من مجرد حفظها.
التشفير ليس عنق الزجاجة — فالمعالجات الحديثة تنفّذ AES أسرع مما يستطيع رابط بسرعة غيغابت نقل نتيجته، وكلتا الأداتين تستخدمان التسريع بالعتاد أينما توفّر. عنق الزجاجة هو الرفع الأول، لأن كل شيء جديد حينها: على رابط صاعد بسرعة 1 Gbps، تستغرق مجموعة عمل حجمها 20 GB بضع دقائق بمعدل الخط، وأطول من ذلك إذا كانت الوجهة مُقيَّدة أو كانت الملفات كثيرة وصغيرة. كل تشغيل لاحق ينقل فقط القطع التي تغيّرت، وهو ما يبلغ لمكدّس نموذجي عشرات الميغابايتات وينتهي في أقل من دقيقة. إذا كان التشغيل الأول ينافس حِمل عمل إنتاجياً، فقيّد معدله — restic يأخذ --limit-upload بوحدة KiB/s، وBorg يأخذ --upload-ratelimit — وشغّله تحت nice وَionice.
نعم، والسبب ليس هوَساً بالحذر — بل أن الأعطال الشائعة صامتة. المؤقت الذي توقف عن العمل بعد ترقية حزمة. نمط exclude الذي ابتلع مجلد التحميلات بصمت. تفريغة قاعدة البيانات المكتوبة إلى مسار لم تغطّه النسخة الاحتياطية قط. المستودع الذي ما فتئ يفشل في فحص السلامة لأسابيع داخل سجل لا يقرأه أحد. لا شيء من هذا يُعلن عن نفسه؛ وكل ذلك يُكتشف خلال تسعين ثانية باستعادة ملف والنظر إليه. نفّذ استعادة صغيرة شهرياً — اسحب تفريغة قاعدة بيانات واحدة ومجلد بيانات واحد إلى مسار تجريبي وقارنهما — وإعادة بناء كاملة مرة في السنة، على VPS جديد، مع احتساب الوقت. الرقم الناتج عن إعادة البناء تلك هو وقت الاستعادة الحقيقي لديك، ونادراً ما يكون الرقم الذي كنت لتُخمّنه.
Sentinel — 120 GB من NVMe مقابل $3.90 شهرياً، في Helsinki أو Stockholm أو Oslo أو Reykjavík. نطاق ترددي غير مقيَّد، فالاستعادة لا تكلف شيئاً. بلا بريد إلكتروني عند التسجيل، وبلا وثيقة هوية، ووجهة لا تستطيع قراءة بايت واحد مما تحتفظ به.
آخر مراجعة · 2026-08-24 · المصادر · توثيق restic وBorgBackup، وأدلة النسخ الاحتياطي لـPostgreSQL وMariaDB، وsshd authorized_keys(5)، وsystemd.timer(5) · الدورية · سنوياً
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
SSH keys, ufw, fail2ban, kernel knobs, unattended-upgrades.
Deploy your own MCP server on a no-KYC VPS — TLS, streamable HTTP, OAuth.
Host an MCP server with no ID — the privacy stack, crypto-paid.
انقل الوكيل من حاسوبك المحمول — تحديد الحجم، وsystemd، والأسرار، وسقوف الإنفاق.