النسخ الاحتياطي: الملاحظات مشفرة كل عشر دقائق، والكود كل ليلة

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

النسخ الاحتياطي لا يحتاج إلى AI. سكربتات عادية يشغلها الكمبيوتر وحده، والـ AI يتدخل فقط عندما يحدث خطأ. عندي ثلاث مهام، كل واحدة لشيء مختلف.

الملاحظات: كل عشر دقائق، ومشفرة

ملاحظاتي كلها ملفات Markdown في مجلد واحد، وهذا المجلد مستودع git. كل عشر دقائق، يفحص سكربت صغير ما تغير: إذا وجد تغييرًا، ينشئ commit ويرفعه إلى مستودع خاص على GitHub. وإذا فشلت محاولة رفع سابقة، يعيدها. وتعمل نسخة واحدة فقط في الوقت نفسه.

والمستودع مشفر بـ git-crypt: يرفع محتوى كل ملف مشفرًا، باستثناء ملفين للإعدادات. لذلك، إذا رأى أحد المستودع، يرى أسماء الملفات ورسائل الـ commit، لكنه لا يستطيع قراءة الملاحظات دون المفتاح.

وإذا استمر الرفع، لا تتأخر النسخة على GitHub أكثر من دقائق. وإذا تعطل، يلاحظ فحص الكمبيوتر صباحًا أن النسخة قديمة، ويظهر ذلك في ملخص الصباح.

الكود: كل ليلة

الساعة 11:30 ليلًا، يمر سكربت آخر على مشاريعي: ينشئ commit لما تغير، ويرفعها إلى مستودعاتها الخاصة على GitHub. وهناك قاعدتان لا يخالفهما:

  • لا يرفع إلا بعد فحص الأسرار. قبل أي رفع، يشغل gitleaks للبحث عن مفاتيح أو كلمات سر في الكود. إذا وجد شيئًا، لا يرفع.
  • لا يرفع بالقوة أبدًا (force push)، حتى لا يمسح عملًا موجودًا.

وفي بعض المشاريع، ينشئ الـ agent الذي يعمل فيها commit لعمله بنفسه، فيكتفي السكربت برفعه، ولا ينشئ commit بدلًا منه.

ملفات تطبيق العائلة: كل أسبوع

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

كيف أعرف أنها عملت

  • الكود: يكتب السكربت الليلي ملف حالة: هل نجح أم لا، ومتى انتهى. ويعرض لي ملخص الصباح بطاقة إذا فشل، أو إذا مضى أكثر من يومين على آخر نجاح.
  • الملاحظات: يتحقق فحص الكمبيوتر صباحًا من موعد آخر نسخة، وإذا كانت قديمة، تظهر في الملخص.
  • ملفات التطبيق: في صفحة البداية.

لأن عدم تنفيذ النسخة أصلًا فشل أيضًا، لكنه لا يظهر.

كيف تبني واحدًا مثله

هذا على Linux فيه systemd، ويجب أن يكون الكمبيوتر قيد التشغيل.

شفر الملاحظات

ابدأ بمستودع جديد، وجهز التشفير قبل أن تضع أي ملاحظة فيه. ثبت git-crypt، ثم:

mkdir ~/notes && cd ~/notes
git init
git-crypt init
git-crypt export-key ~/notes-backup.key
Terminal

واحفظ المفتاح في مكان آمن خارج المستودع، مثل مدير كلمات السر. دونه، لا يمكن قراءة النسخة. وبعد ذلك، وقبل أن تضع أي ملاحظة، ضع هذا في ملف .gitattributes، لتشفير كل ملف باستثناء ملفات الإعدادات:

* filter=git-crypt diff=git-crypt
.gitattributes !filter !diff
.gitignore !filter !diff
Terminal

ضع ملاحظاتك، وشغل git-crypt status، وتأكد أن كل ملاحظة مشفرة قبل أول رفع. وأسماء الملفات ورسائل الـ commit لا تتشفر. أما المستودع الموجود من قبل، فيبقى تاريخه القديم قابلًا للقراءة، لذلك يحتاج نقل ملاحظات موجودة في git إلى نقل مدروس.

نسخ الملاحظات

مجلد ملاحظاتي ~/notes مستودع git مشفر بـ git-crypt ومربوط بمستودع خاص على GitHub، والرفع يعمل دون كلمة سر. اكتب لي سكربت اسمه notes-backup ينشئ commit ويرفع إذا تغير شيء، ويعيد أي محاولة رفع فشلت سابقًا، ولا تعمل منه إلا نسخة واحدة في الوقت نفسه. ثم أنشئ له systemd user service وtimer يشغله كل عشر دقائق.
Prompt

ثم شغل الـ timer، واجعل مهامك تعمل حتى لو لم تسجل الدخول:

systemctl --user daemon-reload
systemctl --user enable --now notes-backup.timer
loginctl enable-linger $USER
systemctl --user list-timers
Terminal

وجرب الاسترجاع مرة: انسخ المستودع في مجلد آخر، وادخل فيه، وشغل git-crypt unlock ~/notes-backup.key (أو في المكان الذي حفظت فيه المفتاح)، وتأكد أنك تستطيع قراءة ملاحظاتك.

نسخ الكود

اكتب لي سكربت ليلي يمر على مشاريعي في ~/Projects: ينشئ commit لما تغير، ويرفع كل مشروع إلى مستودعه. قبل أي رفع، شغل gitleaks، وإذا وجد سرًا فلا ترفع. لا تستخدم force push أبدًا. وفي النهاية، اكتب ملف حالة JSON فيه allOk وfinishedAt وأي مشروع فشل ولماذا.
Prompt

اجعله يخبرك

أضف سطرًا في ملاحظة ملخص الصباح: اقرأ ملف الحالة، واعرض بطاقة إذا كانت allOk خاطئة، أو finishedAt أقدم من يومين، أو الملف غير موجود.

ما تعلمته

  • ليس كل شيء بحاجة إلى AI. السكربت العادي أرخص وأكثر ثباتًا، والـ AI يفيد عندما يحتاج شيء إلى القراءة والتفكير فيه.
  • عدم تنفيذ النسخة فشل. يجب أن تتحقق من موعد آخر نجاح، وليس فقط من وجود فشل.
  • فحص الأسرار قبل الرفع، وليس بعده. لأن الرفع حدث بالفعل.
  • النسخة المشفرة دون مفتاح لا تنفع. جرب الاسترجاع مرة، قبل أن تحتاج إليه.

الأدوات

المقال التالي في السلسلة: صحة الكمبيوتر والحارس.

المصادر

العودة إلى القائمة