[{"data":1,"prerenderedAt":162},["ShallowReactive",2],{"seo-verification":3,"blog-cloudflare-tunnel-exposer-application-vps-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":118,"ctaBody":119,"ctaButton":120,"ctaUrl":121,"relatedPosts":122},248,"cloudflare-tunnel-exposer-application-vps","نفق كلاود فلير: عرض تطبيق VPS بدون فتح منافذ","اعرض تطبيقك على خادم VPS عبر نفق Cloudflare Tunnel دون فتح أي منفذ وارد. دليل شامل مع cloudflared وDocker Compose وخدمة systemd.",10,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\u002Fcloudflare-tunnel-exposer-application-vps-poster.svg","لقد نشرت للتو تطبيقاً على خادم VPS الخاص بك ووجدت نفسك أمام عائق: عنوان IP ديناميكي، أو جدار حماية مؤسسي يحجب المنفذ 443 الوارد، أو رفض بسيط لكشف الخادم مباشرةً على الإنترنت. يحل Cloudflare Tunnel هذه المشكلة بقلب اتجاه الاتصال: فـ`cloudflared` هو من يتصل بـCloudflare وليس العكس. والنتيجة أن تطبيقك يصبح قابلاً للوصول عبر HTTPS على نطاقك، دون فتح أي منفذ وارد ودون المساس بإعدادات DNS.",[27,31,42,45,70,73,77,80,112,115],{"type":28,"title":29,"body":30},"h2","لماذا تختار نفق Cloudflare بدلاً من فتح منفذ","الإعداد التقليدي — فتح المنفذين 80 و443 في جدار الحماية، وتوجيه سجل DNS نحو عنوان IP الخادم، وتثبيت وكيل عكسي — يعمل جيداً حين تتحكم في الشبكة. غير أن ثلاثة سيناريوهات تُعطّله: مزوّد الإنترنت أو شبكة المؤسسة التي تحجب الاتصالات الواردة على المنفذ 443، وعنوان IP ديناميكي يُبطل سجلات DNS كل 24 ساعة، وخادم VPS خلف NAT صارم لا يسمح بأي إعادة توجيه للمنافذ.\n\nيتجاوز Cloudflare Tunnel الحالات الثلاث بآلية واحدة: يُنشئ الوكيل `cloudflared` اتصالاً خارجياً دائماً بنقاط تواجد Cloudflare. لا يقبل خادمك أي اتصال وارد؛ يستقبل Cloudflare طلبات HTTPS ويعيد إرسالها عبر هذا النفق المشفّر. ولا يصل أي حركة مرور واردة إلى خادمك مباشرةً.",{"type":32,"title":33,"items":34},"ul","ما يُقدّمه Cloudflare Tunnel عملياً",[35,36,37,38,39,40,41],"**صفر منافذ مفتوحة** — يمكن لجدار حماية VPS حجب جميع حركة المرور الواردة (بما فيها 80 و443) دون التأثير على إمكانية الوصول إلى التطبيق.","**HTTPS تلقائي** — يدير Cloudflare شهادة TLS من جانب العميل: لا حاجة لإعداد Let's Encrypt، ولا تجديد يدوي للشهادات.","**شفافية NAT والـIP الديناميكي** — يخترق الاتصال الخارجي من `cloudflared` أي NAT؛ ويمكن لعنوان IP الخادم التغير دون إعادة تهيئة DNS.","**شبكة المؤسسة أو مزوّد الإنترنت المقيّد** — إذا كان المنفذ 443 الوارد محجوباً، يستمر النفق في العمل لاعتماده على اتصالات خارجية HTTP\u002F2 أو QUIC.","**تكامل Zero Trust اختياري** — تتزاوج الأنفاق مع Cloudflare Access لتقييد الوصول بالمستخدمين المصادق عليهم، دون الحاجة إلى VPN.","**حماية Cloudflare مضمّنة** — تمر حركة المرور عبر شبكة Cloudflare: تشغيل التخفيف من DDoS وWAF وحدود المعدل دون إعداد إضافي.","**الخطة المجانية متاحة** — نفق بسيط بدون موازنة الأحمال قابل للاستخدام دون اشتراك مدفوع في Cloudflare.",{"type":28,"title":43,"body":44},"المتطلبات الأساسية","لمتابعة هذا الدليل تحتاج إلى:\n\n**خادم VPS بصلاحيات root.** يستلزم تثبيت `cloudflared` كخدمة systemd — الطريقة الوحيدة لضمان إعادة التشغيل التلقائي — امتلاك صلاحيات root. لا تتيح الاستضافة المشتركة أو الأنظمة التي تفتقر إلى صلاحيات root هذا الإعداد.\n\n**موارد دنيا.** يستهلك `cloudflared` أقل من 50 ميغابايت من الذاكرة العشوائية مع استهلاك هزيل للمعالج. احسب 1 vCPU و512 ميغابايت RAM كحدّ أدنى صارم للوكيل وحده؛ القيد الفعلي يأتي من التطبيق الذي تعرضه.\n\n**نطاق مُدار بواسطة Cloudflare.** يجب أن يكون النطاق مسجلاً أو محوّلاً إلى Cloudflare (أو تفويض NS إلى Cloudflare). بدون منطقة Cloudflare نشطة، لا يستطيع النفق المُسمَّى إنشاء سجلات DNS تلقائياً.\n\n**Docker Engine** (في حال استخدام متغيّر Docker Compose من هذا الدليل). متاح على Ubuntu ‏22.04\u002F24.04 وDebian 12 والتوزيعات المتوافقة مع RHEL.\n\n**حساب Cloudflare مجاني.** لا يُشترط أي اشتراك مدفوع لنفق واحد بدون موازنة أحمال.",{"type":46,"title":47,"steps":48},"steps","تثبيت cloudflared وإعداده على الخادم VPS",[49,52,55,58,61,64,67],{"title":50,"body":51},"تثبيت cloudflared عبر مستودع Cloudflare","تنشر Cloudflare حزم `cloudflared` بصيغ ‎.deb‎ و‎.rpm‎ وملف ثنائي ثابت. للتثبيت عبر APT على Debian\u002FUbuntu:\n\n```bash\ncurl -fsSL https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflare-main.gpg | sudo tee \u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg > \u002Fdev\u002Fnull\necho \"deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fcloudflare-main.gpg] https:\u002F\u002Fpkg.cloudflare.com\u002Fcloudflared $(lsb_release -cs) main\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fcloudflared.list\nsudo apt update && sudo apt install cloudflared\n```\n\nتحقق من صحة التثبيت:\n\n```bash\ncloudflared --version\n```\n\nيجب أن تُعيد الأمر سطراً مشابهاً لـ`cloudflared version 2025.x.x (built ...)`. يعتمد الإصدار الدقيق على وقت التثبيت؛ ارجع إلى \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fcloudflared\u002Freleases\">مستودع cloudflare\u002Fcloudflared‏ الرسمي\u003C\u002Fa> للاطلاع على الرقم الحالي.",{"title":53,"body":54},"مصادقة cloudflared مع Cloudflare","على خادم VPS (أو محلياً إن توفّر وصول رسومي)، نفّذ:\n\n```bash\ncloudflared tunnel login\n```\n\nيظهر رابط في الطرفية. افتحه في متصفح، واختر منطقة Cloudflare المراد تفويضها، ثم أكّد. يُنشأ شهادة `~\u002F.cloudflared\u002Fcert.pem` على الجهاز.",{"title":56,"body":57},"إنشاء نفق مُسمَّى","أنشئ نفقاً باسم وصفي:\n\n```bash\ncloudflared tunnel create my-tunnel\n```\n\nتُولّد Cloudflare معرّف UUID وملف اعتماد `~\u002F.cloudflared\u002F\u003CUUID>.json`. احتفظ بالـUUID، ستحتاجه في الخطوات التالية.",{"title":59,"body":60},"كتابة ملف الإعداد config.yml‏","أنشئ `\u002Fetc\u002Fcloudflared\u002Fconfig.yml`:\n\n```bash\nsudo mkdir -p \u002Fetc\u002Fcloudflared\n```\n\nمحتوى الملف (عدّل `\u003CUUID>` و`your-domain.com` ومنفذ تطبيقك):\n\n```yaml\ntunnel: \u003CUUID>\ncredentials-file: \u002Fhome\u002F\u003Cuser>\u002F.cloudflared\u002F\u003CUUID>.json\n\ningress:\n  - hostname: app.your-domain.com\n    service: http:\u002F\u002Flocalhost:3000\n  - service: http_status:404\n```\n\nالقاعدة الأخيرة — `service: http_status:404` بدون `hostname` — **إلزامية**: تعمل كقاعدة احتياطية شاملة. بدونها، يرفض `cloudflared` الانطلاق ويُعيد الخطأ `\"You must specify an ingress rule that matches all incoming requests\"`.",{"title":62,"body":63},"إنشاء سجل DNS وتشغيل النفق","سجّل النطاق الفرعي تلقائياً في منطقة Cloudflare:\n\n```bash\ncloudflared tunnel route dns my-tunnel app.your-domain.com\n```\n\nثم اختبر النفق في وضع العمل الأمامي للتحقق من الإعداد:\n\n```bash\ncloudflared tunnel run my-tunnel\n```\n\nافتح `https:\u002F\u002Fapp.your-domain.com` في متصفح. إذا أجاب التطبيق، أوقف العملية (`Ctrl+C`) وانتقل للخطوة التالية.",{"title":65,"body":66},"تثبيت cloudflared كخدمة systemd","لإعادة تشغيل النفق تلقائياً عند إعادة التشغيل، ثبّته كوكيل نظام:\n\n```bash\nsudo cloudflared service install\nsudo systemctl enable cloudflared\nsudo systemctl start cloudflared\nsudo systemctl status cloudflared\n```\n\nملف وحدة systemd الذي يُنشئه Cloudflare موجود في `\u002Fetc\u002Fsystemd\u002Fsystem\u002Fcloudflared.service`. يبدو مشابهاً لـ:\n\n```ini\n[Unit]\nDescription=cloudflared\nAfter=network.target\n\n[Service]\nTimeoutStartSec=0\nType=notify\nExecStart=\u002Fusr\u002Fbin\u002Fcloudflared --no-autoupdate tunnel run\nRestart=on-failure\nRestartSec=5s\n\n[Install]\nWantedBy=multi-user.target\n```\n\nمع هذه الخدمة النشطة، يعمل النفق منذ لحظة تشغيل خادم VPS دون تدخل يدوي.",{"title":68,"body":69},"دمج cloudflared في مكدس Docker Compose موجود","إذا كان تطبيقك يعمل بالفعل في مكدس Docker Compose، أضف خدمة `cloudflared` في الملف نفسه. نهج التوكن (بدون ملف اعتماد) هو الأبسط للحاوية:\n\n```yaml\nservices:\n  app:\n    image: my-image\n    networks:\n      - internal\n\n  cloudflared:\n    image: cloudflare\u002Fcloudflared:latest\n    command: tunnel --no-autoupdate run\n    environment:\n      - TUNNEL_TOKEN=${TUNNEL_TOKEN}\n    networks:\n      - internal\n    restart: unless-stopped\n\nnetworks:\n  internal:\n```\n\nعرّف `TUNNEL_TOKEN` في ملف `‎.env` على المستوى نفسه. يُسترجع التوكن من لوحة تحكم Cloudflare ← Zero Trust ← Networks ← Tunnels ← النفق الخاص بك ← Configure ← موصّلات Docker. تشارك خدمة `cloudflared` وتطبيقك شبكة `internal`؛ أشر إلى التطبيق باسم خدمة Docker (`http:\u002F\u002Fapp:3000` بدلاً من `http:\u002F\u002Flocalhost:3000`).",{"type":28,"title":71,"body":72},"الإعداد بعد التثبيت","بمجرد تشغيل النفق، تُحسّن بعض الإعدادات الإضافية متانة التكوين.\n\n**استرجاع عنوان IP الحقيقي للعميل.** افتراضياً، يستقبل تطبيقك الطلبات من `127.0.0.1` أو من IP الداخلي للنفق. للحصول على IP الزائر الحقيقي، اقرأ ترويسة `CF-Connecting-IP` التي تضخها Cloudflare تلقائياً. هيّئ تطبيقك أو الوكيل العكسي المحلي للوثوق بهذه الترويسة.\n\n**تشفير شامل.** يُشفّر النفق الاتصال بين `cloudflared` وCloudflare. أما الاتصال بين `cloudflared` وتطبيقك المحلي فهو HTTP بشكل افتراضي (loopback أو شبكة Docker الداخلية). إذا كشف تطبيقك HTTPS محلياً، أضف `originServerName: app.your-domain.com` في قاعدة الـingress المقابلة لكي يتحقق `cloudflared` من الشهادة.\n\n**عدة خدمات، نفق واحد.** يمكن لنفق واحد كشف عدة خدمات على نطاقات فرعية متميزة: ما عليك سوى إضافة مداخل إضافية في كتلة `ingress` في `config.yml`، قبل قاعدة الاحتياطي الشاملة.",{"type":74,"title":75,"body":76},"tip","التصليب: أغلق المنافذ الواردة 80 و443","الميزة الرئيسية لهذه البنية هي القدرة على إغلاق جميع المنافذ الواردة على خادم VPS. بمجرد التحقق من صحة النفق، طبّق قواعد UFW التالية:\n\n```bash\nsudo ufw default deny incoming\nsudo ufw default allow outgoing\nsudo ufw allow ssh\nsudo ufw enable\n```\n\nيبقى تطبيقك قابلاً للوصول عبر نفق Cloudflare (الذي يعتمد على اتصالات خارجية)، ويبقى منفذ SSH مفتوحاً للإدارة. ولن يصل أي اتصال مباشر على 80 أو 443 إلى الخادم بعد الآن.",{"type":28,"title":78,"body":79},"Cloudflare Tunnel مقابل Nginx \u002F Traefik: نهجان متكاملان","اعتراض شائع: «لديّ بالفعل Nginx وTraefik تضطلعان بهذا الدور، فلماذا أضيف طبقة Cloudflare؟» الجواب أن النهجين لا يحلّان المشكلة ذاتها.\n\nيدير الوكيل العكسي المحلي (Nginx أو Traefik أو Caddy) التوجيه بين الخدمات على الشبكة ذاتها وتجديد شهادات SSL — لكنه يفترض وصول حركة المرور الواردة إلى الخادم. إذا كان المنفذ 443 محجوباً في الشبكة الأعلى، فالوكيل العكسي لا يجدي.\n\nيحل Cloudflare Tunnel تحديداً ما لا يستطيعه الوكيل العكسي المحلي: تصل حركة المرور إلى Cloudflare بصرف النظر عن اتصال الشبكة للخادم. النهجان متكاملان: يمكنك بسهولة وضع Traefik خلف النفق لإدارة التوجيه الداخلي، بينما تتولى Cloudflare إدارة TLS العام.",{"type":81,"title":82,"headers":83,"rows":87},"comparison","Cloudflare Tunnel مقابل الوكيل العكسي المحلي",[84,85,86],"المعيار","Cloudflare Tunnel","وكيل عكسي محلي (Nginx\u002FTraefik)",[88,92,96,100,104,108],[89,90,91],"منفذ وارد مطلوب","لا — اتصال خارجي فقط","نعم — يجب إمكانية الوصول إلى 80\u002F443",[93,94,95],"TLS العام","تديره Cloudflare، تلقائي","‏Let's Encrypt عبر ACME (certbot، Traefik…)",[97,98,99],"IP ديناميكي \u002F NAT صارم","شفاف — لا حاجة لتحديث DNS","إشكالية — تتطلب DynDNS أو IP ثابت",[101,102,103],"موازنة الأحمال","خطة مدفوعة (Cloudflare Load Balancing)","متاحة بشكل أصلي (Traefik، Nginx upstream)",[105,106,107],"زمن الاستجابة","أعلى قليلاً (توجيه عبر POP كلاود فلير)","أدنى ما يمكن — مرور مباشر إلى الخادم",[109,110,111],"اعتماد خارجي","نعم — يجب إمكانية الوصول إلى Cloudflare","لا — يعمل بدون طرف ثالث",{"type":28,"title":113,"body":114},"استكشاف الأخطاء: رسائل الخطأ الشائعة","**`You must specify an ingress rule that matches all incoming requests`**\nقاعدة الاحتياطي الشاملة غائبة أو في موضع خاطئ في `config.yml`. يجب أن تكون آخر مدخل في كتلة `ingress`، بدون `hostname`، مع `service: http_status:404`.\n\n**`Unable to locate config file in default locations`**\nيبحث `cloudflared` عن إعداداته في `~\u002F.cloudflared\u002Fconfig.yml` أو `\u002Fetc\u002Fcloudflared\u002Fconfig.yml`. حدّد المسار صراحةً باستخدام `cloudflared tunnel --config \u002Fetc\u002Fcloudflared\u002Fconfig.yml run my-tunnel`.\n\n**`ERR connection to origin timed out` في السجلات**\nالتطبيق المستهدف غير قابل للوصول من `cloudflared`. تحقق من تشغيل الخدمة المحلية (`curl http:\u002F\u002Flocalhost:3000`) وتطابق المنفذ في `config.yml`. في سياق Docker Compose، استخدم اسم الخدمة (`http:\u002F\u002Fapp:3000`) بدلاً من `localhost`.\n\n**توكن منتهي الصلاحية: `tunnel credentials file not found` أو `token is expired`**\nللتوكنات المُولَّدة عبر واجهة Cloudflare مدة صلاحية محدودة إذا لم يُسجَّل الموصّل قط. أعد إنشاء التوكن من Zero Trust ← Networks ← Tunnels ← Configure ← Connectors، ثم حدّث المتغير `TUNNEL_TOKEN` في ملف `‎.env`.\n\n**قيود الخطة المجانية: موازنة الأحمال والـSSH عبر النفق**\nلا تدعم الخطة المجانية موازنة الأحمال بين أصول متعددة. يستلزم الوصول إلى SSH عبر النفق (`cloudflared access ssh`) في الخطة المجانية إعداداً محدداً لـCloudflare Access وليس مفعّلاً بشكل افتراضي. يقتصر عدد الموصّلات لكل نفق على بضع نسخ في الخطة المجانية.",{"type":28,"title":116,"body":117},"Cloudflare Tunnel كبنية مرجعية على VPS","يوضح Cloudflare Tunnel ما يتيحه الوصول بصلاحيات root على VPS: تثبيت `cloudflared` كوكيل نظام، وتعديل قواعد جدار الحماية، وإدارة خدمات systemd. على الاستضافة المشتركة بدون وصول root، لا تُنجَز أيٌّ من هذه الخطوات — لا يمكن تثبيت الوكيل، وجدار الحماية خارج سيطرتك، ولا يمكن إعداد الخدمة للانطلاق عند بدء التشغيل.\n\nتناسب هذه البنية بصفة خاصة الحالات التي تكون فيها اتصالية الشبكة مقيّدة أو غير مضمونة: بيئات التطوير، والمكاتب ذات جدران الحماية المؤسسية الصارمة، وخوادم الحافة، أو مجرد رفض كشف IP عام. وتتكامل بشكل طبيعي مع الوكلاء العكسيين المحليين كـTraefik أوNginx Proxy Manager للتوجيه الداخلي، ومع تصليب النظام لإغلاق أسطح الهجوم المباشرة.","خادم VPS بصلاحيات root لتثبيت cloudflared","يستلزم وكيل `cloudflared` وخدمة systemd الخاصة به صلاحيات root — وهو ما لا توفّره الاستضافة المشتركة. يمنحك خادم VPS من ServOrbit التحكم الكامل: اختيار نظام التشغيل، والوصول root، وعنوان IPv4 مخصص، وقوالب Marketplace للانطلاق بسرعة.","عرض خوادم VPS السحابية","\u002Fsolutions\u002Fdeveloppeurs",[123,134,149],{"id":124,"slug":125,"title":126,"excerpt":127,"readTime":11,"views":128,"isPinned":13,"publishedAt":129,"category":130,"categories":131,"featuredImage":22,"bgImage":23,"posterImage":133,"relatedSolution":22},37,"deployer-avec-nginx-proxy-manager","انشر تطبيقاتك باستخدام Nginx Proxy Manager على خادم VPS","أدِر النطاقات وشهادات SSL والوكيل العكسي لعدة خدمات على خادم VPS باستخدام Nginx Proxy Manager: التثبيت وشبكات Docker واستكشاف أخطاء 502 والإعداد المتقدم.",369,"2026-05-14T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},[132],{"id":16,"name":17,"slug":18,"color":19,"icon":18},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-nginx-proxy-manager-poster.svg",{"id":135,"slug":136,"title":137,"excerpt":138,"readTime":11,"views":12,"isPinned":13,"publishedAt":139,"category":140,"categories":146,"featuredImage":22,"bgImage":23,"posterImage":148,"relatedSolution":22},228,"durcissement-serveur-linux-initial","تصليب الخادم ‎Linux‎ الأولي","أنشئ مستخدم ‎sudo‎، وكوّن ‎SSH‎ بالمفاتيح، وفعّل ‎UFW‎ و‎fail2ban‎ على ‎Ubuntu 22.04‎ أو ‎Debian 12‎ في أقل من ساعة.","2026-08-06T00:00:00+00:00",{"id":141,"name":142,"slug":143,"color":144,"icon":145},8,"الأمان والمراقبة","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[147],{"id":141,"name":142,"slug":143,"color":144,"icon":145},"\u002Fblog\u002Fcovers\u002Fdurcissement-serveur-linux-initial-poster.svg",{"id":150,"slug":151,"title":152,"excerpt":153,"readTime":11,"views":154,"isPinned":13,"publishedAt":155,"category":156,"categories":157,"featuredImage":22,"bgImage":23,"posterImage":159,"relatedSolution":160},41,"deployer-avec-coolify","نشر تطبيقاتك باستخدام ‏Coolify على خادم ‏VPS","دليل شامل لنشر ‏Coolify على خادم ‏VPS: التثبيت، وإعداد ‏HTTPS، وربط ‏Git، ونشر أول تطبيق، وقواعد البيانات، والنسخ الاحتياطية، واستكشاف الأخطاء.",1640,"2026-05-10T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":18},[158],{"id":16,"name":17,"slug":18,"color":19,"icon":18},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":18,"appSlug":161},"coolify",1786536086643]