الـ Deployment المخيف أصبح ذكرى: كيف أتمتتُ نشر تحديثات موقعي باستخدام n8n

أذكرها وكأنها البارحة، تلك الليلة التي قررت فيها نشر تحديث بسيط على مدونتي qedama.com. كانت الساعة قد تجاوزت منتصف الليل، والهدوء يعمّ المكان إلا من صوت نقرات أصابعي على لوحة المفاتيح وصوت قلبي الذي كان يدقّ خوفاً. “مجرد `git pull` بسيطة يا أبو عمر، شو اللي بخوّف؟” كنت أقول لنفسي.

بدأت العملية اليدوية: دخلت عبر SSH للسيرفر، نفذت الأمر، وانتظرت. وفجأة، الشاشة البيضاء. “شاشة الموت البيضاء” الشهيرة. تجمّد الدم في عروقي. هل نسيت تشغيل `composer install`؟ هل هناك مشكلة في الصلاحيات؟ أم أن التحديث الجديد يحتوي على خطأ لم يظهر على جهازي المحلي؟ قضيت الساعتين التاليتين في محاولة يائسة لإصلاح الموقع، والعرق يتصبب مني وكأني في ماراثون. في تلك اللحظة، أقسمت أن هذه ستكون آخر مرة أقوم فيها بعملية نشر يدوية بهذه الطريقة البدائية والمخيفة.

هذه القصة، يا أصدقائي، هي التي دفعتني للبحث عن حل جذري. حل يعيد لي متعة البرمجة ويخلصني من “الـ Deployment المخيف”. واليوم، أشارككم هذا الحل الذي غيّر طريقة عملي تماماً: الأتمتة باستخدام أداة n8n.

لماذا الأتمتة؟ ولماذا n8n بالذات؟

عملية نشر التحديثات (Deployment) هي سلسلة من الخطوات المتكررة. وأي شيء متكرر يقوم به الإنسان هو عرضة للخطأ والنسيان. نحن ننسى خطوة، نكتب أمراً بشكل خاطئ، أو ببساطة نشعر بالتوتر فنفسد الأمور. الأتمتة تحل هذه المشكلة عن طريق توكيل هذه المهام لروبوت لا يكل ولا يمل ولا ينسى.

هناك أدوات عملاقة في هذا المجال مثل Jenkins أو GitHub Actions، وهي قوية جداً. لكن بصراحة، قد تكون معقدة للمشاريع البسيطة والمتوسطة، وصيانتها تتطلب وقتاً وجهداً. كنت أبحث عن شيء أبسط، مرئي، ويمكنني استضافته على خادمي الخاص بسهولة. وهنا يأتي دور n8n.

n8n هي أداة أتمتة مفتوحة المصدر ومنخفضة الكود (Low-code). فكرتها تشبه تجميع مكعبات الليغو: لديك مجموعة من “العُقَد” (Nodes) الجاهزة، وكل عقدة تقوم بمهمة محددة (إرسال بريد، الاتصال بقاعدة بيانات، تنفيذ أمر SSH)، وأنت تقوم بربط هذه العُقَد معاً لتشكيل “مسار عمل” (Workflow) متكامل. جمالها يكمن في بساطتها البصرية وقوتها الكامنة.

بناء خط الإنتاج (Pipeline) خطوة بخطوة

دعونا الآن نبني معاً مسار العمل الذي أنقذني من قلق النشر. هذا المسار يقوم تلقائياً بنشر التحديثات الجديدة لمدونتي بمجرد أن أقوم بإنشاء “وسم إصدار” (Git Tag) جديد في المستودع البرمجي.

الخطوة الأولى: الزناد (The Trigger) – Git Tag Webhook

كل أتمتة تبدأ بحدث. في حالتنا، الحدث هو إنشاء وسم جديد مثل `v1.0.1`. للقيام بذلك، نستخدم “خطاف الويب” (Webhook).

  1. اذهب إلى إعدادات المستودع البرمجي الخاص بك (على GitHub, GitLab, etc.).
  2. ابحث عن قسم Webhooks وأضف واحداً جديداً.
  3. في n8n، أنشئ مسار عمل جديد وأضف عقدة “Webhook”. ستعطيك هذه العقدة رابطاً فريداً.
  4. انسخ هذا الرابط والصقه في حقل “Payload URL” في إعدادات الـ Webhook على GitHub.
  5. اختر أن يتم إرسال الحدث عند إنشاء وسم (Push event, or specifically Tag creation event if available).

الآن، كلما قمت بدفع وسم جديد إلى المستودع، سيقوم GitHub بإرسال إشعار إلى n8n، ليبدأ مسار العمل تلقائياً.

نصيحة أبو عمر: لا تنسَ إضافة “Secret” في إعدادات الـ Webhook. هذا يضمن أن الطلبات التي تصل إلى n8n هي فقط من GitHub وليس من أي مصدر آخر يحاول العبث بمسار عملك.

الخطوة الثانية: يا أمان يا رحمن! – أخذ نسخة احتياطية

قبل لمس أي شيء على السيرفر الإنتاجي، القاعدة الأولى والذهبية هي: خذ نسخة احتياطية!. سنستخدم عقدة “SSH” لتنفيذ أمر يقوم بنسخ قاعدة البيانات.

  1. أضف عقدة “SSH” بعد عقدة الـ Webhook.
  2. في إعدادات العقدة، قم بإضافة بيانات اعتماد الدخول للسيرفر (Host, User, Port, and Private Key). نصيحة: استخدم مدير بيانات الاعتماد المدمج في n8n للحفاظ على أمان معلوماتك.
  3. في حقل “Command”، اكتب الأمر المناسب لنسخ قاعدة بياناتك. على سبيل المثال، لقاعدة بيانات MySQL:
mysqldump -u db_user -p'your_secret_password' db_name > /path/to/backups/backup-$(date +%F-%T).sql

هذا الأمر سيقوم بإنشاء ملف SQL يحتوي على نسخة كاملة من قاعدة البيانات، مع تسميته بتاريخ ووقت النسخ لسهولة التعرف عليه. النسخة الاحتياطية اللي ما جربت ترجعها، كأنها مش موجودة! فتأكد بين الحين والآخر أنك قادر على استعادة هذه النسخ.

الخطوة الثالثة: النشر على بركة الله – التحديث الفعلي

بعد أن أخذنا نسخة احتياطية واطمأن قلبنا، حان وقت التحديث الفعلي. سنستخدم عقدة “SSH” أخرى لتنفيذ أوامر النشر.

  1. أضف عقدة “SSH” جديدة.
  2. استخدم نفس بيانات الاعتماد السابقة.
  3. في حقل “Command”، سنجمع الأوامر اللازمة للتحديث. على سبيل المثال، لمشروع PHP يستخدم Composer:
cd /var/www/qedama.com && 
git pull origin main && 
composer install --no-dev --optimize-autoloader && 
php artisan optimize:clear

دعونا نفصّل هذا الأمر:

  • cd /var/www/qedama.com: الانتقال إلى مجلد المشروع على السيرفر.
  • git pull origin main: سحب آخر التحديثات من الفرع الرئيسي (main).
  • composer install --no-dev --optimize-autoloader: تثبيت الاعتماديات (dependencies) مع تجاهل حزم التطوير وتحسين الـ autoloader للبيئة الإنتاجية.
  • php artisan optimize:clear: (خاص بإطار عمل Laravel) مسح الكاش المُخزن لضمان تطبيق التغييرات الجديدة. يمكنك استبداله بالأمر المناسب لمشروعك.

الخطوة الرابعة: اطّمن يا قلبي – فحص سلامة الموقع

تم التحديث، ولكن هل الموقع يعمل حقاً؟ لا يمكننا أن نثق بشكل أعمى. يجب أن نتأكد. سنستخدم عقدة “HTTP Request” لإجراء فحص سريع.

  1. أضف عقدة “HTTP Request”.
  2. في حقل “URL”، ضع رابط موقعك (مثلاً: https://qedama.com).
  3. اترك نوع الطلب “GET”.
  4. شغّل العقدة. إذا عاد الموقع بحالة “Status Code 200″، فهذا يعني أن الصفحة الرئيسية تعمل بنجاح.

هذه الخطوة البسيطة هي بمثابة جهاز مراقبة القلب لعملية النشر. إذا فشلت (مثلاً أعادت 500)، يمكننا إعداد مسار عمل لإرسال تنبيه بالفشل فوراً.

الخطوة الخامسة: بشّر ولا تنفّر – إرسال إشعار النجاح

إذا سارت كل الخطوات السابقة بنجاح، نريد أن نحتفل! سنستخدم عقدة “Telegram” (أو Slack, Email, etc.) لإرسال إشعار بأن العملية تمت بسلام.

  1. أضف عقدة “Telegram”.
  2. قم بإعداد بيانات اعتماد البوت الخاص بك (Bot API Token).
  3. أضف “Chat ID” الخاص بك أو بالقناة التي تريد إرسال الإشعار إليها.
  4. في حقل “Text”، اكتب رسالة النجاح. يمكنك حتى استخدام بيانات من الخطوات السابقة!
تم تحديث مدونة قدامة بنجاح! ✅

الإصدار الجديد: {{ $json.body.ref.split('/').pop() }}
الموقع يعمل بشكل سليم 🟢

اذهب واستمتع بقهوتك ☕

لاحظ كيف استخدمنا {{ $json.body.ref.split('/').pop() }} لجلب اسم الوسم (Tag) من بيانات الـ Webhook التي وصلت في الخطوة الأولى. هذا يجعل الإشعار ديناميكياً ومفيداً.

الصورة الكاملة: كيف يبدو الـ Workflow؟

في النهاية، سيبدو مسار عملك في n8n كسلسلة منطقية وبصرية جميلة:

[Webhook Trigger] -> [SSH: Backup DB] -> [SSH: Git Pull & Composer] -> [HTTP Request: Health Check] -> [Telegram: Success!]

بسيط، واضح، وفعّال بشكل لا يصدق.

نصائح أبو عمر الذهبية

  • ابدأ ببيئة تجريبية (Staging): قبل تطبيق هذا على موقعك الإنتاجي، جربه أولاً على سيرفر تجريبي. أنشئ نسخة طبق الأصل من موقعك وقم بأتمتة عملية النشر عليها. عندما تثق بالعملية 100%، انقلها للبيئة الإنتاجية.
  • خطط للفشل (Error Handling): ماذا لو فشلت خطوة النسخ الاحتياطي أو خطوة التحديث؟ n8n يسمح لك بإضافة مسارات للخطأ. يمكنك مثلاً إرسال إشعار فشل عبر تليجرام مع تحديد الخطوة التي فشلت، أو حتى محاولة تنفيذ أمر “Rollback” يعيد الموقع للحالة السابقة.
  • الأمان أولاً وأخيراً: استخدم دائماً مدير بيانات الاعتماد (Credentials Manager) في n8n. لا تكتب كلمات المرور أو المفاتيح الخاصة مباشرة في حقول الأوامر.
  • يا زلمة، بلّش بسيط: لا تحاول بناء أضخم وأعقد مسار عمل من اليوم الأول. ابدأ بالخطوات الأساسية التي عرضناها اليوم. مع الوقت، يمكنك إضافة تحسينات مثل مسح الكاش في Cloudflare، إعادة تشغيل خدمات معينة، أو إجراء اختبارات أعمق للموقع.

الخلاصة: وداعاً للقلق، ومرحباً بالقهوة ☕

التحول من النشر اليدوي المرعب إلى مسار عمل مؤتمت كان أحد أفضل القرارات التي اتخذتها لتطوير سير عملي. لم أعد أخشى الضغط على زر “نشر”. الآن، كل ما علي فعله هو إنهاء عملي، إنشاء وسم إصدار جديد باستخدام `git tag`، ودفع الوسم للمستودع. بعدها، أتلقى إشعار النجاح على هاتفي بينما أستمتع بفنجان من القهوة، واثقاً من أن روبوتي الصغير المخلص قد قام بكل العمل الشاق بدقة وأمان.

الأتمتة ليست رفاهية، بل هي ضرورة للمطور الحديث. أدوات مثل n8n تجعلها في متناول الجميع. جربوها، وادعولي.

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

أتمتة العمليات

قهوتك الصباحية مع ملخص الإنجازات: كيف تبني داشبورد يومي يصلك على الموبايل باستخدام n8n والذكاء الاصطناعي

كف عن تشتيت نفسك كل صباح بين Jira وGitHub والإيميلات. تعلم معي، أبو عمر، كيف تبني ورك فلو أتمتة يرسل لك ملخصاً ذكياً ومنسقاً بإنجازات...

12 فبراير، 2026 قراءة المزيد
البودكاست