الفكرة
في كل مرة استلمت سيرفر جديد، كنت أعيد نفس الخطوات يدويًا: مستخدم، SSH، جدار ناري، fail2ban… ومع كل تكرار، بنسى خطوة أو أختلف في ترتيبهم. الحل: سكربت تكرار (idempotent) يعرف الحالة الأول ولا يغيّر غير اللي لازم يتغير.
التصميم
المنطق مكتوب بـ Python (قراءة الإعداد من TOML، التسجيل، dry-run، ترتيب المراحل)، بينما العمليات النظامية في سكربتات Bash مستقلة تقدر تقراها وتراجعها. كل مرحلة من المراحل التسعة بتفحص الحالة الأول: لو المضبوطات موجودة صحيحة بتروح بعدها من غير لمس.
الأمان بالترتيب
- SSH: تعطيل دخول root والمصادقة بالكلمة، والتحقق من
sshd -tقبل أي reload مع نسخة احتياطية لكل ملف يُستبدل. - UFW: رفض الوارد افتراضيًا مع فتح 22/80/443 فقط.
- fail2ban ضد تخمين الـ sshd، وتحديثات أمنية تلقائية عبر
unattended-upgrades.
الاستخدام
sudo ./bootstrap.sh --dry-run # استعراض كامل بدون أي تعديل
sudo ./bootstrap.sh --only docker # مرحلة محددة
sudo ./bootstrap.sh --skip docker,swap
كل تشغيل يسجّل كل سطر في logs/bootstrap-<timestamp>.log.