المستوى المطلوب: مبتدئ — مناسب لأي حد يعرف يفتح Terminal ويكتب أمر، حتى لو دي أول مرة يسمع فيها كلمة systemd.
في آخر المقال هتقدر تخلّي أي تطبيق (Node.js أو Python أو أي بروسيس) يشتغل لوحده أول ما السيرفر يقوم، ويرجّع نفسه في ثواني لو وقع، من غير ما تفضل صاحي تراقبه.
إزاي تخلّي تطبيقك خدمة دائمة على لينكس بـ systemd
المشكلة باختصار
شغّلت تطبيقك بـ node app.js، وقفلت الـ SSH، فالتطبيق وقف معاك. أو السيرفر عمل reboot الساعة 3 الفجر، ومحدش شغّل التطبيق تاني، فالموقع قعد نازل لحد ما عميل اتصل يشتكي. ده مش سوء حظ. ده غياب حاجة تدير خدمتك وتراقبها بدالك. الحاجة دي موجودة أصلاً في سيرفرك واسمها systemd.
الفكرة بمثال قبل التعريف العلمي
تخيّل عمارة فيها حارس. لو لمبة السلّم انطفت، بيغيّرها على طول. لو المصعد وقف، بيعيد تشغيله. لو فيه قطع كهربا ورجعت، بيتأكد إن كل حاجة رجعت تشتغل. انت مش قاعد تراقب العمارة بنفسك، الحارس بيعمل ده 24 ساعة.
systemd هو حارس العمارة بتاع لينكس. بالتعريف الدقيق: هو الـ init system والـ service manager اللي بيشتغل كأول بروسيس في النظام (الـ PID رقم 1) بمجرد الإقلاع، ومسؤول عن تشغيل وإيقاف ومراقبة كل الخدمات. لما تعرّف تطبيقك كـ خدمة (service unit)، systemd بيضمن 3 حاجات: يشغّله عند إقلاع السيرفر، يعيد تشغيله لو وقع، ويجمّع لوجاته في مكان واحد تقدر تقراه بأمر واحد.
ملف الوحدة خطوة بخطوة (مثال شغّال)
الافتراض إن عندك سيرفر لينكس واحد (مثلاً Ubuntu 22.04 أو 24.04) بصلاحية sudo، وتطبيق Node.js موجود في /opt/myapp/app.js. الخطوات دي بنفس المنطق على Python، بس غيّر سطر ExecStart.
أنشئ الملف ثم الصق فيه التعريف:
sudo nano /etc/systemd/system/myapp.service[Unit]
Description=My Node App
After=network.target
StartLimitIntervalSec=60
StartLimitBurst=5
[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/app.js
Restart=always
RestartSec=3
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.targetدلوقتي حمّل التعريف وفعّل الخدمة: