لو السيرفر وقف الأسبوع اللي فات بسبب رسالة "no space left on device" وطلع السبب Docker images قديمة و build cache بـ 30GB، السكربت اللي هنا هيخلي ده ميحصلش تاني. نظام تنظيف أوتوماتيكي بـ systemd timer بيشتغل كل ليلة 3:30 صباحًا، بيشيل اللي مش مستخدم، ويبعتلك تنبيه Discord لو المساحة المسترجعة شاذة.
أتمتة تنظيف Docker بـ systemd timers
المشكلة باختصار
أي سيرفر بيشغّل Docker لشهور بدون صيانة بيتراكم فيه 4 أنواع من الحثالة: images قديمة مش مستخدمة، containers موقوفة متنساش، volumes يتيمة (dangling)، و build cache layers. المجموع بيوصل بسهولة لـ 30–80GB على سيرفر عنده 5 خدمات. ولما الـ disk يوصل 95% الـ Docker daemon نفسه ممكن يتوقف، ومعاه كل الـ containers. ده single point of failure مباشر.
مثال للمبتدئين: الحتة دي بالظبط زي إيه؟
تخيّل إنك بتطبخ كل يوم في نفس الكيتشن، وبعد كل وجبة بتسيب البواقي في الحلة وتبدأ وجبة جديدة بحلة تانية. بعد أسبوع الحلل كلها ممتلية ومفيش مكان للوجبة الجاية. Docker بالظبط كده: كل pull لـ image جديدة، كل build لـ Dockerfile، كل container بتوقفه، بيسيب بقايا. لو مش بتنضف، الكيتشن بيقفل.
التعريف الدقيق: Docker بيستخدم storage driver (غالبًا overlay2) بيخزّن كل layer من كل image كـ directory منفصل في /var/lib/docker/overlay2. لما image بتتبدّل بنسخة أحدث، الـ layers القديمة مش بتتمسح أوتوماتيكيًا؛ بتفضل موجودة على disk ومفيش pointer ليها — وده اللي اسمه "dangling".
ليه systemd timer مش cron؟
cron قديم، بيشتغل، لكن عنده 3 مشاكل على production:
- لو السيرفر كان مطفي وقت الـ schedule، الـ job مبيتنفذش أبدًا. systemd timer عنده
Persistent=trueبيعوّض التنفيذ أول ما السيرفر يقوم. - الـ logs بتروح لـ mail قد يكون مش مضبوط. systemd بيكتبها في journald مباشرةً وتقدر تشوفها بـ
journalctl -u docker-cleanup.service. - مفيش طريقة نظيفة تشغّل الـ job يدويًا بسرعة. systemd يكفي
systemctl start docker-cleanup.serviceبدون ما تعدل crontab.
مثال للمبتدئين على systemd
systemd هو اللي بيدير كل الخدمات على Linux الحديث. لما بتكتب systemctl status nginx ده systemd بيكلّمك. الـ timer بتاعه زي الـ alarm في موبايلك: بيصحّى خدمة معيّنة في وقت معيّن أو بعد فترة معيّنة من بدء السيرفر.
التعريف الدقيق: systemd timer هو unit file بامتداد .timer بيستهدف unit تاني بامتداد .service (غالبًا من نوع oneshot). الـ scheduler مدمج في PID 1، فمفيش daemon تاني لازم تشغّله.
السكربت الكامل — 3 ملفات
محتاجين ملفات 3: السكربت نفسه، service يشغّله، و timer يجدوله.