بعد الـ Reboot · فصل ٧

رجّع التطبيقات بعد Reboot

pm2 startup · pm2 save · dump.pm2 · unstartup · pm2 update
🎯 الهدف: تخلي PM2 يقوم مع السيستم ويرجّع نفس الـ apps، وتعرف الحاجات اللي بتبوّظ ده.

الفكرة

PM2 عنده حاجة جاهزة للموضوع ده، وهي خطوتين: startup وsave.

pm2 startup

بيخلي PM2 نفسه يقوم مع الـ boot.

pm2 save

بيقول لـ PM2 أنهي apps يرجّعها لما يقوم.

واحدة من غير التانية مش كفاية. startup من غير save يعني PM2 هيقوم فاضي. وsave من غير startup يعني القائمة محفوظة ومحدش هيقراها.

١. خلي PM2 يقوم مع السيستم

terminal
pm2 startup

الأمر ده بيعرف نوع الـ init system عندك (غالبًا systemd على Ubuntu)، وبيطبعلك أمر جاهز يبدأ بـ sudo، شكله كده:

terminal
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u ubuntu --hp /home/ubuntu
  • انسخ الأمر اللي طلعلك إنت بالظبط ونفذه، متكتبوش من دماغك. الأمر فيه مسار الـ node واسم اليوزر والـ home بتوعك.
  • الأمر ده بيعمل service اسمها pm2-<username>، بتقوم مع الـ boot.
  • شغّل pm2 startup نفسه من غير sudo. هو بس اللي بيطبع الأمر، والأمر المطبوع هو اللي فيه sudo.

٢. احفظ الـ apps الشغالة

شغّل الـ apps الأول، وبعدين احفظ القائمة:

terminal
pm2 start ecosystem.config.jspm2 save

الأمر pm2 save بيكتب الـ apps الشغالة حاليًا في ملف ~/.pm2/dump.pm2. ولما السيرفر يقوم، PM2 بيقرأ الملف ده ويرجّع كل حاجة زي ما كانت.

٣. اتأكد إن الـ service شغالة

اسم الـ service هو pm2- وبعده اسم اليوزر اللي نفّذ أمر الـ startup. يوزر ubuntu يبقى pm2-ubuntu. يوزر saeed يبقى pm2-saeed.

terminal
whoamisystemctl is-enabled pm2-$(whoami)systemctl is-active pm2-$(whoami)systemctl status pm2-$(whoami)
  • is-enabled: هتقوم مع الـ boot ولا لأ. الناتج المطلوب enabled.
  • is-active: شغالة دلوقتي ولا لأ. active يعني systemd هو اللي ماسك الـ daemon. inactive أول مرة بعد pm2 startup مش دايمًا مشكلة، لأنك ممكن تكون شغّلت الـ apps بإيدك والـ service لسه متعملهاش start. بعد أول reboot المفروض تبقى active.
  • status: يجمع الاتنين، ويعرض آخر سطور من اللوج. لو وقعت، دور على failed.

بعد reboot، pm2 list من نفس اليوزر لازم يوريك الـ apps. systemctl بيقول إن المنبّه صحّى البواب. pm2 list بيقول إن السكان رجعوا.

كل يوزر له service

الـ service مش بتاع السيرفر كله. مربوطة باليوزر في تلات حتت:

  • الاسم: pm2-<username>.
  • سطر User= جوه ملف الـ service، وفي PM2_HOME=/home/<username>/.pm2.
  • القائمة: pm2 resurrect بيقرا dump.pm2 اللي في الهوم ده بس.

لو على الجهاز يوزر ubuntu ويوزر deploy، وكل واحد شغّل pm2 startup وبعدين pm2 save، هيبقى فيه خدمتين:

الـ serviceبتقوم بإيه
pm2-ubuntuتطبيقات /home/ubuntu/.pm2/dump.pm2
pm2-deployتطبيقات /home/deploy/.pm2/dump.pm2

مفيش واحدة فيهم بتشوف تطبيقات التانية. كل يوزر لازم ينفّذ pm2 startup وpm2 save وهو داخل بحسابه. pm2 list من غير sudo يوريك بتوعك بس.

terminal
systemctl list-units --type=service 'pm2-*'ls /etc/systemd/system/pm2-*.service

لو عملت pm2 save بحساب وstartup بحساب تاني، الـ service هتقوم وتلاقي قائمة فاضية أو قائمة قديمة بتاعة الحساب التاني.

حاجات لازم تاخد بالك منها

  • بعد أي تغيير في الـ apps: ضفت app أو مسحت واحدة أو غيرت الإعدادات أو عدد الـ instances، اعمل pm2 save تاني. وإلا هيرجع للنسخة القديمة بعد الـ restart.
  • نفس اليوزر في startup وفي save. الـ service بتقرا هوم اليوزر المكتوب في اسمها، مش هوم اليوزر التاني.
  • لو بتستخدم nvm وغيرت نسخة Node: اعمل pm2 unstartup وبعدها pm2 startup تاني، لأن الـ service فيها مسار الـ node القديم (في سطر Environment=PATH=...).
  • لو حدّثت PM2 نفسه: اعمل pm2 update عشان الـ daemon اللي شغال يتحدث. تحديث الـ package بس مش بيغيّر الـ daemon اللي في الـ memory.
  • الـ env variables (زي SSL_PUBLIC_KEY وSERVERHTTPS): الأضمن تحطها في الـ ecosystem file أو في .env يتقري من الكود، مش في الـ shell، عشان تبقى موجودة بعد الـ reboot.
terminal (لو غيرت Node بـ nvm)
pm2 unstartup     # هيطبع أمر sudo يشيل الـ service القديمة، نفّذهpm2 startup       # هيطبع أمر sudo جديد بمسار الـ node الجديد، نفّذهpm2 resurrect     # لو الـ apps وقفت مع الـ unstartuppm2 save
ecosystem.config.js
module.exports = {  apps: [    {      name: "LMS::backend",      script: "./bin/www",      cwd: "/home/ubuntu/lms-backend", // عشان .env يتقري من مكان ثابت      exec_mode: "cluster",      instances: "max",      env: { NODE_ENV: "production", PORT: 4000, SERVERHTTPS: "1" },    },  ],};

والأسرار نفسها، زي مسار الـ private key أو باسوورد الداتابيز، متتحطش في Git. حطها في .env على السيرفر بصلاحيات 600، والكود يقراها.

لو عايز تلغيه

terminal
pm2 unstartup

ده بيطبع أمر sudo، والأمر ده بيعمل systemctl stop وبعدين disable وبعدين بيمسح ملف الـ service.

خلّصت الفصل لما

🧠 اختبر نفسك
١) عملت pm2 save بس. التطبيقات هترجع بعد الـ reboot؟
لأ، لأن مفيش حاجة هتشغّل PM2 مع الـ boot. محتاج pm2 startup.
٢) غيرت instances من 4 لـ 8 ومعملتش save. بعد الـ reboot هتلاقي كام؟
4، لأن dump.pm2 لسه فيه النسخة القديمة.
٣) عملت nvm install 22 وبقيت تستخدمه. ليه startup تاني؟
لأن الـ service فيها PATH بمسار الـ node القديم، ولو اتمسح الـ service مش هتلاقي node.
٤) حدّثت PM2 بـ pnpm add -g pm2. ليه pm2 update؟
عشان الـ daemon اللي شغال في الـ memory يتبدل بالنسخة الجديدة.
٥) يوزر ubuntu ويوزر deploy كل واحد عامل pm2 save. كام service محتاجين؟
اتنين: pm2-ubuntu وpm2-deploy. كل واحدة بتقرا dump.pm2 في هوم اليوزر بتاعها بس.