نظام متكامل أديره، وبراهينه قابلة للتحقق مباشرة
الموقع الذي تقرؤه يعمل على خادم أُعدّه وأؤمّنه وأحدّثه وأراقبه بنفسي، من الجهاز الفارغ حتى هذه الصفحة.
الحاجة
على ملف الأعمال أن يُثبت المهارات لا أن يكتفي بسردها. واستضافته على منصة مُدارة كانت ستُخفي بالضبط ما أريد إظهاره: تشغيل خدمة موثوقة وآمنة على المدى الطويل.
الفكرة
أن تصبح الاستضافة نفسها هي البرهان: كل ما هو مكتوب هنا يمكن التحقق منه مباشرة، على الجهاز نفسه الذي يقدّم هذه الصفحة.
ما الذي بنيته
- خادم سحابي في منطقة باريس، حصلت عليه بعد ست محاولات على مدى عدة أيام، لأن السعة المجانية هناك نادرة.
- منظومة الويب كاملة، حيث تعمل كل خدمة في مساحة مقيّدة خاصة بها حتى لا تنتقل مشكلة من خدمة إلى أخرى.
- بدأ تعزيز الأمان منذ الليلة الأولى — طُبّقت 7 إجراءات في ليلة واحدة دون أي انقطاع للخدمة — ثم تواصل خطوة بخطوة.
- تحديثات تلقائية: يُنشر التغيير المعتمد من تلقاء نفسه، ويُفحص، ويُتراجع عنه آليًا إذا لم تستجب النسخة الجديدة.
- نسخ احتياطي مستمر لقاعدة البيانات، إضافة إلى لقطات ليلية تُحفظ يوميًا وأسبوعيًا وشهريًا.
- مسبار مستقل يفحص أمان الموقع كل ساعة وينشر النتيجة، ويمكنك رؤيتها أدناه.
النتيجة
- 5فحوص أمنية يعيد تشغيلها مسبار منفصل كل ساعة
- 7طُبّقت في ليلة واحدة دون انقطاع
- 6محاولات للحصول على الخادم
- ساعةبين كل فحصين أمنيين مستقلين
يقدّم هذا الخادم ملف الأعمال هذا منذ أغسطس 2026، إلى جانب EventMap. والفحوص المباشرة أدناه يقيسها مسبار مستقل، ولا شيء منها مكتوب يدويًا.
تحقّق بنفسك
فحوص مباشرة
- TLS تم التحقق
- الخادم الأصلي تم التحقق
- الترويسات تم التحقق
- DNSSEC تم التحقق
- التوفّر تم التحقق
بالصور
ما الذي تعلّمته
لا تختبر أبدًا من داخل الجهاز وحده: مع جدارَي حماية متراكبين، قد تستجيب خدمة على نحو ممتاز محليًا بينما لا يستطيع أحد على الإنترنت الوصول إليها. واختيار عدم تثبيت شيء ما — هنا خادم قاعدة بيانات — هو أيضًا مهارة تشغيلية.
التفاصيل التقنية التقنيات والبنية والقرارات، للقرّاء التقنيين
التقنيات المستخدمة
- Ubuntu 22.04
- Oracle Cloud ARM (Always Free)
- nginx
- Node.js + Express
- SQLite (node:sqlite)
- systemd
- fail2ban
- iptables
- Cloudflare
- GitHub Actions
- Litestream + restic
البنية في لمحة
- متصفح الزائر
- Cloudflare — TLS والتخزين المؤقت
- nginx — ترويسات الأمان، وتحديد معدل الطلبات
- Node.js + Express — صفحات تُولَّد على الخادم بسبع لغات؛ خدمة systemd معزولة
- SQLite (node:sqlite) — المشاريع، وسجلات زيارات ذاتية دون أي طرف ثالث
- من حولها: يختبر GitHub Actions كل تغيير؛ ويسحب الجهاز الافتراضي (VM) الإصدار المعتمد، ويفحص /health، ويتراجع آليًا عند الفشل؛ ويعيد مرصد الأمان فحص الحماية كل 30 دقيقة.
كيف يعمل
- جهاز افتراضي بـ 4 OCPU و24 GB (Ubuntu 22.04). وكيل عكسي nginx أمام خدمات معزولة، تعمل كل منها بمستخدم نظام مخصّص بلا صدفة أوامر، مع ProtectSystem=strict وNoNewPrivileges.
- الليلة الأولى (23 أغسطس 2026): إعادة توليد كلمة مرور الإدارة، وfail2ban على SSH، وترويسات أمان صارمة (CSP وHSTS وX-Frame-Options)، وتصفير آخر جزء من عنوان IP في سجلات الوصول، وتحديد مدة احتفاظ journald، وتدوير سجلات nginx، ونسخة احتياطية مشفّرة للأسرار محفوظة خارج الجهاز.
- ثم: تحديد معدل الطلبات في nginx، وتعطيل rpcbind، وذاكرة swap، وحصر سطح المكتب البعيد في 127.0.0.1 (عبر نفق SSH فقط)، وتعطيل المصادقة بكلمة المرور في SSH، وشهادة Cloudflare Origin CA في وضع Full (strict).
- نشر مستمر بطريقة السحب: يُتحقق من كل دفع إلى master في GitHub Actions، الذي ينقل وسم prod؛ ويسحبه الجهاز عبر مؤقّت systemd، ويفحصه، ويتراجع آليًا عند الخلل. لا منفذ وارد مفتوح، ولا بيانات اعتماد للجهاز مخزّنة لدى GitHub.
- جداران ناريان متراكبان (iptables على الجهاز + قائمة Security List في السحابة)، وهذا سبب عدم اختباري من داخل الجهاز وحده أبدًا.
- موازنة مقصودة: تُثبَّت التحديثات الأمنية تلقائيًا، لكن الجهاز لا يُعيد التشغيل ولا يغيّر إصداره الرئيسي من تلقاء نفسه أبدًا.
- تتبّع ذاتي للزيارات فقط: لا ملفات تعريف ارتباط من أطراف أخرى، وتُجزَّأ عناوين IP قبل التخزين، وتُحذف السجلات بعد 12 شهرًا.
القرارات والموازنات
- صفحات تُولَّد على الخادم بدل تحميلها في المتصفح: تبقى قابلة للفهرسة بسبع لغات، ومقروءة دون JavaScript.
- خدمات systemd بدل Docker: تعمل بيئة الإنتاج كوحدات systemd معزولة مع حصص للمعالج والذاكرة؛ فحاوية لا تُنشر أبدًا لن تُثبت شيئًا.
- تدفق JSON عام واحد (/api/contenus.json) تعيد Mindmap استخدامه، بدل واجهة برمجية ثانية: مصدر واحد للحقيقة، ولا شيء يحتاج إلى مزامنة.
المشكلات وحلولها
- بعد إعادة التصميم، تجاوز التقرير الآلي لطلبات الدمج (pull requests) حدَّ GitHub البالغ 65,536 حرفًا للتعليق الواحد، بسبب لقطات الشاشة المضمّنة: نجحت الاختبارات لكن النشر فشل. وجاء الحل بصور مصغّرة أخف وسقف قدره 60,000 حرف.
- ظل Cloudflare يقدّم نصوصًا برمجية قديمة لمدة تصل إلى 4 ساعات بعد النشر: صار كل عنوان URL لملفات CSS وJavaScript يحمل بصمة لمحتواه (?v=)، فلا تختلط نسخة جديدة أبدًا بملفات قديمة.
- في العربية، كانت قيمة مثل «43 → 9.9 MB» تُعرض معكوسة بسبب خوارزمية النص ثنائي الاتجاه: صارت القيم اللاتينية تُعزل الآن بعلامات Unicode.
ما لا يزال ناقصًا
- لا إعادة تشغيل تلقائية، وهو خيار مقصود