كيفية استخدام Heroku API: دليل التكامل الكامل (2026)

Ashley Innocent

Ashley Innocent

25 مارس 2026

كيفية استخدام Heroku API: دليل التكامل الكامل (2026)

Apidog للمؤسسات

نشر محلي

SSO & RBAC

متوافق مع SOC 2

استكشاف Apidog Enterprise

ملخص سريع

تُمكّن واجهة برمجة تطبيقات Heroku المطورين من أتمتة عمليات النشر، وإدارة التطبيقات، وتكوين الإضافات، وتوسيع نطاق البنية التحتية برمجياً. تستخدم الواجهة OAuth 2.0 ومصادقة قائمة على الرموز، ونقاط نهاية RESTful للتطبيقات، والدينو، وعمليات البناء، وخطوط الأنابيب، مع حدود معدل تبلغ 10,000 طلب في الساعة لكل حساب. يغطي هذا الدليل إعداد المصادقة، ونقاط النهاية الأساسية، وتكامل CI/CD، واستراتيجيات النشر للإنتاج.

مقدمة

تُشغل Heroku أكثر من 4 ملايين تطبيق في أكثر من 170 دولة. بالنسبة للمطورين الذين يقومون ببناء أتمتة النشر، أو خطوط أنابيب CI/CD، أو أدوات إدارة التطبيقات المتعددة، فإن تكامل Heroku API ليس اختيارياً - بل هو ضروري.

هنا تكمن الحقيقة: الفرق التي تدير أكثر من 10 تطبيقات Heroku تخسر 8-12 ساعة أسبوعياً في عمليات النشر اليدوية وتغييرات التكوين. يتيح تكامل Heroku API القوي أتمتة عمليات النشر، وتوسيع نطاق الدينو بناءً على حركة المرور، ومزامنة التكوين عبر البيئات المختلفة.

يشرح هذا الدليل عملية تكامل Heroku API بالكامل. ستتعلم مصادقة الرمز، وإدارة التطبيقات والدينو، وبناء خطوط الأنابيب، وتوفير الإضافات، واستكشاف أخطاء العمل وإصلاحها. بحلول النهاية، سيكون لديك تكامل Heroku جاهز للإنتاج.

💡
Apidog يبسط اختبار تكامل API. اختبر نقاط نهاية Heroku الخاصة بك، وتحقق من تدفقات المصادقة، وافحص استجابات API، واكتشف أخطاء التكوين وإصلاحها في مساحة عمل واحدة. استورد مواصفات API، وحاكي الاستجابات، وشارك سيناريوهات الاختبار مع فريقك.

ما هي واجهة برمجة تطبيقات Heroku؟

توفر Heroku واجهة برمجة تطبيقات منصة RESTful لإدارة التطبيقات والبنية التحتية على منصة Heroku. تتعامل الواجهة مع:

الميزات الرئيسية

الميزة الوصف
تصميم RESTful طرق HTTP قياسية مع استجابات JSON
مصادقة الرمز رمز حامل (Bearer token) مع دعم OAuth 2.0
طلبات النطاق ترقيم الصفحات لمجموعات النتائج الكبيرة
تحديد المعدل 10,000 طلب في الساعة لكل حساب
إنشاءات متطابقة (Idempotent Creates) سلوك إعادة محاولة آمن لعمليات الكتابة
ضغط Gzip ضغط الاستجابة لتوفير عرض النطاق الترددي

نظرة عامة على بنية API

تستخدم Heroku بنية REST API ذات إصدارات:

https://api.heroku.com/

تتبع API مواصفات JSON:API بأنماط موارد وعلاقات متسقة.

مقارنة إصدارات API

الإصدار الحالة المصادقة حالة الاستخدام
Platform API (v3) الحالي رمز حامل (Bearer Token) جميع عمليات التكامل الجديدة
GitHub Integration الحالي OAuth 2.0 التطبيقات المتصلة بـ GitHub
Container Registry الحالي مصادقة Docker نشر الحاويات

البدء: إعداد المصادقة

الخطوة 1: إنشاء حساب Heroku الخاص بك

قبل الوصول إلى API، تحتاج إلى حساب Heroku:

لقطة شاشة لصفحة التسجيل في Heroku
  1. زر موقع Heroku الإلكتروني
  2. انقر على Sign Up (التسجيل) وأنشئ حساباً
  3. تحقق من عنوان بريدك الإلكتروني
  4. أكمل إعداد الحساب

الخطوة 2: تثبيت Heroku CLI

يساعدك CLI في إنشاء رموز API واختبار الأوامر:

# macOS
brew tap heroku/brew && brew install heroku

# Windows
npm install -g heroku

# Linux
curl https://cli-assets.heroku.com/install.sh | sh

الخطوة 3: إنشاء رمز API

المصادقة باستخدام Heroku CLI:

# تسجيل الدخول إلى Heroku
heroku login

# هذا يفتح متصفحاً للمصادقة
# بعد تسجيل الدخول، يتم تخزين الرمز الخاص بك محلياً

استرداد رمز API الخاص بك:

# عرض رمز المصادقة الحالي الخاص بك
heroku authorizations:create --short-lived

# أو إنشاء رمز طويل الأمد (لـ CI/CD)
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"

ملاحظة أمنية: قم بتخزين الرموز في متغيرات البيئة، ولا تضعها أبداً في الكود:

# ملف .env
HEROKU_API_KEY="your_api_key_here"
HEROKU_APP_NAME="your-app-name"

الخطوة 4: فهم مصادقة الرمز

تستخدم Heroku مصادقة رمز حامل (Bearer token):

Authorization: Bearer {api_key}
Accept: application/vnd.heroku+json; version=3

يتطلب كل طلب API هذه الرؤوس.

الخطوة 5: إجراء أول استدعاء API الخاص بك

اختبر مصادقتك:

curl -n https://api.heroku.com/account \
  -H "Accept: application/vnd.heroku+json; version=3" \
  -H "Authorization: Bearer $HEROKU_API_KEY"

الاستجابة المتوقعة:

{
  "id": "user-id-here",
  "email": "developer@example.com",
  "name": "Developer Name",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2026-03-20T14:22:00Z"
}

الخطوة 6: تطبيق المصادقة في الكود

إنشاء عميل API قابل لإعادة الاستخدام:

const HEROKU_API_KEY = process.env.HEROKU_API_KEY;
const HEROKU_BASE_URL = 'https://api.heroku.com';

const herokuRequest = async (endpoint, options = {}) => {
  const response = await fetch(`${HEROKU_BASE_URL}${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${HEROKU_API_KEY}`,
      'Accept': 'application/vnd.heroku+json; version=3',
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Heroku API Error: ${error.message}`);
  }

  return response.json();
};

// الاستخدام
const account = await herokuRequest('/account');
console.log(`تم تسجيل الدخول باسم: ${account.email}`);

إدارة التطبيقات

إنشاء تطبيق جديد

إنشاء تطبيق Heroku برمجياً:

const createApp = async (appName, region = 'us') => {
  const response = await herokuRequest('/apps', {
    method: 'POST',
    body: JSON.stringify({
      name: appName,
      region: region
    })
  });

  return response;
};

// الاستخدام
const app = await createApp('my-awesome-app-2026');
console.log(`تم إنشاء التطبيق: ${app.name}`);
console.log(`عنوان Git: ${app.git_url}`);
console.log(`عنوان الويب: ${app.web_url}`);

استجابة التطبيق المتوقعة

{
  "id": "app-uuid-here",
  "name": "my-awesome-app-2026",
  "region": { "name": "us" },
  "created_at": "2026-03-25T10:00:00Z",
  "updated_at": "2026-03-25T10:00:00Z",
  "git_url": "https://git.heroku.com/my-awesome-app-2026.git",
  "web_url": "https://my-awesome-app-2026.herokuapp.com",
  "owner": { "email": "developer@example.com" },
  "build_stack": { "name": "heroku-24" }
}

سرد تطبيقاتك

جلب جميع التطبيقات في حسابك:

const listApps = async (limit = 50) => {
  const response = await herokuRequest(`/apps?limit=${limit}`);
  return response;
};

// الاستخدام
const apps = await listApps();
apps.forEach(app => {
  console.log(`${app.name} - ${app.web_url}`);
});

الحصول على تفاصيل التطبيق

استرداد معلومات التطبيق المفصلة:

const getApp = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}`);
  return response;
};

// الاستخدام
const app = await getApp('my-awesome-app-2026');
console.log(`المكدس: ${app.build_stack.name}`);
console.log(`المنطقة: ${app.region.name}`);

تحديث تكوين التطبيق

تعديل إعدادات التطبيق:

const updateApp = async (appName, updates) => {
  const response = await herokuRequest(`/apps/${appName}`, {
    method: 'PATCH',
    body: JSON.stringify(updates)
  });

  return response;
};

// الاستخدام - تغيير اسم التطبيق
const updated = await updateApp('old-app-name', {
  name: 'new-app-name'
});

حذف تطبيق

إزالة تطبيق من حسابك:

const deleteApp = async (appName) => {
  await herokuRequest(`/apps/${appName}`, {
    method: 'DELETE'
  });

  console.log(`تم حذف التطبيق ${appName} بنجاح`);
};

إدارة الدينو

توسيع نطاق الدينو

توسيع نطاق تطبيقك لأعلى أو لأسفل:

const scaleDyno = async (appName, processType, quantity) => {
  const response = await herokuRequest(`/apps/${appName}/formation/${processType}`, {
    method: 'PATCH',
    body: JSON.stringify({
      quantity: quantity
    })
  });

  return response;
};

// الاستخدام - توسيع نطاق دينو الويب إلى 3
const formation = await scaleDyno('my-app', 'web', 3);
console.log(`تم التوسيع إلى ${formation.quantity} من ${processType} دينو`);

الحصول على تكوين الدينو

عرض تكوين الدينو الحالي:

const getFormation = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/formation`;

  const response = await herokuRequest(endpoint);
  return response;
};

// الاستخدام
const formation = await getFormation('my-app');
formation.forEach(proc => {
  console.log(`${proc.type}: ${proc.quantity} دينو (@ ${proc.size})`);
});

أحجام الدينو المتاحة

نوع الدينو حالة الاستخدام التكلفة/الشهر
eco مشاريع الهواة، العروض التوضيحية $5
basic تطبيقات إنتاج صغيرة $7
standard-1x أعباء العمل القياسية $25
standard-2x تطبيقات عالية الأداء $50
performance تطبيقات حيوية للإنتاج $250+
private عزل الشركات مخصص

إعادة تشغيل الدينو

إعادة تشغيل جميع الدينو لتطبيق ما:

const restartDynos = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/dynos`;

  await herokuRequest(endpoint, {
    method: 'DELETE'
  });

  console.log(`تمت إعادة تشغيل الدينو لتطبيق ${appName}`);
};

تشغيل دينو لمرة واحدة

تنفيذ الأوامر في دينو معزولة:

const runCommand = async (appName, command) => {
  const response = await herokuRequest(`/apps/${appName}/dynos`, {
    method: 'POST',
    body: JSON.stringify({
      command: command,
      size: 'standard-1x'
    })
  });

  return response;
};

// الاستخدام - تشغيل ترحيل قاعدة البيانات
const dyno = await runCommand('my-app', 'npm run migrate');
console.log(`بدأ الدينو: ${dyno.id}`);

متغيرات التكوين

الحصول على متغيرات التكوين

استرداد متغيرات البيئة:

const getConfigVars = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`);
  return response;
};

// الاستخدام
const config = await getConfigVars('my-app');
console.log(`DATABASE_URL: ${config.DATABASE_URL}`);
console.log(`NODE_ENV: ${config.NODE_ENV}`);

تعيين متغيرات التكوين

تحديث متغيرات البيئة:

const setConfigVars = async (appName, variables) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`, {
    method: 'PATCH',
    body: JSON.stringify(variables)
  });

  return response;
};

// الاستخدام
const updated = await setConfigVars('my-app', {
  NODE_ENV: 'production',
  API_SECRET: 'your-secret-key',
  LOG_LEVEL: 'info'
});

أفضل الممارسات لمتغيرات التكوين

  1. لا تقم أبداً بتخزين الأسرار في الكود - استخدم متغيرات البيئة لجميع البيانات الحساسة
  2. استخدم تكوينات منفصلة لكل بيئة - متغيرات مختلفة للمرحلة التجريبية مقابل الإنتاج
  3. قم بتدوير الأسرار بانتظام - قم بتحديث مفاتيح API وكلمات المرور ربع سنوياً
  4. قم ببادئة المتغيرات ذات الصلة - STRIPE_SECRET_KEY، STRIPE_WEBHOOK_SECRET

إدارة البناء والإصدار

إنشاء بناء

نشر الكود عبر API:

const createBuild = async (appName, sourceBlobUrl) => {
  const response = await herokuRequest(`/apps/${appName}/builds`, {
    method: 'POST',
    body: JSON.stringify({
      source_blob: {
        url: sourceBlobUrl
      }
    })
  });

  return response;
};

// الاستخدام
const build = await createBuild('my-app', 'https://storage.example.com/source.tar.gz');
console.log(`بدأ البناء: ${build.id}`);
console.log(`الحالة: ${build.status}`);

الحصول على حالة البناء

التحقق من تقدم البناء:

const getBuild = async (appName, buildId) => {
  const response = await herokuRequest(`/apps/${appName}/builds/${buildId}`);
  return response;
};

// انتظر حتى الاكتمال
const checkBuildStatus = async (appName, buildId, maxAttempts = 30) => {
  for (let i = 0; i < maxAttempts; i++) {
    const build = await getBuild(appName, buildId);

    if (build.status === 'succeeded') {
      console.log('تم البناء بنجاح!');
      return build;
    } else if (build.status === 'failed') {
      throw new Error(`فشل البناء: ${build.output}`);
    }

    console.log(`البناء قيد التقدم... المحاولة ${i + 1}`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  throw new Error('انتهت مهلة البناء');
};

سرد الإصدارات

عرض سجل الإصدارات:

const listReleases = async (appName, limit = 10) => {
  const response = await herokuRequest(`/apps/${appName}/releases?limit=${limit}`);
  return response;
};

// الاستخدام
const releases = await listReleases('my-app');
releases.forEach(release => {
  console.log(`الإصدار v${release.version} - ${release.description} - ${release.created_at}`);
});

العودة إلى الإصدار السابق

العودة إلى إصدار سابق:

const rollback = async (appName, releaseId) => {
  const response = await herokuRequest(`/apps/${appName}/releases`, {
    method: 'POST',
    body: JSON.stringify({
      rollback: releaseId
    })
  });

  return response;
};

// الاستخدام - العودة إلى الإصدار 42
const rollbackRelease = await rollback('my-app', 42);
console.log(`تمت العودة إلى الإصدار v${rollbackRelease.version}`);

إدارة خطوط الأنابيب

إنشاء خط أنابيب

إعداد خطوط أنابيب CI/CD:

const createPipeline = async (pipelineName) => {
  const response = await herokuRequest('/pipelines', {
    method: 'POST',
    body: JSON.stringify({
      name: pipelineName
    })
  });

  return response;
};

// الاستخدام
const pipeline = await createPipeline('my-app-pipeline');
console.log(`تم إنشاء خط الأنابيب: ${pipeline.id}`);

إضافة تطبيقات إلى خط الأنابيب

ربط التطبيقات بمراحل خط الأنابيب:

const addAppToPipeline = async (pipelineId, appName, stage) => {
  const response = await herokuRequest('/pipeline-couplings', {
    method: 'POST',
    body: JSON.stringify({
      pipeline: pipelineId,
      app: appName,
      stage: stage // 'development', 'staging', 'production'
    })
  });

  return response;
};

// الاستخدام
await addAppToPipeline(pipelineId, 'my-app-dev', 'development');
await addAppToPipeline(pipelineId, 'my-app-staging', 'staging');
await addAppToPipeline(pipelineId, 'my-app-prod', 'production');

ترقية السلاغ إلى المرحلة التالية

نقل الكود عبر خط الأنابيب:

const promoteSlug = async (slugId, toApp) => {
  await herokuRequest('/promotions', {
    method: 'POST',
    body: JSON.stringify({
      from: toApp, // تطبيق المصدر
      to: toApp,   // التطبيق الهدف (المرحلة التالية)
      slug: slugId
    })
  });

  console.log(`تمت ترقية السلاغ ${slugId} إلى ${toApp}`);
};

إدارة الإضافات

توفير الإضافات

تثبيت إضافات Heroku:

const provisionAddon = async (appName, addonPlan, config = {}) => {
  const response = await herokuRequest('/addon-attachments', {
    method: 'POST',
    body: JSON.stringify({
      app: appName,
      plan: addonPlan,
      config: config
    })
  });

  return response;
};

// الاستخدام - توفير PostgreSQL
const db = await provisionAddon('my-app', 'heroku-postgresql:mini', {});
console.log(`تم توفير قاعدة البيانات: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);

الإضافات الشائعة

الإضافة الخطة السعر المبدئي حالة الاستخدام
heroku-postgresql mini $5/شهر قاعدة بيانات الإنتاج
heroku-redis mini $5/شهر التخزين المؤقت، الجلسات
papertrail choklad $7/شهر تجميع السجلات
sentry developer مجاني تتبع الأخطاء
mailgun sandbox مجاني تسليم البريد الإلكتروني
newrelic lite مجاني مراقبة التطبيق

سرد الإضافات

عرض الإضافات المثبتة:

const listAddons = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/addons`);
  return response;
};

// الاستخدام
const addons = await listAddons('my-app');
addons.forEach(addon => {
  console.log(`${addon.plan.name} - $${addon.pricing.plan.price} - ${addon.state}`);
});

إزالة الإضافات

إلغاء تثبيت الإضافات:

const removeAddon = async (appName, addonId) => {
  await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
    method: 'DELETE'
  });

  console.log(`تمت إزالة الإضافة ${addonId} من ${appName}`);
};

إدارة النطاقات وشهادات SSL

إضافة نطاقات مخصصة

تكوين نطاقات مخصصة:

const addDomain = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains`, {
    method: 'POST',
    body: JSON.stringify({
      hostname: domainName
    })
  });

  return response;
};

// الاستخدام
const domain = await addDomain('my-app', 'api.example.com');
console.log(`هدف CNAME: ${domain.cname}`);

تكوين شهادات SSL

إضافة SSL إلى النطاقات المخصصة:

const addSslCertificate = async (appName, domainId, certificateChain, privateKey) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainId}/ssl_endpoint`, {
    method: 'PATCH',
    body: JSON.stringify({
      ssl_cert: {
        cert_chain: certificateChain,
        private_key: privateKey
      }
    })
  });

  return response;
};

SSL تلقائي باستخدام ACM

تمكين إدارة الشهادات التلقائية (ACM):

const enableACM = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainName}/sni_endpoint`, {
    method: 'POST',
    body: JSON.stringify({
      kind: 'acm'
    })
  });

  return response;
};

تحديد المعدل والحصص

فهم حدود المعدل

تفرض Heroku حدوداً على المعدل لحماية استقرار API:

تجاوز الحدود يؤدي إلى استجابات HTTP 429 (طلبات كثيرة جداً).

تطبيق معالجة حدود المعدل

استخدم التراجع الأسي لإعادة المحاولة:

const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await herokuRequest(endpoint, options);

      // تحقق من رؤوس حدود المعدل
      const remaining = response.headers.get('RateLimit-Remaining');
      const resetTime = response.headers.get('RateLimit-Reset');

      if (remaining < 100) {
        console.warn(`الحد المتبقي المنخفض: ${remaining}، يتم إعادة تعيينه في ${resetTime}`);
      }

      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        console.log(`تم تجاوز الحد. إعادة المحاولة خلال ${delay} مللي ثانية...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};

رؤوس حدود المعدل

تتضمن Heroku هذه الرؤوس في كل استجابة:

الرأس الوصف
RateLimit-Limit الحد الأقصى للطلبات في الساعة
RateLimit-Remaining الطلبات المتبقية في النافذة
RateLimit-Reset طابع زمني Unix عند إعادة تعيين النافذة

استكشاف الأخطاء الشائعة وإصلاحها

المشكلة: فشل المصادقة برمز 401

الأعراض: الحصول على أخطاء "بيانات اعتماد غير صالحة".

الحلول:

  1. تحقق من صحة مفتاح API: heroku authorizations
  2. تأكد من أن الرمز لم تنته صلاحيته (الرموز طويلة الأمد تستمر لمدة عام واحد)
  3. تحقق من وجود مسافات بيضاء إضافية في متغير البيئة
  4. أعد إنشاء الرمز إذا لزم الأمر: heroku authorizations:create

المشكلة: اسم التطبيق محجوز بالفعل

الأعراض: الحصول على خطأ "الاسم محجوز بالفعل".

الحلول:

  1. استخدم أسماء فريدة عالمياً - قم بتضمين اسم الفريق أو لاحقة عشوائية
  2. أنشئ أسماء تستند إلى UUID: app-${Date.now()}
  3. استخدم بادئات مساحة الاسم: teamname-appname-env
const generateUniqueAppName = (baseName) => {
  const timestamp = Date.now().toString(36);
  const random = Math.random().toString(36).substring(2, 6);
  return `${baseName}-${timestamp}-${random}`;
};

المشكلة: فشل تكوين الدينو

الأعراض: عمليات التوسيع تعيد أخطاء.

الحلول:

  1. تحقق من أن نوع العملية موجود في ملف Procfile
  2. تأكد من أن الحساب لديه حصة دينو متاحة
  3. تأكد من أن التطبيق ليس معلقاً
  4. راجع استخدام ساعات الدينو: heroku ps --app=my-app

المشكلة: فشل البناء بانتهاء المهلة

الأعراض: عمليات البناء تتوقف أو تنتهي مهلتها بعد 30 دقيقة.

الحلول:

  1. تحسين اختيار حزمة البناء للغتك
  2. تخزين التبعيات مؤقتاً بشكل صحيح
  3. تقسيم عمليات البناء الكبيرة إلى عمليات نشر أصغر
  4. استخدم سلاغ مُبنية مسبقاً لنشر أسرع

المشكلة: تم تجاوز حد المعدل

الأعراض: تلقي استجابات HTTP 429.

الحلول:

  1. تطبيق قائمة انتظار الطلبات
  2. استخدم التراجع الأسي لإعادة المحاولة
  3. تجميع الطلبات حيثما أمكن ذلك
  4. مراقبة رؤوس حدود المعدل بشكل استباقي
// محدد معدل بسيط
class HerokuRateLimiter {
  constructor(requestsPerMinute = 150) {
    this.queue = [];
    this.interval = 60000 / requestsPerMinute;
    this.processing = false;
  }

  async add(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject });
      this.process();
    });
  }

  async process() {
    if (this.processing || this.queue.length === 0) return;

    this.processing = true;

    while (this.queue.length > 0) {
      const { requestFn, resolve, reject } = this.queue.shift();

      try {
        const result = await requestFn();
        resolve(result);
      } catch (error) {
        reject(error);
      }

      if (this.queue.length > 0) {
        await new Promise(r => setTimeout(r, this.interval));
      }
    }

    this.processing = false;
  }
}

قائمة التحقق لنشر الإنتاج

قبل النشر المباشر:

المراقبة والتنبيه

تتبع هذه المقاييس:

const metrics = {
  apiCalls: {
    total: 0,
    successful: 0,
    failed: 0,
    rateLimited: 0
  },
  dynoHours: {
    used: 0,
    quota: 1000
  },
  deployments: {
    successful: 0,
    failed: 0,
    avg_duration: 0
  }
};

// تنبيه عند ارتفاع معدل الفشل
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;

if (failureRate > 0.05) {
  sendAlert('معدل فشل Heroku API أعلى من 5%');
}

// تنبيه عند استخدام ساعات الدينو
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
  sendAlert('استخدام ساعات الدينو أعلى من 80%');
}

حالات الاستخدام في العالم الحقيقي

خط أنابيب CI/CD مؤتمت

فريق SaaS يقوم بأتمتة عمليات النشر من GitHub:

تدفق التنفيذ:

  1. دفع GitHub يشغل سير العمل
  2. تُشغل الاختبارات في CI
  3. Heroku API ينشئ بناءً من كائن المصدر (source blob)
  4. الترقية عبر مرحلة التجريب إلى الإنتاج
  5. إبلاغ الفريق عند النجاح/الفشل

إدارة بيئات متعددة

شركة استشارية تدير أكثر من 50 تطبيقاً للعملاء:

نقاط التكامل الرئيسية:

التوسيع التلقائي بناءً على حركة المرور

منصة تجارة إلكترونية تتعامل مع ذروات حركة المرور:

منطق التوسيع التلقائي:

الخلاصة

توفر واجهة برمجة تطبيقات Heroku وصولاً شاملاً إلى وظائف المنصة. النقاط الرئيسية المستفادة:

زر التنزيل

قسم الأسئلة الشائعة

ما هو استخدام واجهة برمجة تطبيقات Heroku؟

تُستخدم واجهة برمجة تطبيقات Heroku لإدارة التطبيقات، الدينو، الإضافات، والبنية التحتية برمجياً. تشمل حالات الاستخدام الشائعة أتمتة CI/CD، وأدوات إدارة التطبيقات المتعددة، وأنظمة التوسيع التلقائي، ولوحات معلومات مراقبة البنية التحتية.

كيف أحصل على مفتاح API لـ Heroku؟

قم بتثبيت Heroku CLI، ثم قم بتشغيل heroku login، ثم أنشئ ترخيصاً باستخدام heroku authorizations:create. قم بتخزين الرمز المسترد بأمان في متغيرات البيئة.

هل واجهة برمجة تطبيقات Heroku مجانية للاستخدام؟

نعم، واجهة برمجة تطبيقات Heroku مجانية. ومع ذلك، تدفع مقابل الموارد التي توفرها (الدينو، الإضافات، إلخ). حدود معدل API هي 10,000 طلب في الساعة لكل حساب.

ما هي طريقة المصادقة التي تستخدمها واجهة برمجة تطبيقات Heroku؟

تستخدم Heroku مصادقة الرمز الحامل (Bearer token). قم بتضمين رأس Authorization: Bearer {api_key} في كل طلب. يمكن أن تكون الرموز قصيرة الأمد (ساعة واحدة) أو طويلة الأمد (تصل إلى سنة واحدة).

كيف أتعامل مع حدود معدل Heroku API؟

راقب رأس RateLimit-Remaining وقم بتطبيق قائمة انتظار الطلبات. استخدم التراجع الأسي عند تلقي استجابات HTTP 429. حافظ على معدل أقل من 150 طلباً في الدقيقة لتشغيل آمن.

هل يمكنني النشر بدون Git؟

نعم. استخدم Builds API للنشر من عنوان URL لكائن مصدر (source blob). قم بتحميل الكود الخاص بك إلى التخزين السحابي (S3, GCS) وارجع إلى عنوان URL في طلب البناء الخاص بك.

كيف أقوم بأتمتة عمليات النشر؟

استخدم Pipeline API لإعداد CI/CD. قم بإنشاء عمليات بناء، وترقية السلاغات عبر المراحل، ودمجها مع GitHub أو أنظمة CI المخصصة.

ما الفرق بين الإصدار (Release) والبناء (Build)؟

البناء (Build) يقوم بتحويل الكود المصدري الخاص بك إلى سلاغ (slug). الإصدار (Release) يجمع السلاغ مع متغيرات التكوين لإنشاء نسخة قابلة للنشر من تطبيقك.

كيف أقوم بالعودة إلى إصدار سابق بعد نشر فاشل؟

استخدم Releases API لسرد الإصدارات الأخيرة، ثم قم بإرسال طلب POST إلى /releases مع rollback: <release_id>. ستنشئ Heroku إصداراً جديداً بالنسخة السابقة.

هل يمكنني إدارة حسابات Heroku متعددة؟

نعم. استخدم رموز API منفصلة لكل حساب وقم بالتبديل بينها عن طريق تغيير متغير البيئة HEROKU_API_KEY.

ممارسة تصميم API في Apidog

اكتشف طريقة أسهل لبناء واستخدام واجهات برمجة التطبيقات