يتطلب اختبار واجهات برمجة التطبيقات المحلية (localhost APIs) التي تحتاج إلى تلقي رسائل الويب هوك (webhooks) أو الاستدعاءات (callbacks) من خدمات خارجية، كشف خادم التطوير المحلي الخاص بك على الإنترنت مؤقتًا. توفر خدمات الأنفاق (tunneling services) مثل ngrok و NPort و Cloudflare Tunnel وغيرها اتصالات آمنة تمنح خادمك المحلي عنوان URL عامًا.
لماذا تحتاج إلى أنفاق الخادم المحلي (Localhost Tunneling)
أنت تقوم ببناء واجهة برمجة تطبيقات تتكامل مع خدمات خارجية. كل شيء يعمل على جهاز الكمبيوتر المحمول الخاص بك – تستجيب نقاط النهاية بشكل صحيح، وتتدفق البيانات بسلاسة. ثم تحاول اختبار استدعاءات الويب هوك من Stripe، GitHub، Twilio، أو أي خدمة خارجية.
المشكلة: لا تستطيع الخدمات الخارجية الوصول إلى localhost:3000. خادم التطوير الخاص بك غير متاح من الإنترنت.
سيناريوهات شائعة حيث يعيق هذا سير عملك:
1. اختبار الويب هوك (Webhook Testing)
ترسل خدمات مثل Stripe تأكيدات الدفع، ويرسل GitHub أحداث المستودع، وترسل Slack أحداث التفاعل – كلها كطلبات POST إلى واجهة برمجة التطبيقات الخاصة بك. أثناء التطوير، تحتاج هذه الخدمات إلى عنوان URL عام لإرسال رسائل الويب هوك إليه.

2. عناوين URL لاستدعاء OAuth
عند تنفيذ "تسجيل الدخول باستخدام Google" أو "تسجيل الدخول باستخدام GitHub" أو أي تدفق OAuth، يقوم مزود المصادقة بإعادة توجيه المستخدمين إلى تطبيقك برمز ترخيص. يجب أن يكون عنوان URL لإعادة التوجيه متاحًا للعامة ويتطابق مع ما سجلته لدى المزود.

3. تكامل واجهة برمجة التطبيقات لطرف ثالث
تتطلب بعض واجهات برمجة التطبيقات عناوين URL للاستدعاء للعمليات غير المتزامنة. على سبيل المثال، تخبر خدمات تحويل الفيديو واجهة برمجة التطبيقات الخاصة بك عند اكتمال المعالجة، أو يؤكد معالجات الدفع المعاملات.
4. تطوير تطبيقات الجوال
غالبًا ما يفشل اختبار واجهة برمجة التطبيقات الخاصة بك من جهاز محمول على نفس الشبكة لأن تطبيق الهاتف المحمول لا يمكنه حل localhost. يمنحك النفق عنوان URL يعمل من أي جهاز.
5. عروض للعملاء
أحيانًا تحتاج إلى عرض العمل قيد التقدم للعملاء أو أصحاب المصلحة. يؤدي النشر إلى بيئة الاختبار لكل تغيير صغير إلى إبطاء التكرار. يتيح عنوان URL العام المؤقت للعملاء اختبار بيئة التطوير الخاصة بك.
كيف تعمل أنفاق الخادم المحلي (Localhost Tunneling)
تنشئ خدمات الأنفاق اتصالًا آمنًا بين خوادمها السحابية وجهازك المحلي:
خدمة خارجية ← خدمة الأنفاق (عنوان URL عام) ← اتصال آمن ← الخادم المحلي الخاص بك:3000
العملية:
- تبدأ عميل نفق على جهازك يشير إلى المنفذ المحلي الخاص بك
- يتصل العميل بالبنية التحتية السحابية لخدمة الأنفاق
- تخصص الخدمة عنوان URL عامًا (مثل
https://abc123.ngrok.io) - الطلبات الواردة إلى عنوان URL العام هذا يتم إعادة توجيهها عبر الاتصال المشفر إلى خادمك المحلي
- يتلقى خادمك المحلي الطلب كما لو جاء مباشرة من العميل
- تتدفق الردود عائدة عبر النفق إلى طالب الخدمة
يحدث هذا بشفافية. لا يحتاج خادمك المحلي إلى معرفة أنه يقع خلف نفق.
مقارنة خدمات الأنفاق الشائعة
فيما يلي الخيارات الأكثر شيوعًا في عام 2026، مع نقاط قوتها وقيودها:
ngrok (الأكثر شعبية)
الأفضل لـ: المشاريع القائمة، الفرق التي ترغب في الموثوقية
ngrok http 3000

الإيجابيات:
- معيار صناعي مع وثائق شاملة
- واجهة مستخدم مفتش الويب لرؤية جميع الطلبات
- نطاقات مخصصة على الخطط المدفوعة
- وظيفة إعادة تشغيل الطلب
- إنهاء TLS
السلبيات:
- الطبقة المجانية لها حد زمني للجلسة مدته ساعتان
- عناوين URL عشوائية في الطبقة المجانية (تتغير مع كل جلسة)
- يبدأ التسعير من 10 دولارات شهريًا لعناوين URL المستمرة
الطبقة المجانية:
- وكيل واحد عبر الإنترنت
- 40 اتصال/دقيقة
- عناوين URL عشوائية تنتهي صلاحيتها
الخطط المدفوعة: 8-20 دولارًا شهريًا

NPort (بديل مجاني صاعد)
الأفضل لـ: المطورين الذين يتجنبون تكاليف الاشتراك

nport start 3000
الإيجابيات:
- مجاني تمامًا ومفتوح المصدر
- لا توجد قيود على وقت الجلسة
- نطاقات فرعية مخصصة متاحة
- خيار الاستضافة الذاتية
- مجموعة ميزات مماثلة لطبقة ngrok المجانية
السلبيات:
- مجتمع أصغر (عدد أقل من البرامج التعليمية)
- أقل نضجًا (تم إطلاقه عام 2025)
- لا يوجد دعم تجاري
الطبقة المجانية:
- أنفاق غير محدودة
- لا حدود زمنية
- نطاقات فرعية مخصصة

هذه هي الأداة التي تكتسب شعبية على Dev.to حيث يبحث المطورون عن بدائل ngrok بدون تكاليف مستمرة.
Cloudflare Tunnel (الأفضل للمشاريع القريبة من الإنتاج)
الأفضل لـ: الفرق التي تستخدم Cloudflare بالفعل، الأنفاق طويلة الأمد

cloudflared tunnel --url http://localhost:3000
الإيجابيات:
- بنية تحتية على مستوى المؤسسات
- حماية DDoS متضمنة
- يتكامل مع Cloudflare Zero Trust
- لا توجد قيود على النطاق الترددي
- مجاني لمعظم حالات الاستخدام
السلبيات:
- إعداد أكثر تعقيدًا
- يتطلب حساب Cloudflare
- مبالغ فيه لاختبار الويب هوك البسيط
الطبقة المجانية:
- نطاق ترددي غير محدود
- أنفاق غير محدودة
- حماية DDoS
Localtunnel (الأبسط)
الأفضل لـ: اختبارات سريعة لمرة واحدة، لا يتطلب تثبيت
npx localtunnel --port 3000
الإيجابيات:
- لا يتطلب التسجيل
- صفر إعدادات
- لا يتطلب تثبيت (يعمل عبر npx)
- مفتوح المصدر
السلبيات:
- غير موثوق به (غالبًا ما يتعطل)
- لا يوجد فحص للطلبات
- عناوين URL عشوائية فقط
- وثائق قليلة جدًا

الطبقة المجانية:
- كل شيء مجاني
- لا توجد قيود على الميزات
Tailscale Funnel (الأفضل للفرق)
الأفضل لـ: مشاركة الفريق الخاصة، عروض توضيحية آمنة

tailscale serve https / http://localhost:3000
tailscale funnel 443 on
الإيجابيات:
- يعتمد على WireGuard (سريع، آمن)
- خاص افتراضيًا (مرئي فقط لشبكة Tailscale الخاصة بك)
- يمكن كشفه للعامة عند الحاجة
- ممتاز للتعاون الجماعي
السلبيات:
- يتطلب إعداد Tailscale
- منحنى تعليمي أكثر حدة
- مصمم بشكل أساسي للشبكات الخاصة
الطبقة المجانية:
- حتى 100 جهاز
- نطاق ترددي غير محدود

جدول المقارنة
| الميزة | ngrok | NPort | Cloudflare Tunnel | Localtunnel | Tailscale |
|---|---|---|---|---|---|
| السعر | مجاني/10 دولار+ | مجاني | مجاني | مجاني | مجاني/مدفوع |
| حد الجلسة | ساعتان | لا يوجد | لا يوجد | لا يوجد | لا يوجد |
| نطاق مخصص | مدفوع | مجاني | نعم | لا | نعم |
| مفتش الطلبات | نعم | أساسي | لا | لا | لا |
| تعقيد الإعداد | منخفض | منخفض | متوسط | منخفض جدًا | متوسط |
| الموثوقية | ممتازة | جيدة | ممتازة | ضعيفة | ممتازة |
| الأفضل لـ | اختبار الإنتاج | المطورين الحريصين على التكلفة | المؤسسات | الاختبارات السريعة | مشاركة الفريق |
إعداد نفق الخادم المحلي الأول الخاص بك
دعنا نمر بإعداد الأدوات الأكثر شيوعًا. سنستخدم واجهة برمجة تطبيقات Node.js Express كمثال، ولكن هذا يعمل مع أي خادم محلي.
مثال: خادم واجهة برمجة تطبيقات محلي
// server.js
const express = require('express');
const app = express();
app.use(express.json());
app.post('/webhook', (req, res) => {
console.log('Webhook received:', req.body);
res.json({ received: true });
});
app.get('/health', (req, res) => {
res.json({ status: 'healthy' });
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
الخيار 1: استخدام ngrok
الخطوة 1: تثبيت ngrok
# macOS
brew install ngrok
# Windows (عبر Chocolatey)
choco install ngrok
# Linux
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | \
sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null && \
echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | \
sudo tee /etc/apt/sources.list.d/ngrok.list && \
sudo apt update && sudo apt install ngrok
الخطوة 2: المصادقة (اختياري ولكن موصى به)
ngrok config add-authtoken YOUR_AUTH_TOKEN
الخطوة 3: بدء النفق
ngrok http 3000
الناتج:
Session Status online
Account you@example.com (Plan: Free)
Version 3.5.0
Region United States (us)
Forwarding https://abc123.ngrok.io -> http://localhost:3000
الآن يمكن الوصول إلى واجهة برمجة التطبيقات الخاصة بك على https://abc123.ngrok.io.
الخطوة 4: اختبرها
curl https://abc123.ngrok.io/health
# {"status":"healthy"}
الخيار 2: استخدام NPort (بديل مجاني)
الخطوة 1: تثبيت NPort
npm install -g nport-cli
# أو
curl -sSL https://nport.io/install.sh | bash
الخطوة 2: بدء النفق
nport start 3000 --subdomain myapi
الناتج:
✓ Tunnel started successfully
Public URL: https://myapi.nport.io
Local URL: http://localhost:3000
الخطوة 3: اختبرها
curl https://myapi.nport.io/health
# {"status":"healthy"}
الخيار 3: استخدام Cloudflare Tunnel
الخطوة 1: تثبيت cloudflared
# macOS
brew install cloudflare/cloudflare/cloudflared
# Linux
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
الخطوة 2: نفق سريع (لا يتطلب التسجيل)
cloudflared tunnel --url http://localhost:3000
الناتج:
2026-01-27T12:00:00Z INF Your quick tunnel is: https://xyz789.trycloudflare.com
للأنفاق الدائمة (يتطلب حساب Cloudflare):
# تسجيل الدخول
cloudflared tunnel login
# إنشاء نفق
cloudflared tunnel create myapi
# التكوين والتشغيل
cloudflared tunnel --config config.yml run myapi
اختبار الويب هوك باستخدام Apidog
الآن بعد أن أصبح خادمك المحلي متاحًا للعامة، دعنا نختبر الويب هوك بشكل منهجي باستخدام Apidog.
لماذا نجمع بين Tunneling + Apidog؟
يقوم الـ Tunneling بحل مشكلة الوصول؛ ويقوم Apidog بحل مشكلة التحقق:
- خدمة الـ Tunneling تجعل خادمك المحلي قابلاً للوصول
- Apidog يختبر استجابات واجهة برمجة التطبيقات الخاصة بك، يتحقق من صحة البيانات، ويقوم بأتمتة السيناريوهات
إعداد اختبار الويب هوك في Apidog
الخطوة 1: استيراد أو إنشاء واجهة برمجة التطبيقات الخاصة بك
- افتح Apidog

2. أنشئ مشروعًا جديدًا

3. أضف نقطة نهاية الويب هوك الخاصة بك:

- الأسلوب: POST
- عنوان URL:
{{base_url}}/webhook - الرؤوس:
Content-Type: application/json
الخطوة 2: تهيئة متغيرات البيئة
قم بإعداد بيئتين:
التطوير (المُنفق):
{
"base_url": "https://abc123.ngrok.io"
}
الإنتاج:
{
"base_url": "https://api.yourapp.com"
}
يتيح لك هذا اختبار نفس نقطة النهاية محليًا وفي بيئة الإنتاج بنقرة واحدة.
الخطوة 3: إنشاء سيناريوهات اختبار
اختبر ما يحدث عند وصول الويب هوكس:
مثال: اختبار ويب هوك دفع Stripe
// نص الطلب
{
"type": "payment_intent.succeeded",
"data": {
"object": {
"id": "pi_test123",
"amount": 2000,
"currency": "usd",
"status": "succeeded"
}
}
}
التحققات في Apidog:
- رمز الحالة يساوي 200
- الاستجابة تحتوي على
received: true - وقت الاستجابة < 1000 مللي ثانية
- نوع المحتوى هو
application/json
الخطوة 4: محاكاة خدمات الطرف الثالث
بدلاً من تفعيل رسائل الويب هوك حقيقية من Stripe أو GitHub، قم بمحاكاتها في Apidog:
- انسخ أمثلة حمولات الويب هوك من وثائق الخدمة
- أنشئ حالات اختبار مع سيناريوهات متنوعة (نجاح، فشل، حالات حافة)
- شغّل جميع السيناريوهات مقابل خادمك المحلي الذي تم تزويده بنفق
- تحقق من أن واجهة برمجة التطبيقات الخاصة بك تتعامل مع كل حالة بشكل صحيح
اختبار استدعاءات OAuth
السيناريو: أنت تقوم بتنفيذ "تسجيل الدخول باستخدام Google"
الخطوة 1: ابدأ النفق بنطاق فرعي مخصص
ngrok http 3000 --subdomain myapp
# عنوان URL: https://myapp.ngrok.io
الخطوة 2: تهيئة إعادة توجيه OAuth في Google Console
ضبط عنوان URL لإعادة التوجيه: https://myapp.ngrok.io/auth/google/callback
الخطوة 3: اختبر التدفق في Apidog
- قم بطلب إلى
/auth/googleللحصول على عنوان URL للترخيص - اتبع إعادة التوجيه يدويًا أو برمجيًا
- تحقق من أن الاستدعاء يتلقى رمز التفويض
- تحقق من أن تبادل الرموز يعمل بشكل صحيح
الخطوة 4: التحقق من تخزين الرموز
استخدم Apidog من أجل:
- التحقق من تخزين الرموز بأمان
- اختبار تدفق تحديث الرموز
- التأكد من معالجة الرموز منتهية الصلاحية
حالات الاستخدام الشائعة
1. اختبار الويب هوك للدفع (Stripe, PayPal)
التحدي: يرسل مقدمو خدمات الدفع رسائل الويب هوك لأحداث مثل عمليات الشحن الناجحة، وعمليات استرداد الأموال، والنزاعات.
الحل:
# بدء النفق
ngrok http 3000
# تهيئة عنوان URL للويب هوك في لوحة تحكم Stripe
# https://abc123.ngrok.io/webhook/stripe
# استخدم Stripe CLI لإعادة توجيه الويب هوك التجريبية
stripe listen --forward-to localhost:3000/webhook/stripe
# تفعيل الأحداث التجريبية
stripe trigger payment_intent.succeeded
اختبار باستخدام Apidog:
- إنشاء حالات اختبار لكل نوع حدث
- التحقق من عدم تكرار المعالجة (idempotency) (التعامل مع الويب هوكس المكررة)
- اختبار التحقق من التوقيع
- التأكد من تحديث قاعدة البيانات بشكل صحيح
2. اختبار أوامر روبوت Slack/Discord
التحدي: ترسل منصات الدردشة أحداث التفاعل عندما ينقر المستخدمون على الأزرار أو يشغلون الأوامر.
الحل:
# بدء النفق
nport start 3000 --subdomain myslackbot
# التكوين في Slack API:
# عنوان URL للتفاعل: https://myslackbot.nport.io/slack/interactions
# أوامر Slash: https://myslackbot.nport.io/slack/commands
اختبار باستخدام Apidog:
- محاكاة نقرات الأزرار
- اختبار استجابات أوامر slash
- التحقق من توقيت الاستجابة (يتطلب Slack استجابات في غضون 3 ثوانٍ)
- اختبار الاستجابات المؤجلة باستخدام
response_url
3. اختبار الويب هوك للرسائل النصية/المكالمات الصوتية (Twilio)
التحدي: ترسل Twilio رسائل الويب هوك عند وصول رسالة نصية أو استلام مكالمات صوتية.
الحل:
cloudflared tunnel --url http://localhost:3000
قم بتهيئة Twilio TwiML webhooks لتشير إلى عنوان URL الخاص بالنفق.
اختبار باستخدام Apidog:
- محاكاة حمولات الرسائل النصية الواردة
- اختبار أنواع الرسائل المختلفة (MMS، SMS)
- التحقق من صحة توقيع Twilio
- اختبار إنشاء استجابة TwiML
4. اختبار واجهة برمجة تطبيقات تطبيقات الجوال
التحدي: اختبار واجهة برمجة التطبيقات الخاصة بك من جهاز فعلي أو محاكي.
مشكلة مع localhost:
// هذا يفشل من جهاز الجوال
fetch('http://localhost:3000/api/users')
الحل مع النفق:
// هذا يعمل من أي مكان
fetch('https://myapi.ngrok.io/api/users')
اختبار باستخدام Apidog:
- إنشاء وثائق واجهة برمجة التطبيقات مع عنوان URL الأساسي المُنفق
- مشاركتها مع فريق الجوال
- يمكن لمطوري الجوال الاختبار مقابل خادم التطوير المباشر الخاص بك
- التبديل إلى عناوين URL لبيئة الاختبار/الإنتاج عندما تكون جاهزًا
5. اختبار GitHub/GitLab Webhooks
التحدي: اختبار ويب هوك المستودع (الدفع، طلبات السحب، المشاكل) محليًا.
الحل:
# بدء النفق
ngrok http 4000
# التكوين في إعدادات مستودع GitHub:
# عنوان URL للويب هوك: https://abc123.ngrok.io/github/webhook
# نوع المحتوى: application/json
# الأحداث: الدفع، طلبات السحب
اختبار باستخدام Apidog:
- محاكاة أحداث الدفع
- اختبار أحداث فتح/إغلاق طلبات السحب
- التحقق من صحة التوقيع (X-Hub-Signature)
- اختبار منطق تصفية الفروع
أفضل ممارسات الأمان
إن كشف الخادم المحلي (localhost) على الإنترنت ينطوي على مخاطر أمنية. اتبع هذه الممارسات:
1. استخدم HTTPS فقط
توفر جميع خدمات الأنفاق HTTPS افتراضيًا. لا تستخدم أبدًا HTTP عاديًا للأنفاق:
# جيد
ngrok http 3000
# ينشئ https://abc123.ngrok.io
# سيء (لا تفعل هذا)
ngrok http --scheme=http 3000
2. تنفيذ التحقق من توقيع الويب هوك
لا تثق بالويب هوك الواردة بشكل أعمى. تحقق من التواقيع:
const crypto = require('crypto');
function verifyStripeSignature(payload, signature, secret) {
const expectedSignature = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
}
app.post('/webhook/stripe', (req, res) => {
const signature = req.headers['stripe-signature'];
if (!verifyStripeSignature(req.body, signature, process.env.STRIPE_SECRET)) {
return res.status(401).send('Invalid signature');
}
// معالجة الويب هوك
});
3. تقييد الوصول باستخدام Basic Auth
أضف المصادقة إلى النفق الخاص بك:
# ngrok مع مصادقة أساسية
ngrok http 3000 --auth="username:password"
# NPort مع مصادقة أساسية
nport start 3000 --auth username:password
الآن تحتاج الطلبات إلى بيانات اعتماد:
curl -u username:password https://abc123.ngrok.io/webhook
4. استخدم أسرارًا خاصة بالبيئة
لا تقم أبدًا بتضمين أسرار الويب هوك أو مفاتيح API في الكود:
// .env.development
STRIPE_WEBHOOK_SECRET=whsec_test_abc123
WEBHOOK_TUNNEL_URL=https://abc123.ngrok.io
// .env.production
STRIPE_WEBHOOK_SECRET=whsec_live_xyz789
WEBHOOK_URL=https://api.yourapp.com
5. مراقبة الوصول إلى النفق
استخدم مفتش الطلبات لمراقبة أي نشاط مشبوه:
# يوفر ngrok واجهة ويب على:
http://localhost:4040
# عرض جميع الطلبات، الاستجابات، إعادة تشغيل الهجمات
6. تحديد مدة النفق
لا تترك الأنفاق تعمل إلى أجل غير مسمى:
# انتهاء صلاحية النفق تلقائيًا بعد ساعة واحدة
ngrok http 3000 --session-duration 1h
7. التحقق من مصادر الطلبات
تحقق من عناوين IP الواردة أو استخدم قوائم السماح:
const allowedIPs = [
'192.0.2.1', // عناوين IP لـ Stripe webhook
'198.51.100.0/24'
];
app.use('/webhook', (req, res, next) => {
const clientIP = req.ip;
if (!allowedIPs.includes(clientIP)) {
return res.status(403).send('Forbidden');
}
next();
});
استكشاف المشاكل الشائعة وإصلاحها
المشكلة 1: يتغير عنوان URL الخاص بالنفق مع كل جلسة
المشكلة: تستخدم أنفاق ngrok المجانية عناوين URL عشوائية تتغير مع كل إعادة تشغيل. تتعطل رسائل الويب هوك التي تم تكوينها بعنوان URL القديم.
الحلول:
- استخدم خطة مدفوعة للحصول على عناوين URL ثابتة:
ngrok http 3000 --domain=myapp.ngrok.app
- التبديل إلى NPort مع نطاقات فرعية مخصصة مجانية:
nport start 3000 --subdomain myapp
# دائمًا https://myapp.nport.io
- تحديث رسائل الويب هوك برمجيًا عبر واجهة برمجة التطبيقات عند بدء النفق
المشكلة 2: انتهاء مهلة رسائل الويب هوك
المشكلة: يستغرق خادمك المحلي وقتًا طويلاً للرد. تتطلب خدمات مثل Slack ردودًا في غضون 3 ثوانٍ.
الحل:
المعالجة غير المتزامنة:
app.post('/webhook', async (req, res) => {
// الاعتراف فورًا
res.json({ received: true });
// المعالجة في الخلفية
processWebhookAsync(req.body).catch(console.error);
});
async function processWebhookAsync(data) {
// قم بالعمل البطيء هنا (قاعدة البيانات، واجهات برمجة التطبيقات الخارجية، إلخ)
await heavyProcessing(data);
}
اختبر انتهاء المهلة باستخدام Apidog عن طريق تعيين حدود مهلة قصوى في سيناريوهات الاختبار.
المشكلة 3: أخطاء CORS من المتصفح
المشكلة: الواجهة الأمامية التي تُجري طلبات إلى عنوان URL للنفق تحصل على أخطاء CORS.
الحل:
تهيئة رؤوس CORS:
const cors = require('cors');
app.use(cors({
origin: [
'http://localhost:3001', // خادم الواجهة الأمامية الخاص بك للتطوير
'https://abc123.ngrok.io' // عنوان URL الخاص بالنفق الخاص بك
],
credentials: true
}));
المشكلة 4: تحديد المعدل في الطبقة المجانية
المشكلة: الأنفاق المجانية لها قيود على الاتصال (ngrok: 40/دقيقة).
الحلول:
- طلبات الاختبار المجمعة في Apidog بدلاً من الاختبارات الفردية السريعة
- استخدم أنفاقًا متعددة لخدمات مختلفة
- الترقية إلى الطبقة المدفوعة إذا كان الاختبار مكثفًا
- التبديل إلى خدمة غير محدودة مثل Cloudflare Tunnel أو NPort
المشكلة 5: ينقطع النفق بشكل متكرر
المشكلة: عدم استقرار الشبكة يتسبب في انقطاع النفق.
الحل:
استخدم systemd/pm2 لإعادة التشغيل التلقائي:
# إنشاء خدمة systemd
sudo nano /etc/systemd/system/ngrok.service
[Unit]
Description=ngrok tunnel
After=network.target
[Service]
Type=simple
User=youruser
WorkingDirectory=/home/youruser
ExecStart=/usr/local/bin/ngrok http 3000
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
sudo systemctl enable ngrok
sudo systemctl start ngrok
المشكلة 6: لا يمكن الوصول إلى النفق من شبكة معينة
المشكلة: جدران الحماية للشركات أو الشبكات المقيدة تحظر حركة مرور النفق.
الحلول:
- استخدم Cloudflare Tunnel (نادرًا ما يتم حظره)
- غيّر منطقة النفق لتقترب منك:
ngrok http 3000 --region eu
- استخدم Tailscale لشبكة خاصة بدلاً من النفق العام
الأنماط المتقدمة
النمط 1: نفق متعدد المنافذ
كشف خدمات متعددة في وقت واحد:
# الطرفية 1: خادم API
ngrok http 3000
# الطرفية 2: خادم تطوير الواجهة الأمامية
ngrok http 3001
# الطرفية 3: عامل الويب هوك
ngrok http 3002
أو استخدم ملف تكوين ngrok:
# ~/.ngrok2/ngrok.yml
tunnels:
api:
proto: http
addr: 3000
frontend:
proto: http
addr: 3001
worker:
proto: http
addr: 3002
ngrok start --all
النمط 2: نفق + Docker Compose
# docker-compose.yml
version: '3'
services:
api:
build: .
ports:
- "3000:3000"
ngrok:
image: ngrok/ngrok:latest
command:
- "http"
- "api:3000"
environment:
NGROK_AUTHTOKEN: ${NGROK_AUTHTOKEN}
docker-compose up
النمط 3: حقن عنوان URL ديناميكي للنفق
تحديث تطبيقك تلقائيًا بعنوان URL الخاص بالنفق:
// start-tunnel.js
const ngrok = require('ngrok');
const fs = require('fs');
(async function() {
const url = await ngrok.connect(3000);
console.log(`Tunnel started: ${url}`);
// تحديث ملف .env
fs.appendFileSync('.env', `\nTUNNEL_URL=${url}\n`);
// تحديث webhook Stripe
await updateStripeWebhook(url);
})();
النمط 4: إعادة توجيه الطلبات إلى بيئات متعددة
اختبر نفس الويب هوك مقابل بيئات التطوير، الاختبار، والإنتاج:
// webhook-multiplexer.js
app.post('/webhook', async (req, res) => {
const environments = [
'http://localhost:3000',
'https://staging.api.com',
'https://api.yourapp.com'
];
// إعادة التوجيه إلى جميع البيئات
const results = await Promise.all(
environments.map(env =>
fetch(`${env}/webhook`, {
method: 'POST',
headers: req.headers,
body: JSON.stringify(req.body)
})
)
);
res.json({ forwarded: results.length });
});
الخاتمة
اختبار واجهات برمجة التطبيقات المحلية (localhost APIs) التي تتلقى رسائل الويب هوك أو الاستدعاءات لا يتطلب النشر إلى بيئة الاختبار لكل تغيير. تنشئ خدمات الأنفاق عناوين URL عامة مؤقتة تسمح للخدمات الخارجية بالوصول إلى بيئة التطوير الخاصة بك.
ابدأ بالطبقة المجانية لأي أداة. إذا أصبح اختبار الويب هوك جزءًا يوميًا من سير عملك، ففكر في الخطط المدفوعة للحصول على عناوين URL ثابتة وميزات إضافية. ولكن بالنسبة لمعظم المطورين، توفر خدمات الأنفاق المجانية، جنبًا إلى جنب مع إمكانيات اختبار واجهة برمجة التطبيقات في Apidog، كل ما يلزم لاختبار واجهات برمجة التطبيقات المحلية بفعالية.
