[{"data":1,"prerenderedAt":218},["ShallowReactive",2],{"seo-verification":3,"blog-cron-مقابل-systemd-timers-أتمتة-vps-linux-ma-ar":6,"promo-bar-likely":217},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-cron-مقابل-systemd-timers-أتمتة-vps-linux-ma-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":161,"ctaBody":162,"ctaButton":163,"ctaUrl":164,"relatedPosts":165},230,"cron-مقابل-systemd-timers-أتمتة-vps-linux",{"fr":12,"en":13,"ar":10,"es":14},"cron-systemd-timers-automatisation-vps","cron-vs-systemd-timers-automate-your-linux-vps","cron-vs-systemd-timers-automatizar-vps-linux","‏cron مقابل systemd timers: أتمتة VPS Linux","مقارنة عملية بين cron وsystemd timers: الصياغة والسجلات والهجرة واستكشاف الأخطاء للمهام المتكررة على ‏VPS Linux.",12,1,false,"2026-08-06T00:00:00+00:00","2026-09-20T21:13:53+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fcron-systemd-timers-automatisation-vps-poster.svg","على أي ‎VPS‎ يعمل بـ‎Linux‎، الأتمتة ضرورة لا رفاهية: النسخ الاحتياطية الليلية، وتجديد شهادات ‎TLS‎، وتنظيف السجلات، وفحوصات الصحة — هذه المهام إما تعمل وحدها أو لا تعمل أبداً. ‎cron‎ يهيمن منذ عقود، لكن ‎systemd timers‎ تقدم تكاملاً أعمق مع مدير الخدمات.",[34,38,49,52,55,99,102,105,133,151,155,158],{"type":35,"title":36,"body":37},"h2","لماذا أتمتة المهام على VPS؟","‎VPS‎ هو خادم يعمل باستمرار، غالباً دون إشراف بشري مباشر. لهذا السبب بالذات تُعدّ أتمتة المهام المتكررة أمراً جوهرياً: لن يكون هناك أحد في الساعة الثالثة صباحاً لتشغيل النسخ الاحتياطي أو تجديد شهادة ‎Let's Encrypt‎. مهمة منسية قد تعني فقدان بيانات، أو شهادة منتهية الصلاحية، أو قرصاً ممتلئاً.\n\nفي الممارسة العملية، خمس فئات من المهام تظهر على كل ‎VPS Linux‎ جاد: **تدوير سجلات ‎Nginx‎** لمنع امتلاء ‎\u002Fvar\u002Flog\u002Fnginx\u002F‎ بالجيجابايت؛ **تنظيف صور ‎Docker‎** الأيتام (`docker image prune -af`) لاسترداد مساحة القرص؛ **النسخ الاحتياطي لـ‎PostgreSQL‎** إلى تخزين بعيد؛ **التحقق من شهادة ‎SSL‎** قبل انتهائها لتشغيل certbot؛ وأخيراً **نصوص الجمع الخفيف** المجدولة التي تحتاج إلى التشغيل في وقت محدد. الأداتان الرئيسيتان المتاحتان على ‎Linux‎ — ‎cron‎ و‎systemd timers‎ — تتيحان جدولة هذه العمليات بصورة موثوقة.",{"type":39,"title":40,"items":41},"ul","حالات الاستخدام الشائعة على VPS",[42,43,44,45,46,47,48],"**النسخ الاحتياطية** — تفريغ ‎MySQL‎ أو ‎PostgreSQL‎ إلى تخزين بعيد (`pg_dump -Fc mydb | gzip > \u002Fbackup\u002Fmydb_$(date +%F).sql.gz`)، أرشفة الملفات إلى تخزين ‎S3‎","**تجديد شهادات ‎TLS‎** — `certbot renew` أو `acme‎.sh --cron` مجدولان مرتين يومياً مع إعادة تحميل ‎Nginx‎ تلقائياً","**تدوير السجلات وتنظيفها** — حذف الملفات الأقدم من 30 يوماً (`find \u002Fvar\u002Flog -mtime +30 -delete`)، ضغط أسبوعي، تفريغ سجلات التطبيقات","**تنظيف ‎Docker‎** — `docker image prune -af`، حذف المجلدات الأيتام، تدوير سجلات الحاويات لتحرير ‎\u002Fvar\u002Flib\u002Fdocker‎","**فحوصات الصحة** — التحقق من أن الخدمة تستمع (`curl -sf http:\u002F\u002Flocalhost:3000\u002Fhealth`)، إعادة التشغيل التلقائي عند الحاجة","**مزامنة البيانات** — `rsync` إلى عقدة ثانية، تحديث ذاكرة التخزين المؤقت","**المهام التطبيقية المجدولة** — إرسال رسائل تذكير، حساب تقارير دورية، فهرسة المحتوى، نصوص الجمع الخفيف",{"type":35,"title":50,"body":51},"‏cron: مراجعة سريعة","‎cron‎ موجود في كل توزيعات ‎Linux‎ تقريباً. لجدولة مهمة، يمكنك تحرير ‎crontab‎ المستخدم الحالي بالأمر `crontab -e`. تعتمد الصياغة على **خمسة حقول** مفصولة بمسافات تليها الأمر:\n\n```\n# الدقيقة (0-59)، الساعة (0-23)، يوم الشهر (1-31)، الشهر (1-12)، يوم الأسبوع (0-7)\n  0  3  *  *  *  \u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh\n```\n\nالاختصارات ‎@daily‎ و‎@weekly‎ و‎@reboot‎ تبسّط الحالات الشائعة. الملفات في ‎\u002Fetc\u002Fcron.d\u002F‎ تخص النظام وتحدد مستخدم التنفيذ مباشرة. لمراجعة التنفيذات السابقة: ‎\u002Fvar\u002Flog\u002Fsyslog‎ مع `grep CRON \u002Fvar\u002Flog\u002Fsyslog`، أو `journalctl -t CRON`. نقطة مهمة: ‎PATH‎ الافتراضي في ‎cron‎ **محدود جداً** (`\u002Fusr\u002Fbin:\u002Fbin`)، مما يستلزم استخدام المسارات المطلقة في النصوص، أو إعادة تعريف ‎PATH=‎ في بداية ‎crontab‎. لا يحتفظ ‎cron‎ بأي سجل أصلي للتنفيذات السابقة ولا يتعامل مع المهام الفائتة إذا كانت الآلة مغلقة.",{"type":35,"title":53,"body":54},"‏systemd timers: مقدمة","‎systemd timer‎ هو زوج من ملفَي وحدة: ملف ‎.service‎ يصف ما يجب تنفيذه، وملف ‎.timer‎ يصف موعد تشغيله. يُفعَّل الـ‎timer‎ بالأمر `systemctl enable --now myservice‎.timer` ويُدار بواسطة مدير الخدمات.\n\nتوجيه `OnCalendar=` يقبل صياغة غنية:\n- `daily` — كل يوم عند منتصف الليل\n- `Mon *-*-* 03:00:00` — كل اثنين الساعة الثالثة\n- `*-*-* 02:30:00` — كل يوم الساعة 2:30\n- `*:0\u002F15` — كل 15 دقيقة\n\nتوجيه `AccuracySec=` (الافتراضي: دقيقة واحدة) يتيح لـ‎systemd‎ تجميع الـ‎timers‎ المتقاربة لتوفير استيقاظ المعالج. توجيه `Persistent=true` في كتلة `[Timer]` هو الميزة الجوهرية: إذا كانت الآلة مغلقة عند الموعد المحدد، يُعيد الـ‎timer‎ **التنفيذ الفائت** عند الإقلاع التالي. تمر جميع المخرجات عبر ‎journald‎. الأمر `systemctl list-timers` يُظهر قائمة بجميع الـ‎timers‎ النشطة مع موعدها التالي وآخر تفعيل.",{"type":56,"title":57,"headers":58,"rows":62},"comparison","‏cron مقابل systemd timers: جدول مقارنة",[59,60,61],"المعيار","cron","systemd timer",[63,67,71,75,79,83,87,91,95],[64,65,66],"صياغة الجدولة","خمسة حقول `* * * * *`","`OnCalendar=` مقروء (`daily`، `Mon 03:00`)",[68,69,70],"السجلات","بريد إلكتروني أو إعادة توجيه يدوية، ‎\u002Fvar\u002Flog\u002Fsyslog‎","‎journald‎ أصلي، `journalctl -u`",[72,73,74],"المهام الفائتة (الآلة مغلقة)","مفقودة (إلا مع `anacron`)","`Persistent=true` يعيد التشغيل بعد إعادة التشغيل",[76,77,78],"التبعيات بين الخدمات","لا يوجد","`After=`، `Requires=`، `Wants=`",[80,81,82],"العزل وحدود الموارد","يرث بيئة الـ‎shell‎، ‎PATH‎ محدود","‎Cgroups‎، `MemoryMax=`، `CPUQuota=`",[84,85,86],"إشعار الفشل","لا يوجد بشكل أصلي","`OnFailure=notify.service` يُشغّل تنبيهاً",[88,89,90],"التشغيل كمستخدم محدد","حقل المستخدم في ‎\u002Fetc\u002Fcron.d\u002F‎","`User=` و`Group=` في ملف ‎.service‎",[92,93,94],"تشخيص الأخطاء","صعب بدون سجلات","`systemctl status`، `journalctl -xe`",[96,97,98],"التوفر","جميع أنظمة ‎Unix‎ (حاويات، ‎BSD‎، ‎Alpine‎)","الأنظمة مع ‎systemd‎ (‎Debian‎، ‎Ubuntu‎، ‎RHEL‎…)",{"type":35,"title":100,"body":101},"متى تبقى على cron؟","يبقى ‎cron‎ الخيار الصحيح في عدة حالات عملية. على **الأنظمة القديمة أو المُخففة بدون ‎systemd‎** — بعض الحاويات، و‎BSD‎، وصور ‎Alpine‎ — يكون ‎cron‎ في الغالب الأداة الوحيدة المتاحة. في **البيئات متعددة المستخدمين** حيث يدير كل مستخدم مهامه الخاصة عبر `crontab -e`، يكون ‎cron‎ أبسط للتفويض دون منح صلاحيات ‎root‎.\n\nلـ**النصوص البسيطة من سطر واحد** — تجديد certbot أسبوعياً، ‎rsync‎ ليلياً بدون تبعيات — تبقى ‎crontab‎ مقروءة وقابلة للصيانة دون إنشاء ملفين. ‎cron‎ هو أيضاً الخيار الصحيح لـ**تأهيل فريق غير متخصص في ‎Linux‎**: صياغة الخمسة حقول، الموثقة في كل مكان، أكثر سهولة من وحدة ‎systemd‎. المعيار الحاسم هو الحاجة إلى سجلات منظمة أو تبعيات بين الخدمات أو قيود على الموارد — إن لم تكن بحاجة إليها، فـ‎cron‎ يؤدي المهمة.",{"type":35,"title":103,"body":104},"متى تنتقل إلى systemd timers؟","تصبح ‎systemd timers‎ الخيار الواضح حين تتجاوز المهمة نطاق أمر بسيط ومعزول. تحتاج ‎journald‎ لتتبع كل تنفيذ ومخرجاته ورمز إرجاعه دون تمديد يدوي؟ ‎systemd timers‎. يجب أن يعمل سكريبت النسخ الاحتياطي فقط بعد أن يصبح ‎PostgreSQL‎ جاهزاً (`After=postgresql‎.service`)؟ ‎systemd timers‎.\n\n**التبعيات بين الخدمات** هي الحجة الأقوى: نسخ احتياطي يُشغَّل وقاعدة البيانات غير جاهزة بعد إعادة التشغيل ينتج ملفاً فارغاً دون أي خطأ مرئي في ‎cron‎. ‎systemd‎ يضمن الترتيب. **التسجيل المدمج** عبر ‎journald‎ يزيل كل ضجيج إعادة التوجيه اليدوية. **معالجة الأخطاء** مع `OnFailure=` تتيح تشغيل إشعار (بريد إلكتروني، ويب هوك) دون تلويث النص البرمجي نفسه. وإذا أُعيد تشغيل الخادم الساعة 2:58 بينما كان من المقرر تشغيل النسخ الاحتياطية الساعة 3، فإن `Persistent=true` يضمن تشغيلها عند الإقلاع التالي.",{"type":106,"title":107,"steps":108},"steps","إنشاء systemd timer من الصفر (مثال: نسخ احتياطي يومي)",[109,112,115,118,121,124,127,130],{"title":110,"body":111},"إنشاء ملف الخدمة","افتح ‎\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup‎.service‎ وأدخل:\n\n```ini\n[Unit]\nDescription=Daily PostgreSQL backup\nAfter=postgresql.service\n\n[Service]\nType=oneshot\nUser=postgres\nExecStart=\u002Fusr\u002Flocal\u002Fbin\u002Fbackup.sh\n```\n\nالنوع `oneshot` يشير إلى أن الخدمة تنتهي بعد تنفيذ النص البرمجي — النوع المعتاد للمهام المجدولة.",{"title":113,"body":114},"إنشاء ملف الـ timer","أنشئ ‎\u002Fetc\u002Fsystemd\u002Fsystem\u002Fbackup‎.timer‎ بـ:\n\n```ini\n[Unit]\nDescription=Daily trigger for backup\n\n[Timer]\nOnCalendar=*-*-* 03:00:00\nPersistent=true\n\n[Install]\nWantedBy=timers.target\n```\n\n`Persistent=true` يضمن أنه إذا كانت الآلة مغلقة الساعة 3، يُشغَّل النسخ الاحتياطي عند الإقلاع التالي.",{"title":116,"body":117},"إعادة تحميل systemd وتفعيل الـ timer","نفِّذ `systemctl daemon-reload` حتى يأخذ ‎systemd‎ الملفات الجديدة بالاعتبار، ثم `systemctl enable --now backup‎.timer` لتفعيل الـ‎timer‎ وتشغيله فوراً.",{"title":119,"body":120},"التحقق مع systemctl status","تحقق من حالة الـ‎timer‎ بـ `systemctl status backup‎.timer` — يجب أن تُظهر الإخراج ‎active (waiting)‎ مع تاريخ الإطلاق التالي. راجع أيضاً حالة الخدمة بعد أول تنفيذ بـ `systemctl status backup‎.service`.",{"title":122,"body":123},"إدراج جميع الـ timers النشطة","الأمر `systemctl list-timers --all` يعرض جدولاً بجميع ‎timers‎ النظام مع ثلاثة أعمدة رئيسية: ‎NEXT‎ (التنفيذ التالي)، ‎LEFT‎ (الوقت المتبقي) و‎LAST‎ (آخر تنفيذ). هذه لوحة التحكم للتحقق من أن ‎timers‎ تُطلَق كما هو متوقع.",{"title":125,"body":126},"قراءة السجلات","اطّلع على كل مخرجات الخدمة بـ `journalctl -u backup‎.service` للتاريخ الكامل، أو `journalctl -u backup‎.service -n 50 --since today` لآخر 50 سطراً اليوم.",{"title":128,"body":129},"إضافة إشعار خطأ (اختياري)","للتنبيه عند الفشل، أضف في كتلة `[Unit]` من ملف ‎.service‎:\n\n```ini\nOnFailure=notify-failure@%n.service\n```\n\nهذه الخدمة يمكنها إرسال بريد إلكتروني أو ويب هوك ‎Slack‎ أو تنبيه ‎ntfy‎ حسب بنيتك التحتية.",{"title":131,"body":132},"اختبار الخدمة يدوياً","قبل انتظار الإطلاق المجدول، اختبر التنفيذ الفوري بـ `systemctl start backup.service` (بدون ‎.timer‎). راجع النتيجة فوراً بـ `journalctl -u backup.service -n 20`. إذا نجح النص البرمجي، فالإعداد مُتحقَّق منه.",{"type":106,"title":134,"steps":135},"هجرة مهمة cron موجودة إلى systemd",[136,139,142,145,148],{"title":137,"body":138},"تحديد مهمة cron المراد هجرتها","أدرج ‎crontabs‎ بـ `crontab -l` (المستخدم الحالي) و`cat \u002Fetc\u002Fcron.d\u002F*` (النظام). لاحظ الأمر الدقيق، ومستخدم التنفيذ، والجدولة ذات الخمسة حقول.",{"title":140,"body":141},"ترجمة الجدولة إلى OnCalendar","صيغة `OnCalendar=` في ‎systemd‎ تُكتب `DayOfWeek Year-Month-Day Hour:Minute:Second`. يصبح `30 2 * * 1` هو `Mon *-*-* 02:30:00`.\n\nلاختبار الترجمة، استخدم `systemd-analyze calendar 'Mon *-*-* 02:30:00'` الذي يعرض المرات العشر التالية المحسوبة.",{"title":143,"body":144},"إنشاء ملفَي ‎.service‎ و‎.timer‎","أنشئ ‎\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew‎.service‎ بـ `Type=oneshot`، `ExecStart=\u002Fusr\u002Fbin\u002Fcertbot renew --quiet`، و`User=root`. ثم أنشئ ‎\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcertbot-renew‎.timer‎ بـ `OnCalendar=Mon *-*-* 02:30:00` و`Persistent=true`. نفِّذ `systemctl daemon-reload && systemctl enable --now certbot-renew‎.timer`.",{"title":146,"body":147},"اختبار الخدمة قبل تعطيل cron","اختبر فوراً بـ `systemctl start certbot-renew‎.service` وراجع النتيجة عبر `journalctl -u certbot-renew‎.service -n 20`. تحقق من ظهور الـ‎timer‎ في `systemctl list-timers`. **لا تعطّل سطر cron إلا بعد التحقق.**",{"title":149,"body":150},"تعطيل سطر cron","بمجرد التحقق من الـ‎timer‎، علِّق أو احذف السطر في ‎crontab‎ الأصلي. اترك الاثنين يعملان بالتوازي بضعة أيام إذا كانت المهمة حرجة — ‎cron‎ و‎systemd timers‎ لا يتعارضان.",{"type":152,"title":153,"body":154},"tip","التحقق من صحة تعبيرات OnCalendar وتصحيحها","قبل تفعيل ‎timer‎ في الإنتاج، تحقق دائماً من تعبير `OnCalendar=` بـ `systemd-analyze calendar`:\n\n```bash\nsystemd-analyze calendar \"daily\"\nsystemd-analyze calendar \"Mon *-*-* 02:30:00\"\nsystemd-analyze calendar \"*:0\u002F15\"\n```\n\nكل أمر يعرض المرة التالية والعشر التي تليها — مما يجعل أي تعبير سيئ التكوين أو إزاحة زمنية غير متوقعة واضحة فوراً. للاطلاع على نظرة شاملة لجميع ‎timers‎ النشطة، `systemctl list-timers --all` هو لوحة التشغيل اليومية.",{"type":35,"title":156,"body":157},"استكشاف أخطاء systemd timers الشائعة","تظهر خمس مشاكل بشكل متكرر عند إعداد الـ‎timers‎.\n\n**1. \"Unit not found\" عند `systemctl enable`** — الملف ‎.timer‎ أو ‎.service‎ غير موجود في ‎\u002Fetc\u002Fsystemd\u002Fsystem\u002F‎ أو اسمه غير صحيح. تحقق بـ `ls \u002Fetc\u002Fsystemd\u002Fsystem\u002F*.timer`. `daemon-reload` إلزامي قبل أي `enable` أو `start` على ملف جديد.\n\n**2. الـ timer نشط لكنه لا يُطلَق** — هل يُظهر `systemctl list-timers` تاريخاً منطقياً في عمود `NEXT`؟ إذا كان `NEXT` فارغاً أو في الماضي، غالباً `Persistent=true` منسي مع آلة لم تُعَد تشغيلها منذ إنشاء الـ‎timer‎. تحقق من `systemctl status backup‎.timer`: ‎active (waiting)‎ هو الحالة الطبيعية.\n\n**3. ExecStart غير موجود أو رُفض الإذن** — استخدم دائماً **المسار المطلق** في `ExecStart=` (‎\u002Fusr\u002Fbin\u002Fcertbot‎ وليس ‎certbot‎). تحقق من أن النص البرمجي قابل للتنفيذ (`chmod +x \u002Fusr\u002Flocal\u002Fbin\u002Fbackup‎.sh`) وأن المستخدم المُعلَن في `User=` يملك الوصول إليه.\n\n**4. صلاحيات على النص البرمجي** — إذا كان `User=postgres` لكن النص البرمجي مملوك لـ‎root‎ بدون صلاحية تنفيذ لـ‎postgres‎، ستفشل الخدمة بالرمز 203\u002FEXEC. راجع `journalctl -u backup‎.service -n 20` لرؤية الرسالة الدقيقة.\n\n**5. تعارض بين cron وsystemd على نفس المهمة** — إذا كنت تهاجر تدريجياً، تأكد من عدم تفعيل الاثنين في نفس الوقت لمهمة تدميرية (تنظيف سجلات، تدوير ملفات). كلاهما سيُنفَّذ باستقلالية ويضاعف العمليات. التحقق بسيط: `crontab -l | grep backup` و`systemctl is-active backup.timer`.",{"type":35,"title":159,"body":160},"خلاصة","‎cron‎ و‎systemd timers‎ يتعايشان بلا مشاكل على نفس الخادم — لا يلزمك ترحيل كل شيء دفعة واحدة. احتفظ بـ‎cron‎ لمهامك البسيطة، واعتمد ‎systemd timers‎ للأتمتة الجديدة التي تستفيد من سجلات ‎journald‎ وتبعيات الخدمات أو عزل ‎cgroup‎.","VPS Linux جاهز لأتمتتك","‪VPS‬ السحابية لدينا التي تعمل بـ‪Ubuntu‬ و‪Debian‬ تتضمن ‪systemd‬ و‪journald‬ والمكدس الحديث الكامل. انشر ‪timers‬ وسكريبتاتك ونسخك الاحتياطية على بنية تحتية موثوقة.","ابدأ VPS Linux","\u002Fvps-cloud",[166,184,199],{"id":167,"slug":168,"slugs":169,"title":173,"excerpt":174,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":175,"updatedAt":176,"category":177,"categories":178,"featuredImage":29,"bgImage":30,"posterImage":180,"relatedSolution":181},31,"تثبيت-apache-airflow-على-خادم-vps-أتمتة-ذاتية-الاستضافة",{"fr":170,"en":171,"ar":168,"es":172},"installer-apache-airflow-vps","installing-apache-airflow-on-a-vps-self-hosted-automation","instalar-apache-airflow-en-un-vps","تثبيت Apache Airflow على VPS: Docker Compose وPostgreSQL","تثبيت Apache Airflow على VPS باستخدام Docker Compose: قاعدة بيانات PostgreSQL للبيانات الوصفية، CeleryExecutor متعدد العمال، الاتصالات المشفرة واستكشاف الأخطاء — دليل شامل 2026.","2026-05-20T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[179],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-apache-airflow-vps-poster.svg",{"categorySlug":182,"appSlug":183},"الأتمتة-وسير-العمل","airflow",{"id":185,"slug":186,"slugs":187,"title":191,"excerpt":192,"readTime":17,"views":23,"isPinned":19,"noindex":19,"publishedAt":193,"updatedAt":194,"category":195,"categories":196,"featuredImage":29,"bgImage":30,"posterImage":198,"relatedSolution":29},212,"woodpecker-ci-وforgejo-خط-أنابيب-cicd-على-خادم-vps",{"fr":188,"en":189,"ar":186,"es":190},"woodpecker-ci-pipeline-vps-forgejo","woodpecker-ci-and-forgejo-cicd-pipeline-on-a-vps","woodpecker-ci-forgejo-pipeline-cicd-vps","Woodpecker CI وForgejo: خط أنابيب CI\u002FCD على خادم VPS","نشر Woodpecker CI v3 مع Forgejo على خادم VPS: إعداد Docker Compose، تكوين YAML، الأسرار، أجهزة التشغيل متعددة المعماريات واستكشاف أخطاء OAuth.","2026-08-02T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[197],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fwoodpecker-ci-pipeline-vps-forgejo-poster.svg",{"id":200,"slug":201,"slugs":202,"title":206,"excerpt":207,"readTime":208,"views":209,"isPinned":19,"noindex":19,"publishedAt":210,"updatedAt":176,"category":211,"categories":212,"featuredImage":29,"bgImage":30,"posterImage":214,"relatedSolution":215},29,"تثبيت-kestra-على-خادم-vps-أتمتة-ذاتية-الاستضافة",{"fr":203,"en":204,"ar":201,"es":205},"installer-kestra-vps","installing-kestra-on-a-vps-self-hosted-automation","instalar-kestra-en-un-vps","تثبيت Kestra على خادم VPS: أتمتة ذاتية الاستضافة","ثبّت Kestra على خادم VPS الخاص بك: تنسيق سير عمل تصريحي بصيغة YAML لأنابيب البيانات وETL، بأتمتة ذاتية الاستضافة مع Docker.",3,8,"2026-05-22T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[213],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Finstaller-kestra-vps-poster.svg",{"categorySlug":182,"appSlug":216},"kestra",true,1794270330027]