[{"data":1,"prerenderedAt":175},["ShallowReactive",2],{"seo-verification":3,"blog-docker-v29-migration-vps-breaking-changes-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"title":9,"excerpt":10,"readTime":11,"views":12,"isPinned":13,"publishedAt":14,"category":15,"categories":20,"featuredImage":22,"bgImage":23,"posterImage":24,"relatedSolution":22,"intro":25,"sections":26,"ctaTitle":130,"ctaBody":131,"ctaButton":132,"ctaUrl":133,"relatedPosts":134},247,"docker-v29-migration-vps-breaking-changes","Docker v29 على VPS: الهجرة دون كسر المكدسات","Docker Engine v29 يُغيّر الحد الأدنى لـ API وخلفية الشبكة ومخزن الصور. دليل الهجرة للوكالات التي تدير أسطول VPS لعملائها.",11,0,false,"2026-08-12T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},3,"النشر","deploiement","bg-success\u002F10 text-success",[21],{"id":16,"name":17,"slug":18,"color":19,"icon":18},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdocker-v29-migration-vps-breaking-changes-poster.svg","أصدرت Docker نسخة Engine v29 في مارس 2026، وقد غيّرت ثلاثة أسس في آنٍ واحد: الحد الأدنى لإصدار API، وخلفية الشبكة ‏(nftables)‏، ومخزن صور containerd. يتعطّل الخادم الافتراضي غير المُعدّ بصمت عند استقبال هذا التحديث — إذ يتوقف `docker-compose` v1 المستقل عن العمل، ولا يعود Dockge يبدأ، وتختفي قواعد iptables التي كانت مكدّساتك تعتمد عليها. يُمكّنك هذا الدليل من اكتشاف ما تعطّل، والهجرة بشكل نظيف، ومنع `apt upgrade` التالي من أن يتحوّل إلى حادثة في الساعة الثانية صباحاً.",[27,31,42,45,55,64,73,82,102,106,109,127],{"type":28,"title":29,"body":30},"h2","لماذا يكسر Docker v29 المكدسات الحالية — ولماذا الآن","تقع وكالة تُدير أسطول VPS لعملائها في موقف صعب: التحديث الخارجي (Docker أو Ubuntu أو Debian) يصل من الخارج بصرف النظر عمّن يُدير الخادم. حين يتلقّى VPS العميل `apt upgrade` دون رقابة، تصل ثلاثة تغييرات كاسرة في آنٍ واحد.\n\n**الكسر الأول — الحد الأدنى لإصدار API.** يرفع Docker Engine v29 الحد الأدنى لإصدار API إلى `1.44`. تفشل العملاء التي تعمل بالنسخة المستقلة القديمة `docker-compose` v1 ‏(الملف `\u002Fusr\u002Flocal\u002Fbin\u002Fdocker-compose`)‏ فوراً: تعليماتها البرمجية مُترجَمة لإصدارات API أقدم، ويرفض daemon الاتصال برسالة عدم توافق.\n\n**الكسر الثاني — خلفية شبكة nftables.** يُفعّل Docker v29 nftables افتراضياً عوضاً عن iptables لإدارة قواعد جدار حماية شبكات Docker. لا ترى النصوص البرمجية الخارجية التي تفحص سلاسل iptables مباشرةً ‏(نصوص المراقبة، وجدران الحماية المُخصّصة، وبعض قواعد UFW)‏ قواعد Docker بعد الآن — ليس لأنها اختفت، بل لأنها تعيش الآن في nftables.\n\n**الكسر الثالث — مخزن صور containerd.** ينتقل خلفية تخزين الصور إلى مخزن containerd. وهو قيد التفعيل الاختياري منذ v29، وسيصبح الافتراضي في v30.\n\nالاعتراض الكلاسيكي — «عملاؤنا يُديرون VPS بأنفسهم» — لا يوفر حمايةً. يأتي الكسر من الخارج، والوكالة هي من يتصل بها العميل حين يتوقف موقعه.",{"type":32,"title":33,"items":34},"ul","ما يُمكّنك هذا الدليل من فعله",[35,36,37,38,39,40,41],"**اكتشاف التوتر في إصدار API** بين عميل `docker` الخاص بك و‏daemon‏ VPS، قبل أن تُنتج الأوامر التالية خطأً غامضاً.","**تحديد في 30 ثانية** ما إذا كان VPS يعمل بـ `docker-compose` v1 المستقل — الملف الثنائي المُهمَل منذ Docker Desktop 3.6 والمُزال من الحزم الرسمية.","**الهجرة إلى إضافة `docker compose` v2** بأمرَين محدَّدَين، ثم التحقق من عمل ملفات `docker-compose.yml` الحالية دون تغيير في البنية.","**فهم تأثير nftables** على مكدّساتك: ما يستمر في العمل ‏(شبكات Docker)‏، وما قد يتعطّل ‏(نصوصك التي تقرأ iptables)‏، وأمر التشخيص الحاسم.","**تفعيل أو تأجيل مخزن containerd** وفق جدول هجرتك، مع مفتاح الإعداد الدقيق وأمر التحقق.","**تقييم توافق** Dockge وPortainer وCasaOS App Store مع v29، لتجنّب اكتشاف عدم التوافق أثناء حادثة لدى العميل.","**تجهيز أسطول VPS العملاء** كي يكون `apt upgrade` التالي حدثاً مُخطَّطاً، لا طارئاً ليليّاً.",{"type":28,"title":43,"body":44},"المتطلبات قبل البدء","يُطبَّق هذا الدليل على أي VPS يعمل بـ Ubuntu 22.04\u002F24.04 أو Debian 11\u002F12 مع تثبيت Docker Engine من المستودعات الرسمية لـ Docker Inc. ‏(وليس حزمة `docker.io` التابعة للتوزيعة)‏. تحتاج إلى وصول SSH كمستخدم root أو sudo. لا يتطلب تشخيص المشكلات أي انقطاع في الخدمة؛ أما نقل إضافة compose فيستغرق ثوانٍ خلالها تكون أوامر `docker compose` غير متاحة. التقط لقطة VPS قبل تعديل `\u002Fetc\u002Fdocker\u002Fdaemon.json` إذا كنت ستُفعّل مخزن containerd.",{"type":46,"title":47,"steps":48},"steps","الخطوة 1 — تشخيص إصدار API",[49,52],{"title":50,"body":51},"التحقق من إصداري API للعميل و‏daemon","شغّل الأمرَين التاليَين على كل VPS تريد فحصه:\n\n```bash\ndocker version --format '{{.Client.APIVersion}}'\ndocker version --format '{{.Server.APIVersion}}'\n```\n\nإذا كان إصدار العميل أقل من `1.44` وكان daemon يعمل بـ v29، ستحصل على خطأ عند الأوامر التالية. العتبة `1.44` هي الحد الأدنى الذي يقبله Docker Engine v29: يفشل عميل مُترجَم لـ `1.43` أو أقدم بالخطأ `Error response from daemon: client version 1.43 is too old. Minimum supported API version is 1.44, please upgrade your client`.\n\nإذا أظهر السطران `1.44` أو أعلى، فعميلك متوافق. انتقل إلى الخطوة التالية.",{"title":53,"body":54},"الكشف عن وجود docker-compose v1 المستقل","أمر `docker-compose` بالشَرطة وأمر `docker compose` بدون شَرطة ليسا الشيء ذاته. v1 ملف ثنائي Python مستقل، أما v2 فإضافة Go مُدمَجة في واجهة Docker.\n\n```bash\nwhich docker-compose && docker-compose --version\n```\n\nإذا أعاد الأمر مساراً في `\u002Fusr\u002Flocal\u002Fbin\u002F` أو `\u002Fusr\u002Fbin\u002F` مع إصدار `1.x.x`، لديك الملف الثنائي المستقل المُهمَل.\n\n```bash\ndocker compose version\n```\n\nإذا أعاد هذا الأمر `Docker Compose version v2.x.x`، فإضافة v2 موجودة بالفعل.",{"type":46,"title":56,"steps":57},"الخطوة 2 — الهجرة من docker-compose v1 إلى إضافة v2",[58,61],{"title":59,"body":60},"إزالة الملف الثنائي v1 وتثبيت الإضافة","```bash\napt remove docker-compose\napt install docker-compose-plugin\n```\n\nعلى VPS يعمل بـ Debian أو Ubuntu ويستخدم المستودعات الرسمية لـ Docker Inc. ‏(`download.docker.com`)‏، تتوفر حزمة `docker-compose-plugin` بدون إعداد إضافي.\n\nللتحقق بعد الهجرة:\n\n```bash\ndocker compose version\n# Docker Compose version v2.36.0\n```",{"title":62,"body":63},"التحقق من توافق بنية ملفات Compose الحالية","الغالبية العظمى من ملفات `docker-compose.yml` المكتوبة لـ v1 تعمل دون تعديل مع إضافة v2. التحقق من ملفاتك:\n\n```bash\ndocker compose config\n```\n\nيُحلّ هذا الأمر متغيرات البيئة ويُتحقق من البنية ويعرض الإعداد المُحلَّل. إخراج بلا أخطاء يعني أن ملفك متوافق.\n\nإذا كانت فريقك يستخدم نصوص shell تحتوي `docker-compose` بالشَرطة، أضف اختصاراً في `\u002Fetc\u002Fbash.bashrc` على VPS:\n\n```bash\nalias docker-compose='docker compose'\n```",{"type":46,"title":65,"steps":66},"الخطوة 3 — فهم تغيير خلفية الشبكة nftables والتكيّف معه",[67,70],{"title":68,"body":69},"التحقق من أن شبكات Docker لا تزال تعمل","البشرى السارة: `docker network` يعمل بشكل صحيح مع nftables. يستمر مرور حركة البيانات بين الحاويات، وترجمة عناوين الشبكة ‏(NAT)‏، وكشف المنافذ في العمل. ما يتغيّر هو الأداة الأساسية التي تكتب القواعد.\n\n```bash\ndocker network ls\n```\n\nشبكات bridge الحالية لا تزال مُدرَجة. للتحقق من أن حاوية تستقبل حركة البيانات على المنفذ المتوقع:\n\n```bash\ncurl -s http:\u002F\u002Flocalhost:8080\u002Fhealth\n```",{"title":71,"body":72},"تشخيص التأثير على نصوص iptables البرمجية","تظهر المشكلة حين يفحص نص برمجي خارجي ‏(مراقبة، أو Ansible، أو قواعد UFW)‏ `iptables` للتحقق من وجود قواعد Docker:\n\n```bash\niptables -L DOCKER 2>&1\n```\n\nمع خلفية nftables، هذه السلسلة فارغة أو غائبة. يُعيد النص خطأً بينما Docker يعمل بشكل مثالي. هذا ليس فشلاً في Docker — أداة التدقيق لم تعد تنظر في المكان الصحيح.\n\nلفحص القواعد الفعلية:\n\n```bash\nnft list ruleset | grep -A 20 'docker'\n```",{"type":46,"title":74,"steps":75},"الخطوة 4 — تقييم مخزن صور containerd وتفعيله",[76,79],{"title":77,"body":78},"التحقق من برنامج تشغيل التخزين الحالي","```bash\ndocker info | grep 'Storage Driver'\n```\n\nعلى VPS مُحدَّث إلى v29 بدون تغييرات في الإعداد، تحصل عادةً على `Storage Driver: overlay2`. مخزن containerd اختياري في v29 — لا يُفعَّل تلقائياً. سيصبح الافتراضي في v30.",{"title":80,"body":81},"تفعيل مخزن containerd (اختياري، يُنصح به قبل v30)","لتفعيل مخزن containerd في v29 والاستعداد للهجرة قبل فرضها في v30، أضف المفتاح التالي إلى `\u002Fetc\u002Fdocker\u002Fdaemon.json`:\n\n```bash\n{\n  \"features\": {\n    \"containerd-snapshotter\": true\n  }\n}\n```\n\nأعد تشغيل daemon:\n\n```bash\nsystemctl restart docker\n```\n\nللتحقق:\n\n```bash\ndocker info | grep 'Storage Driver'\n# Storage Driver: overlayfs\n```",{"type":83,"title":84,"headers":85,"rows":89},"comparison","توافق الأدوات الخارجية مع Docker Engine v29",[86,87,88],"الأداة","حالة التوافق مع v29","الإجراء الموصى به",[90,94,98],[91,92,93],"**Dockge** (حتى ‏1.4.1‏ مشمولاً)","غير متوافق: يستدعي daemon الخاص بـ Dockge مسارات API مُزالة في v29. لا يبدأ اللوحة بعد تحديث Docker.","تحديث Dockge إلى الإصدار ‏1.4.2‏ أو أعلى. التحقق من ملاحظات الإصدار قبل `apt upgrade` على أي VPS يستضيفه.",[95,96,97],"**Portainer** (Community Edition \u003C ‏2.21‏)","متوافق جزئياً: الواجهة تعمل، لكن بيئات Docker المستقلة قد تُظهر أخطاءً في عروض الشبكة. الإصدار ‏2.21‏ يُصلح استدعاءات nftables.","تحديث Portainer عبر `docker pull portainer\u002Fportainer-ce:latest` ثم `docker compose up -d` قبل ترقية Docker Engine.",[99,100,101],"**CasaOS App Store**","توافق جزئي موثَّق: التطبيقات المُنشَرة تستمر في العمل، لكن مدير التطبيقات قد يُبلّغ عن أخطاء عند فحص الصور إذا كان مخزن containerd مُفعَّلاً.","إبقاء مخزن containerd في وضع الإيقاف ‏(افتراضي v29)‏ على VPS التي تعمل بـ CasaOS حتى صدور إصدار تصحيحي. الاختبار على بيئة نسخة قبل أي تحديث.",{"type":103,"title":104,"body":105},"tip","اختبر الهجرة على لقطة قبل لمس بيئة الإنتاج","يتيح لك VPS بصلاحية root ولقطات فورية التحقق من كل خطوة في هذه الهجرة دون مخاطرة. أنشئ لقطة باسم `before-docker-v29`، نفّذ الهجرة الكاملة، تحقق من مكدّساتك، ثم احذف اللقطة. إذا حدث خطأ في الطريق، يُعيد الاستعادة VPS إلى حالته الأولية في أقل من خمس دقائق.",{"type":28,"title":107,"body":108},"استكشاف الأخطاء — أخطاء حقيقية وحلول","تُغطّي السيناريوهات التالية غالبية الحوادث المُلاحَظة خلال هجرات Docker v29 على أساطيل VPS.",{"type":46,"title":110,"steps":111},"سيناريوهات الأخطاء الشائعة",[112,115,118,121,124],{"title":113,"body":114},"الخطأ: `client version X.XX is too old. Minimum supported API version is 1.44`","**السبب**: الملف الثنائي المستقل `docker-compose` v1 لا يزال موجوداً ويحاول التواصل مع daemon الإصدار v29.\n\n**الحل**:\n\n```bash\napt remove docker-compose\napt install docker-compose-plugin\ndocker compose version\n```\n\nإذا كان الملف الثنائي مُثبَّتاً يدوياً ‏(خارج apt)‏، ابحث عنه:\n\n```bash\nwhich docker-compose\nrm \u002Fusr\u002Flocal\u002Fbin\u002Fdocker-compose\n```",{"title":116,"body":117},"الخطأ: `docker-compose: command not found` بعد `apt upgrade`","**السبب**: تمت إزالة حزمة `docker-compose` ‏(v1)‏ أثناء التحديث، ولم تُثبَّت إضافة v2.\n\n**الحل**:\n\n```bash\napt install docker-compose-plugin\n```",{"title":119,"body":120},"الخطأ: `iptables: No chain\u002Ftarget\u002Fmatch by that name` في نص مراقبة","**السبب**: نصك البرمجي يفحص سلسلة `DOCKER` في iptables، لكن Docker v29 مع nftables لا يكتبها هناك بعد الآن.\n\n**الحل**: استبدل فحص iptables بفحص nftables:\n\n```bash\nnft list ruleset | grep -c 'docker'\n```\n\nإذا كان العدد أكبر من صفر، فقواعد Docker موجودة في nftables.",{"title":122,"body":123},"Dockge لا يبدأ بعد التحديث","**السبب**: Dockge ‏1.4.1‏ وما قبله يستدعي مسارات API غائبة من Docker Engine v29.\n\n**الحل**:\n\n```bash\ncd \u002Fopt\u002Fdockge\ndocker compose pull\ndocker compose up -d\n```",{"title":125,"body":126},"الحاويات لا تستجيب على منافذها بعد إعادة تشغيل daemon","**السبب**: عند أول إعادة تشغيل لـ `dockerd` في وضع nftables، تُعاد كتابة قواعد NAT في الخلفية الصحيحة، لكن بعض التوزيعات تعاني تعارضاً بين خدمة `iptables-legacy` وnftables.\n\n**الحل**:\n\n```bash\nsystemctl stop docker\nsystemctl disable iptables\nsystemctl start docker\n```\n\nثم تحقق من إعادة تشغيل الحاويات وكشف المنافذ:\n\n```bash\ndocker compose up -d\ndocker ps --format 'table {{.Names}}\\t{{.Ports}}'\n```",{"type":28,"title":128,"body":129},"تجهيز أسطولك لتجنّب الحادثة التالية","هجرة Docker v29 المُدارة جيداً ليست حدثاً منفرداً — بل فرصة لوضع الممارسات التي تمنع الطارئ الليلي التالي.\n\n**أوقف تحديث Docker تلقائياً في `apt`.** على VPS العملاء، امنع Docker من التحديث أثناء `apt upgrade` غير المُشرَف عليها:\n\n```bash\napt-mark hold docker-ce docker-ce-cli containerd.io\n```\n\nأزل الإيقاف ‏(`apt-mark unhold`)‏ فقط حين تكون مستعداً للهجرة، بعد الاختبار على لقطة.\n\n**أتمتة تدقيق الأسطول.** يستغرق playbook Ansible الذي يتحقق من إصدار API على كل VPS أقل من ساعة لكتابته.","‏VPS‏ جاهزة لـ Docker v29 — مع لقطات وصول root","تحتاج الوكالة التي تُدير عدة VPS لعملائها إلى بنية تحتية Docker متجانسة، مُنظَّمة بإصدارات ومُجهَّزة للتحديثات الخارجية. تُوفّر ServOrbit ‏VPS‏ بصلاحية root وعنوان IPv4 مخصص ولقطات فورية — لاختبار كل هجرة أولاً على بيئة نسخة، لا على خادم عميل إنتاجي.","اكتشف خوادم VPS Cloud","\u002Fsolutions\u002Fagences",[135,145,161],{"id":136,"slug":137,"title":138,"excerpt":139,"readTime":11,"views":12,"isPinned":13,"publishedAt":140,"category":141,"categories":142,"featuredImage":22,"bgImage":23,"posterImage":144,"relatedSolution":22},229,"docker-compose-production-checklist","Docker Compose في الإنتاج: قائمة التحقق من 10 نقاط","‎10 إعدادات Docker Compose يجب التحقق منها قبل أي نشر إنتاجي: إعادة التشغيل والفحوص الصحية والحدود والأسرار والسجلات.","2026-08-06T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},[143],{"id":16,"name":17,"slug":18,"color":19,"icon":18},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",{"id":146,"slug":147,"title":148,"excerpt":149,"readTime":150,"views":12,"isPinned":13,"publishedAt":151,"category":152,"categories":158,"featuredImage":22,"bgImage":23,"posterImage":160,"relatedSolution":22},224,"routine-correctifs-apps-self-hosted","التطبيقات المستضافة ذاتيًا: روتين التصحيحات","الجرد ونشرات الأمان ونافذة التصحيح والنسخ الاحتياطي والتحقق: الروتين الذي تفتقده معظم المنظومات المستضافة ذاتيًا.",4,"2026-08-05T00:00:00+00:00",{"id":153,"name":154,"slug":155,"color":156,"icon":157},8,"الأمان والمراقبة","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[159],{"id":153,"name":154,"slug":155,"color":156,"icon":157},"\u002Fblog\u002Fcovers\u002Froutine-correctifs-apps-self-hosted-poster.svg",{"id":162,"slug":163,"title":164,"excerpt":165,"readTime":11,"views":12,"isPinned":13,"publishedAt":166,"category":167,"categories":172,"featuredImage":22,"bgImage":23,"posterImage":174,"relatedSolution":22},236,"ansible-automatiser-serveurs-vps","أتمتة إدارة خوادم VPS باستخدام Ansible","تعرّف على كيفية أتمتة إدارة أسطول خوادم VPS باستخدام ‎Ansible‎: الجرد والـ playbooks والأدوار والـ Vault لبنية تحتية قابلة للتكرار.","2026-08-08T00:00:00+00:00",{"id":168,"name":169,"slug":170,"color":171,"icon":170},2,"الأتمتة","automatisation","bg-brand-action\u002F10 text-brand-action",[173],{"id":168,"name":169,"slug":170,"color":171,"icon":170},"\u002Fblog\u002Fcovers\u002Fansible-automatiser-serveurs-vps-poster.svg",1786536100755]